Terraform 可选嵌套对象变量

Dim*_*uts 7 terraform

新的地形。使用地形 0.12。我正在尝试改造我们的 Cloudflare 设置。

需要创建多个相同类型的资源(cloudflare provider page_rule 资源)并使用 config.tfvars 将值传递给资源“模板”。

我已经声明了一个 list(object({...})) 类型的变量。

需要一些对象参数是可选的,因此如果没有在 config.tfvars 中为某些列表元素指定条目,则创建的资源没有它们。

我已经阅读了 terraform 的 0.12 null 默认变量值,但我不确定是否有办法为 terraform 对象参数指定默认值。我见过的所有例子都只指定了参数的类型。

代码示例:

变量.tf

variable "example_page_rule"{
      type = list(object({
            cache_level = string,
            ssl = string,
            target = string    
      }))   
}
Run Code Online (Sandbox Code Playgroud)

主文件

resource "cloudflare_page_rule" "page_rule" {
        count = length(var.example_page_rule)
    cache_level = var.example_page_rule[count.index].cache_level
    ssl = var.example_page_rule[count.index].ssl
    target = var.example_page_rule[count.index].target
}
Run Code Online (Sandbox Code Playgroud)

配置文件

page_rules = [
{
   target = "www.target-url.com",
   ssl = "flexible",
   cache_level = "simplified",
},

{
   target = "www.target-url.com",
   cache_level = "simplified"
}
]
Run Code Online (Sandbox Code Playgroud)

当尝试使用上述配置进行规划时会发生错误:“ssl”值是必需的。

如果我将 config.tfvars 更改为以下内容,则所有 config.tfvars 都按预期工作,但如果可能,我想避免输入空值。

page_rules = [
{
   target = "www.target-url.com",
   ssl = "flexible",
   cache_level = "simplified",
},

{
   target = "www.target-url.com",
   ssl = null,
   cache_level = "simplified"
}
]
Run Code Online (Sandbox Code Playgroud)

jan*_*-di 15

自 Terraform 1.3(2022 年 9 月 21 日发布)起,对可选对象属性有了稳定的支持:

variable "object_variable" {
  type = object({
    attr1 = number                # a required attribute
    attr2 = optional(number)      # an optional attribute (default = null)
    attr3 = optional(number, 127) # an optional attribute with default value
  })
}
Run Code Online (Sandbox Code Playgroud)

另请参阅https://www.terraform.io/language/expressions/type-constraints#optical-object-type-attributes


Terraform 0.14 - 1.2通过实验module_variable_optional_attrs

请注意,此实验及其相关文档已在 v1.3.0 中删除,不再可用。如果您来自旧版本的实验,相同的变量将如下所示。

variable "object_variable" {
  type = object({
    attr1 = number                # a required attribute
    attr2 = optional(number)      # an optional attribute (default = null)
    attr3 = optional(number)      # an optional attribute with default value

  })
  default = [
      {
          attr3 = 127
      }
  ]
}
Run Code Online (Sandbox Code Playgroud)


Sea*_*ine 7

这是一个功能请求,正在此处跟踪: https: //github.com/hashicorp/terraform/issues/19898。点击该链接并在原始帖子上给出 :+1:(竖起大拇指表情符号),以便他们的开发团队优先考虑它。