我的 Variables.tf 文件中有以下变量:
variable "accounts" {
type = map(object({
field1 = string,
field2 = list(string),
field3 = list(string),
field4 = list(string),
field5 = string
}))
}
Run Code Online (Sandbox Code Playgroud)
我需要添加一个默认字段,以便我的用户不必指定每个字段。例如,如果 field2 是一个空列表,我不希望用户必须定义field2 =[]
我尝试了以下一些变体,但似乎没有任何效果。
default = {
default = {
"field1" = "",
"field2" = [],
"field3" = [],
"field4" = [],
"field5" = ""
}
}
Run Code Online (Sandbox Code Playgroud)
任何人都知道如何做到这一点或知道它是否可能?
今天的 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")
}
}
}
Run Code Online (Sandbox Code Playgroud)
coalesce
如果您有一个不是null
或 的后备值,该函数""
可能是一个不错的选择,但实际上您可以使用您喜欢的任何表达式/函数来以null
适合您需要的任何方式处理这种情况。
然后,您可以使用local.example
模块中的其他位置来获取标准化值,或var.example
获取调用者给出的原始值。
从调用者的角度来看,省略这两个属性将如下所示:
example = {
a = null
b = null
}
Run Code Online (Sandbox Code Playgroud)
Terraform v0.14(在我撰写本文时即将发布第一个测试版)将包含一个实验性新功能,允许在类型约束中将对象类型属性标记为可选:
terraform {
experiments = [module_variable_optional_attrs]
}
variable "example" {
type = map(object({
a = optional(string)
b = optional(string)
}))
}
Run Code Online (Sandbox Code Playgroud)
这个新注释的效果optional(...)
是,调用者在传入对象值时可以省略该属性,在这种情况下,Terraform 将通过插入带有 value 的属性来执行类型转换null
,而不是像默认情况下那样返回错误。
结合我上面展示的规范化方法,这将实现您正在寻找的模块接口,而不需要调用者显式设置null
以省略属性:
example = {}
Run Code Online (Sandbox Code Playgroud)
除非此功能在 Terraform 0.14 系列期间看到一些令人惊叹的反馈,否则它可能会在 Terraform 0.15 中稳定下来。
归档时间: |
|
查看次数: |
17821 次 |
最近记录: |