在 variavles.tf 中添加 type = map(object()) 的默认字段

Gab*_*lbu 4 terraform

我的 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)

任何人都知道如何做到这一点或知道它是否可能?

Mar*_*ins 8

今天的 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 中稳定下来。

  • 如果“可选”可以采用默认值,那就太棒了!:-) (2认同)