You need to enable JavaScript to run this app.
导航

输入变量

最近更新时间2022.07.01 10:39:21

首次发布时间2022.05.17 12:06:31

输入变量即模块的输入参数,通过关键字"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"]'

通过变量定义文件(.tfvars)设置

如果您在配置中使用了很多变量,建议使用变量定义文件设置变量名称和取值后,通过-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.tfvarsterraform.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
...

变量优先级

您可以在实际使用时,自由组合以上三种设置变量的方式,冲突时将遵循以下规则:

  • 如果为同一个变量分配多个值,Terraform将使用最后一个值进行覆盖。
  • Terraform加载变量时,优先级由高到低排序为:
    1. -var-var-file
    2. *.auto.tfvars*.auto.tfvars.json文件
    3. terraform.tfvarsterraform.tfvars.json文件
    4. 环境变量