1 变量定义变量
Terraform 可以将变量的内容写到一个单独的文件中,是main文件引用此文件的定义的变量的值,便于使用阅读。
上接 Terraform 创建第一个云基础设施 (3) 创建云基础设施的Terraform文件的基础上进行修改。
$ cat variables.tf
variable "region" { // 变量名 region,不可用重复。花括号里面是参数
type = string // 输入变量的类型
default = "us-west-2" // 变量的默认值
description = "AWS region" // 变量的描述
}
variable "amis" {
type = map
default = {
us-west-2 = "ami-002829755fa238bfa"
}
description = "AWS ID"
}
variable "instance_type" {
type = string
default = "t2.micro"
description = "EC2 instance type"
}
variable "public_key" {
type = string
default = "id_rsa.pub"
description = "SSH public key"
}
variable "security_group" {
type = string
description = "security group ID"
}
2 变量引用方法
引用变量
引用变量,只需要在变量名前面加上 var.
即可引用自定义的变量。
如引用 region 的变量:
provider "aws" {
region = "us-west-2" # 原始的写法
}
provider "aws" {
region = var.region # 引用变量
}
内置函数
其他内置函数,查询官方文档。
lookup:允许从map中获取值.
# 变量定义
variable "amis" {
type = map
default = {
us-west-2 = "ami-002829755fa238bfa"
}
description = "AWS ID"
}
# 变量引用
resource "aws_instance" "web" {
ami = lookup(var.amis, var.region) # var.region = "us-west-2",ami的值对应变量中的 "ami-002829755fa238bfa"
...
}
file:读取给定文件的内容,并返回字符串。
# 变量定义
variable "public_key" {
type = string
default = "id_rsa.pub"
description = "SSH public key"
}
# 变量引用
resource "aws_key_pair" "ssh" {
key_name = "admin"
public_key = file(var.public_key) # 会读取 "id_rsa.pub" 文件中的值,需要在当前目录下创建此文件。
}
3 设置输入变量
执行 plan 或者 apply 的时候,如果没有给变量设置默认值,就会提示我们输入变量的内容。
# 变量定义
variable "security_group" { # 没有设置默认值
type = string
description = "security group ID"
}
# 变量引用
resource "aws_security_group_rule" "ssh" {
type = "ingress"
from_port = 22
to_port = 22
protocol = "tcp"
cidr_blocks = ["0.0.0.0/0"]
security_group_id = var.security_group # 变量引用
}
方法一:手动输入变量
% terraform plan
var.security_group
security group ID
Enter a value: sg-572b3b6c # 手动输入防火墙id 才会继续执行。
方法二:命令行输入变量
terraform plan -var security_group=sg-572b3b6c
方法三:通过文件传递变量
cat > terraform.tfvars << EOF
security_group = "sg-572b3b6c"
EOF
如果变量定义文件名不是 terraform.tfvars
可以使用 -var-file
来指定文件名。
方法四:通过环境变量的方式
环境变量必须使用 TF_VAR_
开头。
export TF_VAR_security_group=sg-572b3b6c
4 使用变量创建基础设施
改动如下:
# 创建密钥文件
cp ~/.ssh/id_rsa.pub .
# 创建安装 nginx 脚本文件
cat > setup_nginx.sh << EOF
#!/bin/bash
sudo yum install -y nginx
sudo nginx
EOF
# main文件新增user_data
resource "aws_instance" "web" {
ami = lookup(var.amis, var.region)
instance_type = var.instance_type
key_name = aws_key_pair.ssh.key_name
user_data = "setup_nginx.sh" # 创建 EC2 实例后,调用执行 "setup_nginx.sh" 脚本
tags = { # 将EC2 实例命名为 "nginx-web-server"
Name = "nginx-web-server"
}
}
# main文件防火墙新增80端口
resource "aws_security_group_rule" "web" {
type = "ingress"
from_port = 80
to_port = 80
protocol = "tcp"
cidr_blocks = ["0.0.0.0/0"]
security_group_id = var.security_group
}
更新基础设施
terraform plan
terraform apply
nginx 已经安装了,说明shell脚本已经执行了。但是nginx服务没有启动,这里后续再解决。
提交代码
echo id_rsa.pub >> .gitignore
echo terraform.tfvars >> .gitignore
git add .
git commit -m "using variables"