【问题标题】:Merge fails in terraform合并在terraform中失败
【发布时间】:2019-12-15 21:50:10
【问题描述】:

假设我有一个变量 -

[
  {
    "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 运算符时合并失败? 有没有更好的方法按照上面的要求合并列表中的地图?

【问题讨论】:

    标签: for-loop maps terraform hcl


    【解决方案1】:

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

    要将列表或元组的元素作为多个单独的参数传递,您可以使用argument expansion syntax

    result = merge(variable...)
    

    ... 符号,当在函数调用的最后一个参数之后给出时,告诉 Terraform 在调用函数之前将表达式评估为列表或元组,然后使用其中的元素产生一个单独的参数。

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


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

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

    【讨论】:

    • 谢谢。但是... 我得到这个错误 - The expanding argument (indicated by ...) must be of a tuple, list, or set type.
    猜你喜欢
    • 2014-02-22
    • 2011-07-31
    • 1970-01-01
    • 1970-01-01
    • 2017-06-03
    • 2016-03-24
    • 1970-01-01
    • 1970-01-01
    • 2020-08-05
    相关资源
    最近更新 更多