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单位。
| 归档时间: |
|
| 查看次数: |
4666 次 |
| 最近记录: |