Terraform 在variavles.tf中为type=map(object())添加默认字段
我的variables.tf文件中有以下变量:Terraform 在variavles.tf中为type=map(object())添加默认字段,terraform,Terraform,我的variables.tf文件中有以下变量: variable "accounts" { type = map(object({ field1 = string, field2 = list(string), field3 = list(string), field4 = list(string), field5 = string })
variable "accounts" {
type = map(object({
field1 = string,
field2 = list(string),
field3 = list(string),
field4 = list(string),
field5 = string
}))
}
我需要添加一个默认字段,这样我的用户就不必指定每个字段。例如,如果field2是一个空列表,我不希望用户必须定义field2=[]
我尝试了以下的一些变体,但似乎没有任何效果
default = {
default = {
"field1" = "",
"field2" = [],
"field3" = [],
"field4" = [],
"field5" = ""
}
}
有人知道怎么做或者知道这是否可能吗?默认值只能在变量级别定义,因此对于当前的变量结构,无法强制用户定义所有字段,除非在输入传递到Terraform之前对其进行预处理。当今Terraform中最接近的事情是让调用者将属性值设置为
null
,然后在模块内部以某种方式处理该null
实现这一点的一种方法是将输入变量与规范化它的局部值相结合,如下所示:
variable "example" {
type = map(object({
a = string
b = string
}))
}
locals {
example = {
for k, v in var.example : k => {
a = coalesce(v.a, "default a")
b = coalesce(v.b, "default b")
}
}
}
example = {
a = null
b = null
}
如果您的回退值不是null
或”
,但实际上您可以使用此处喜欢的任何表达式/函数,以适合您需要的任何方式处理null
案例,这可能是一个不错的选择
然后,您可以在模块中的其他位置使用local.example
来获取规范化值,或者使用var.example
来获取调用者给定的原始值
从调用者的角度来看,省略这两个属性将如下所示:
variable "example" {
type = map(object({
a = string
b = string
}))
}
locals {
example = {
for k, v in var.example : k => {
a = coalesce(v.a, "default a")
b = coalesce(v.b, "default b")
}
}
}
example = {
a = null
b = null
}
Terraform v0.14(在我写这篇文章的时候,它即将有它的第一个beta版本)将包括一个允许在类型约束中将对象类型属性标记为可选的:
terraform {
experiments = [module_variable_optional_attrs]
}
variable "example" {
type = map(object({
a = optional(string)
b = optional(string)
}))
}
这个新的可选(…)
注释的效果是,调用方在传递对象值时可以忽略该属性,在这种情况下,Terraform将通过插入值为null
的属性来执行类型转换,而不是像默认情况下那样返回错误
结合上面我展示的规范化方法,这将实现您正在寻找的模块接口,而无需调用方显式设置null
,以省略属性:
example = {}
除非此功能在Terraform 0.14系列中看到一些显示停止反馈,否则它很可能在Terraform 0.15中稳定