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

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 })

我的variables.tf文件中有以下变量:

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中稳定