您可以在 terraform 中将查找函数与包含数组的地图变量一起使用吗?
Can you use the lookup function in terraform with map variables containing arrarys?
我使用映射变量和查找函数根据所选工作区以不同方式配置 aws。当变量包含字符串时它工作正常但我无法让它与数组一起工作并且我不确定它是否可能
我翻阅了 terraform 文档,但无法整理。看起来它不能用数组的映射来解决。也许有人解决了这个问题
variable "cidr" {
type = "map"
default = {
"prod" = ["10.7.3.0/24","10.7.4.0/24"]
"test" = ["10.8.3.0/24","10.8.4.0/24"]
}
}
cidr = ${lookup(var.cidr, terraform.workspace)}"
lookup() 只能与地图一起使用
原始类型。
如果您使用的是 Terraform v0.12.0 或更高版本,从列表地图访问其中一个列表的惯用方法是使用索引语法:
cidr = var.cidr[terraform.workspace]
您也可以在 Terraform v0.11 或更早版本中使用索引语法,但它必须包含在模板字符串中,因为这是我们向 Terraform 表明我们打算在那些旧版本中使用表达式的方式:
cidr = "${var.cidr[terraform.workspace]}"
The lookup
function 适用于您不知道给定键是否存在并且想要提供默认值以在不存在时使用的情况。尽管只有两个参数的 lookup
仍然支持向后兼容,但在现代 Terraform 中通常只应以三参数形式使用它:
# (this particular default is likely not a good idea, but this
# is just to illustrate the syntax.)
cidr = lookup(var.cidr, terraform.workspace, ["0.0.0.0/0"])
在 Terraform 0.12.7 之前,lookup
函数确实仅限于仅适用于原始类型的映射。在 Terraform 0.12.7 中,它被概括为与索引运算符的行为方式相同,但具有如果请求的键不存在则返回默认值的额外规则。
附带说明一下,如果您 使用 Terraform v0.12.0 或更高版本,那么您可以对该变量提供更具体的类型约束:
variable "cidr" {
type = map(list(string))
default = {
"prod" = ["10.7.3.0/24","10.7.4.0/24"]
"test" = ["10.8.3.0/24","10.8.4.0/24"]
}
}
通过准确地告诉 Terraform 列表和地图类型需要哪些元素类型,Terraform 可以自动检查调用者提供的值以确保它符合要求,如果不符合则报告类型错误。如果您只写 "map"
那么这是 map(any)
的遗留 shorthand,在这种情况下,Terraform 只能检查它是否是任何单一类型的映射,而不是具体必须是什么元素类型。我建议始终在 Terraform 0.12.0 或更高版本中使用精确类型约束。
我使用映射变量和查找函数根据所选工作区以不同方式配置 aws。当变量包含字符串时它工作正常但我无法让它与数组一起工作并且我不确定它是否可能
我翻阅了 terraform 文档,但无法整理。看起来它不能用数组的映射来解决。也许有人解决了这个问题
variable "cidr" {
type = "map"
default = {
"prod" = ["10.7.3.0/24","10.7.4.0/24"]
"test" = ["10.8.3.0/24","10.8.4.0/24"]
}
}
cidr = ${lookup(var.cidr, terraform.workspace)}"
lookup() 只能与地图一起使用 原始类型。
如果您使用的是 Terraform v0.12.0 或更高版本,从列表地图访问其中一个列表的惯用方法是使用索引语法:
cidr = var.cidr[terraform.workspace]
您也可以在 Terraform v0.11 或更早版本中使用索引语法,但它必须包含在模板字符串中,因为这是我们向 Terraform 表明我们打算在那些旧版本中使用表达式的方式:
cidr = "${var.cidr[terraform.workspace]}"
The lookup
function 适用于您不知道给定键是否存在并且想要提供默认值以在不存在时使用的情况。尽管只有两个参数的 lookup
仍然支持向后兼容,但在现代 Terraform 中通常只应以三参数形式使用它:
# (this particular default is likely not a good idea, but this
# is just to illustrate the syntax.)
cidr = lookup(var.cidr, terraform.workspace, ["0.0.0.0/0"])
在 Terraform 0.12.7 之前,lookup
函数确实仅限于仅适用于原始类型的映射。在 Terraform 0.12.7 中,它被概括为与索引运算符的行为方式相同,但具有如果请求的键不存在则返回默认值的额外规则。
附带说明一下,如果您 使用 Terraform v0.12.0 或更高版本,那么您可以对该变量提供更具体的类型约束:
variable "cidr" {
type = map(list(string))
default = {
"prod" = ["10.7.3.0/24","10.7.4.0/24"]
"test" = ["10.8.3.0/24","10.8.4.0/24"]
}
}
通过准确地告诉 Terraform 列表和地图类型需要哪些元素类型,Terraform 可以自动检查调用者提供的值以确保它符合要求,如果不符合则报告类型错误。如果您只写 "map"
那么这是 map(any)
的遗留 shorthand,在这种情况下,Terraform 只能检查它是否是任何单一类型的映射,而不是具体必须是什么元素类型。我建议始终在 Terraform 0.12.0 或更高版本中使用精确类型约束。