terraform 中合并失败

leo*_*ion 3 maps for-loop terraform hcl

考虑我有一个变量 -

[
  {
    "outer_key_1" = [
      {
        "ip_cidr" = "172.16.6.0/24"
        "range_name" = "range1"
      },
      {
        "ip_cidr" = "172.16.7.0/24"
        "range_name" = "range2"
      },
      {
        "ip_cidr" = "172.17.6.0/24"
        "range_name" = "range3"
      },
      {
        "ip_cidr" = "172.17.7.0/24"
        "range_name" = "range4"
      },
    ]
  },
  {
    "outer_key_2" = [
      {
        "ip_cidr" = "172.16.5.0/24"
        "range_name" = "range5"
      },
      {
        "ip_cidr" = "172.17.5.0/24"
        "range_name" = "range6"
      },
    ]
  },
]
Run Code Online (Sandbox Code Playgroud)

我能够合并列表内的地图以获得此输出 -

{
    "outer_key_1" = [
      {
        "ip_cidr" = "172.16.6.0/24"
        "range_name" = "range1"
      },
      {
        "ip_cidr" = "172.16.7.0/24"
        "range_name" = "range2"
      },
      {
        "ip_cidr" = "172.17.6.0/24"
        "range_name" = "range3"
      },
      {
        "ip_cidr" = "172.17.7.0/24"
        "range_name" = "range4"
      },
    ]

    "outer_key_2" = [
      {
        "ip_cidr" = "172.16.5.0/24"
        "range_name" = "range5"
      },
      {
        "ip_cidr" = "172.17.5.0/24"
        "range_name" = "range6"
      },
    ]
}
Run Code Online (Sandbox Code Playgroud)

我已经使用了这个方法

result = merge(variable[0], variable[1])
Run Code Online (Sandbox Code Playgroud)

但是当我尝试这个时

result = merge(variable[*])
Run Code Online (Sandbox Code Playgroud)

我收到一条错误消息

调用函数“merge”失败:参数必须是映射或对象,得到“tuple”。

为什么使用 splat 运算符时合并失败?有没有更好的方法按照上面的要求合并列表中的地图?

Mar*_*ins 10

merge函数被定义为采用一个或多个单独的参数,每个参数都是映射或对象值。当您调用(与已经是一个列表merge(variable)相同)时,您而是给它一个列表参数,从而导致此错误。merge(variable[*])variable

要将列表或元组的元素作为多个单独的参数传递,您可以使用参数扩展语法

result = merge(variable...)
Run Code Online (Sandbox Code Playgroud)

当在函数调用中的最后一个参数之后给出该符号时,它告诉 Terraform 在调用函数之前...将表达式计算为列表或元组,然后将结果中的元素分别用作单独的参数。

换句话说,对于列表中的每个元素,与 etcmerge(variable...)相同merge(variable[0], variable[1], variable[2]),无需提前知道列表中有多少个元素。


将 splat 运算符应用于[*]已经是列表的值是多余的;仅当 splat 运算符后跟至少一个附加属性名称或索引(例如example[*].id或 )时,该运算符在这种情况下才有用example[*][0]

一种情况下,没有后续步骤的孤独[*]可能会很有用:如果您将其应用于不是列表或元组的任何内容,那么 Terraform 会将其包装在单元素列表中(如果它非空)或返回一个空列表(如果为 null),这在某些不寻常的情况下很有用,在这些情况下,您给出的单个值可能为 null,并且需要将其调整为零或一长度列表以与资源和资源等功能一起for_each使用以块为dynamic单位。

  • 谢谢。但是使用“...”时,我收到此错误 -“扩展参数(由...指示)必须是元组、列表或集合类型。” (2认同)