2

考虑我有一个变量 -

[
  {
    "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"
      },
    ]
  },
]

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

{
    "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"
      },
    ]
}

我已经使用

result = merge(variable[0], variable[1])

但是当我尝试这个

result = merge(variable[*])

我收到一条错误消息

调用函数“合并”失败:参数必须是映射或对象,得到“元组”。

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

4

1 回答 1

4

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

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

result = merge(variable...)

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

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


将 splat 运算符[*]应用于已经是列表的值是多余的;splat 运算符仅在其后跟至少一个附加属性名称或索引(如example[*].idor )时才有用example[*][0]

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

于 2019-08-08T17:25:47.047 回答