使用函数分配的 Terraform 变量

Terraform variable to assign using function

variable "cidr" {
  type = map(string)
  default = {
      development = "x.1.0.0/16"
      qa = "x.1.0.0/16"
      default = "x.1.0.0/16"
  }
} 
variable "network_address_space" {
  default = lookup(var.cidr, var.environment_name,"default")
}

收到错误 "Error: Function calls not allowed"

variable "subnet_address_space": cidr_subnet2_address_space = cidrsubnet(var.network_address_space,8,1)

正如 Hashicorp 人员在 Interpolate variables inside .tfvars to define another variable 中所述,它旨在通过设计保持不变。

Input variables are constant values passed into the root module, and so they cannot contain interpolations or other expressions that do not yield a constant value.

我们不能像 Using variables in terraform backend config block 那样在后端使用变量。

我想这些是我们 Terraform 用户在某些时候绊倒的事情。

Terraform Input Variable 类似于通用编程语言中的函数参数:它的值来自调用模块中的表达式,而不是当前模块。

default 机制允许我们在调用者未指定值时替换一个值,但由于变量旨在从外部将数据导入模块,因此没有意义将默认值设置为该模块 内部 中的某些内容:这将导致结果可能是模块调用者永远无法实际指定的内容,因为他们无权访问必要的数据.

Terraform 有另一个概念Local Values,它大致类似于通用编程语言中函数内的局部变量。这些 可以 从函数结果和当前模块中的其他对象中提取以产生它们的值,因此我们可以一起使用输入变量和局部值来提供回退行为,就像您在您的问题:

var "environment_name" {
  type = string
}

var "environment_default_cidr_blocks" {
  type = map(string)
  default = {
      development = "10.1.0.0/16"
      qa          = "10.2.0.0/16"
  }
}

var "override_network_range" {
  type    = string
  default = null   # If not set by caller, will be null
}

locals {
  subnet_cidr_block = (
    var.override_network_range != null ?
    var.override_network_range :
    var.environment_default_cidr_blocks[var.environment_name]
  )
}

在模块的其他地方,您可以使用 local.subnet_cidr_block 来引用最终的 CIDR 块选择,无论它是由调用者显式设置还是通过查找 table 默认值。

当模块使用计算来做出这样的决定时,有时模块将其结果导出为 Output Value 很有用,这样调用模块也可以使用它,类似于Terraform 资源还导出附加属性记录由提供者或远程 API:

做出的决定
output "subnet_cidr_block" {
  value = local.subnet_cidr_block
}