Terraform本地变量转换:生成多资源映射的实现方案求助
解决方案
你可以通过嵌套的for表达式结合flatten函数来实现这个转换,核心思路是遍历每个分组,再遍历该分组下option2的每个元素,为每个元素生成对应的对象,最后将嵌套列表扁平化为一维列表。
实现代码
locals { groups = { group1 = { option1 = "Option1 Value Group1" option2 = [ "option2_item1", "option2_item2" ] option3 = { option3_key1 = "value1", option3_key2 = "value2" } } group2 = { option1 = "Option1 Value Group2" option2 = [ "option2_item1" ] option3 = { option3_key1 = "value1", option3_key2 = "value2" } } } # 转换后的目标结构 transformed = flatten([ for group_name, group_attrs in local.groups : [ for opt2_item in group_attrs.option2 : { result1 = group_name result2 = group_attrs.option1 result3 = opt2_item result4 = group_attrs.option3.option3_key1 result5 = group_attrs.option3.option3_key2 } ] ]) }
代码解释
- 外层遍历分组:
for group_name, group_attrs in local.groups遍历groups中的每个键值对,group_name是分组名(如group1),group_attrs是分组对应的属性集合。 - 内层遍历option2元素:针对每个分组,遍历其
option2列表中的每个元素,为每个元素生成一个独立的对象。 - 构造目标对象:每个对象的字段直接从对应的属性中取值:
result1:当前分组的名称result2:分组的option1值result3:当前遍历的option2列表元素result4/result5:直接取option3中固定键对应的值(如果option3的键不固定,可以用values(group_attrs.option3)[0]和values(group_attrs.option3)[1]按顺序取值)
- 扁平化为一维列表:用
flatten函数将外层分组生成的嵌套列表合并为一个一维列表,与你期望的输出结构完全匹配。
验证结果
执行terraform console后,输入local.transformed会得到:
[ { "result1" = "group1" "result2" = "Option1 Value Group1" "result3" = "option2_item1" "result4" = "value1" "result5" = "value2" }, { "result1" = "group1" "result2" = "Option1 Value Group1" "result3" = "option2_item2" "result4" = "value1" "result5" = "value2" }, { "result1" = "group2" "result2" = "Option1 Value Group2" "result3" = "option2_item1" "result4" = "value1" "result5" = "value2" }, ]
内容的提问来源于stack exchange,提问作者zwerg82
相关产品推荐
相关产品推荐

