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

posted @ 2024-08-22 23:35  Anliven  阅读(18)  评论(0编辑  收藏  举报