使用函数分配的 Terraform 变量

Jit*_*r S 9 terraform terraform-provider-aws

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

我收到错误“错误:不允许函数调用”

variable "subnet_address_space": cidr_subnet2_address_space = cidrsubnet(var.network_address_space,8,1)
Run Code Online (Sandbox Code Playgroud)

mon*_*mon 8

正如Hashicorp 人员在 .tfvars 中插入变量以定义另一个变量中所述,它的设计目的是保持常量。

输入变量是传递到根模块的常量值,因此它们不能包含不会产生常量值的插值或其他表达式。

我们也不能像在terraform 后端配置块中使用变量一样在后端使用变量。

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


Mar*_*ins 7

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

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

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

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]
  )
}
Run Code Online (Sandbox Code Playgroud)

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

当模块使用计算做出这样的决策时,模块将其结果导出为输出值有时很有用,以便调用模块也可以使用它,类似于 Terraform 资源也导出记录决策的附加属性由提供商或远程 API 制作:

output "subnet_cidr_block" {
  value = local.subnet_cidr_block
}
Run Code Online (Sandbox Code Playgroud)