输入变量即模块的输入参数,通过关键字"variable"进行声明。声明输入变量后,无需变更源代码即可灵活的修改配置。
按照Terraform的约定,输入变量通常在variables.tf
文件中声明。示例如下:
variable "vpc_id" { type = string description = "id of vpc" } variable "zone_id" { type = string default = "cn-beijing-a" }
输入变量的名称:
关键字"variable"后为输入变量的名称,该名称在同一模块中的所有变量之间必须唯一。变量的名称可以是除保留关键字以外的任何有效的标识符,保留关键字包括:
source version providers count for_each lifecycle depends_on locals
variable块中的参数:
type:变量的类型,默认为string。更多变量类型请参见参数类型。
复合类型的变量声明方式如下:
variable "security_group_ids" { type = list(string) default = ["sg-13f5gejti0pvk3n6nu503****"] } variable "volumes" { type = list(object({ volume_type = string size = number delete_with_instance = bool })) default = [{ volume_type = PTSSD size = 50 delete_with_instance = true }] }
description :变量的描述信息。
default:变量的默认值,存在默认值的变量为可选变量。
validation块:指定变量的自定义验证规则,仅在Terraform 0.13.0之后的版本支持,例如:
variable "ecs_instance_password" { type = string description = "The password for ecs user to log in." validation { condition = length(var.ecs_instance_password)>=8 error_message = "The password is too short." } }
其中,condition
是一个布尔表达式,您可以使用can
函数检测表达式是否会产生错误,例如:
variable "ecs_instance_name" { type = string description = "This name of ecs instance." validation { # regex(...) 如果匹配失败将返回错误信息error_message,错误信息应是一个完整的句子,以大写字母开头,以 "." 或者 "?" 结尾。 condition = can(regex("([a-zA-Z])", var.ecs_instance_name)) error_message = "Incorrect instance name. Please check whether it contains upper and lower case letters." } }
引用输入变量时,格式为:var.<变量名称>,仅支持在声明该变量的模块内引用。示例如下:
# variables.tf 文件中定义变量 variable "vpc_cidr" { type = string description = "the CIDR of VPC" } # main.tf 文件中使用变量 resource "volcengine_vpc" "foo" { vpc_name = "my_vpc" cidr_block = var.vpc_cidr }
设置输入变量有如下三种方式。
-var
设置在"terraform plan"、"terraform apply"命令行中通过-var
设置变量,-var
可以多次使用,示例如下:
说明
变量名称和等号之间不允许有空格。
terraform apply -var='vpc_cidr=172.20.0.0/16' terraform apply -var='vpc_name=my_vpc' -var='vpc_cidr=172.20.0.0/16' terraform apply -var='dns_servers = ["8.8.8.8","114.114.114.114"]'
如果您在配置中使用了很多变量,建议使用变量定义文件设置变量名称和取值后,通过-var-file
指定变量定义文件。
说明
对于复合类型的变量,为了提高可读性并避免转义带来的问题,建议使用变量定义文件来设置。
示例如下:
terraform apply -var-file="test.tfvars"
变量定义文件内容示例如下:
vpc_name = "my_vpc" vpc_cidr = "172.20.0.0/16" dns_servers = [ "8.8.8.8", "114.114.114.114", ]
Terraform还支持自动加载特殊命名的变量定义文件,例如:
terraform.tfvars
或terraform.tfvars.json
的文件。.auto.tfvars
或.auto.tfvars.json
结尾的文件。.json
结尾的文件,需要使用JSON对象表示,示例如下:{ "vpc_name": "my_vpc" "dns_servers": ["8.8.8.8", "114.114.114.114"] }
通过"TF_VAR_"为前缀的环境变量设置输入变量,适用于以自动化的方式运行或连续使用相同变量的Terraform命令运行的场景。
$ export TF_VAR_vpc_name=my_vpc $ export TF_VAR_dns_servers='["8.8.8.8", "114.114.114.114"]' $ terraform plan ...
您可以在实际使用时,自由组合以上三种设置变量的方式,冲突时将遵循以下规则:
-var
、-var-file
*.auto.tfvars
、*.auto.tfvars.json
文件terraform.tfvars
、terraform.tfvars.json
文件