Variables的作用
- 隐藏一些密码之类的敏感信息
- 用于可能会变更的信息,比如,前面创建EC2的时候,AMI的ID就会根据region不同而发生变化
- 使得代码可被重用
使用变量的三个步骤
- 通过不同方式定义变量值:在terraform.tfvars文件中/环境变量/命令行/交互方式
- 在真正的.tf文件中声明对应的变量(可以声明默认值)
- 在后续通过变量名获取其值
通过交互/命令行方式获取变量值
注意:以下这两种方式在实际项目中不会使用。
交互方式
variable "cidr_block" {
description = "cidr block for the subnet"
}
resource "aws_subnet" "subnet1" {
vpc_id = xxxx
cidr_block = var.cidr_block
}
这样在运行terraform apply的时候,terraform就会弹出一个窗口,要求输入变量值。
命令行方式
如果不想使用交互方式,也可以在命令行直接提供参数:
terraform apply -var "cidr_block=10.0.1.0/24"
或者:
export TF_VAR_cidr_block="10.0.1.0/24"
terraform apply
指定默认值
variable "cidr_block" {
description = "cidr block for the subnet"
default = "10.0.22.0/24"
}
有了默认值之后,这个变量就变为可选了。如果不提供该变量值,Terraform就会从默认值中获取。
声明类型
variable "cidr_block" {
description = "cidr block for the subnet"
type = string
}
- string
- boolean
- number
- list
- map
通过环境变量设置
Provider认可的默认环境变量
针对不同的provider,它们会自动读取一些环境变量,
比如AWS支持如下的默认环境变量:
- AWS_ACCESS_KEY_ID
- AWS_SECRET_ACCESS_KEY
- AWS_REGION
Jenkins支持如下的默认环境变量:
- JENKINS_URL
- JENKINS_USERNAME
- JENKINS_PASSWORD
- JENKINS_CA_CERT
自定义环境变量
对于自定义的环境变量,可以这样为其赋值:
export TF_VAR_filename="/tmp/demo.txt"
注意,上面的环境变量必须以 TF_VAR_ 作为前缀。
通过配置文件使用Variables
terraform.tfvars
这个文件非常特殊,文件名是固定的,terraform会自动从中读取相关信息。 除了这个文件之外,还有这些文件也会被terraform自动读取:
- terraform.tfvars.json
- *.auto.tfvars
- *.auto.tfvars.json
首先确认在 .gitignore 中添加 terraform.tfvars。
然后更新terraform.tfvars的内容:
AWS_ACCESS_KEY = "XXXXXXXXXXXX"
AWS_SECRET_KEY = "XXXXXXXXXXXX"
AWS_region = "eu-west-1"
之后就可以直接使用这些变量了:
variable "AWS_ACCESS_KEY" {
description = "AWS_ACCESS_KEY"
type = string
}
variable "AWS_SECRET_KEY" {
description = "AWS_SECRET_KEY"
type = string
}
variable "AWS_REGION" {
description = "AWS_REGION"
type = string
}
provider "aws" {
access_key = "${var.AWS_ACCESS_KEY}"
secret_key = "${var.AWS_SECRET_KEY}"
region = "${var.AWS_REGION}"
}
使用不同类型的变量
在terraform.tfvars:
subnet_prefix = [{cidr_block = "10.0.1.0/24", name = "prod_subnet"}, {cidr_block = "10.0.2.0/24", name = "dev_subnet"}]
在后续使用中,可以:
var.subnet_prefix[0].cidr_block
var.subnet_prefix[0].name
在其他文件中定义变量
当然,也可以在其他文件中定义变量,比如在demo.tfvars中:
AWS_ACCESS_KEY = "XXXXXXXXXXXX"
AWS_SECRET_KEY = "XXXXXXXXXXXX"
AWS_region = "eu-west-1"
在运行apply命令时需要指明读取变量的文件名:
terraform apply -var-file demo.tfvars
locals
在Terraform中,还可以定义一个“局部变量/locals”,这种变量只能在当前模块中使用。而variable则是“全局”性的。
locals {
resource_group = "lcoding-grp"
location = "UK South"
}