Terraform - 变量
Variable变量
官方文档:
https://developer.hashicorp.com/terraform/language/values
Terraform 运行时会读取工作目录中所有的 *.tf, *.tfvars文件,所有变量不应在单个文件中去,应分类在不同的文件中。
- 通过variables.tf文件集中管理变量
- 通过variable关键字声明变量的名称、类型、默认值等
- 在同一个模块的所有变量中必须是唯一的
- 可以从环境变量或者文本文件中读取
- 在系统环境变量中export敏感变量的值(以TF_VAR_的名称开头)
- 在terraform.tfvars文件中定义变量的值,Terraform默认读取这个文件
声明变量的可选参数
- default 变量的默认值
- type 变量的类型
- description 变量的描述信息
- validation 定义变量验证规则
- sensitive 限制变量在终端中显示,如果为true就隐藏显示
- nullable 变量是否可为空
变量的常见类型
- any
- string、number、bool
- list(
)、set( )、map( ) - object((ATTR_NAME = ATTR_TYPE, ...))、tuple([
,...])
例如:使用map类型变量定义DNS域名,在variables.tf中声明变量map类型,在terraform.tfvars中定义变量的值,在resource中通过map数据类型的索引来调用对应值
变量的使用方式
在变量声明后,可以使用 var.VAR_NAME 的方式引用;VAR_NAME是在variables.tf定义的名称。
变量的优先级如下:
1.环境变量,Terraform会读取TF_VAR_name格式的环境变量
2.terraform.tfvars | terraform.tfvars.json
3.*.auto.tfvars | *.auto.tfvars.json
4.命令行下, -var选项传递变量, -var-file选项加载一个变量文件
Terraform会自动加载当前目录下扩展名为.tfvars和.auto.tfvars的文件来填充定义的变量。
如果以其他格式存放,可以使用-var-file选项来手动指定需要加载的HCL格式或JSON格式的变量值文件。
terraform apply -var="region=cn-beijing"
terraform apply -var='env_list=["dev", "test"]' -var="region=cn-beijing"
terraform apply -var-file="dev.tfvars"
export TF_VAR_region='cn-beijing'
export TF_VAR_env_list='["dev", "test"]"
示例:Terraform会读取TF_VAR_access_key的环境变量,并用于填充access_key变量。
本地变量
- 局部值有助于避免在配置中多次重复相同的值或表达式
- 多用于调试和测试
- 通过locals关键字进行定义,通过local.VAR_NAME调用
交互输入
如果没有对变量赋值,在执行命令时,会出现交互界面,让用户手动输入变量值,来给变量赋值。
Output输出
- 可以打印已定义的变量,也可以公开信息以供其他 Terraform 配置使用
- 输出值类似于编程语言中的返回值。
Output可选参数
- description 变量的描述信息
- sensitive 限制变量在UI中显示
- depends_on 依赖关系
示例
文件 variables.tf
variable "env_list" {
type = list(string)
description = "define environment name"
default = ["dev"]
}
variable "dns_record" {
type = map(string)
description = "define dns name"
}
variable "ecs_info" {
type = object({
ecs_image = string,
ecs_name = string
})
description = "define ecs info"
}
locals {
test_var1 = "local test1"
test_var2 = "local test2"
}
文件 terraform.tfvars
env_list = ["dev", "test", "pre", "prod"]
dns_record = {
"dev" = "dev.sample.site",
"test" = "test.sample.site",
"pre" = "pre.sample.site",
"prod" = "prod.sample.site"
}
ecs_info = {
ecs_image = "centos_7_8"
ecs_name = "my_sample_ecs"
}
文件output.tf
output "name" {
value = "this is a test"
}
output "my_env" {
value = var.env_list[2]
sensitive = true
description = "env name"
}
output "my_dns" {
value = var.dns_record["pre"]
}
output "my_ecs" {
value = var.ecs_info["ecs_name"]
}
output "local_var" {
value = local.test_var1
}
output
行动是绝望的解药!
欢迎转载和引用,但请在明显处保留原文链接和原作者信息!
本博客内容多为个人工作与学习的记录,少数内容来自于网络并略有修改,已尽力标明原文链接和转载说明。如有冒犯,即刻删除!
以所舍,求所得,有所获,方所成。