如何合并Terraform映射?现有代码输出不符预期求修正
解决方案
当前代码的问题在于,你通过两层for表达式生成了嵌套的Map结构,外层保留了foo/bar作为键。要得到扁平的顶层Map,需要直接遍历所有嵌套的键值对并合并到同一层级,有两种简洁的实现方式:
方式一:使用双重for表达式直接生成扁平Map
直接在Map构造中使用嵌套的for循环,遍历所有子项的values并生成带前缀的键值对:
locals { items = { foo = { config = { prefix = "foo-prefix:" values = { "key1" : "value1", "key2" : "value2" } } }, bar = { config = { prefix = "bar-prefix:" values = { "key3" : "value3", "key4" : "value4" } } } } # 修改后的result定义 result = { for _, item in local.items : for key, val in item.config.values : "${item.config.prefix}${key}" => val } } output "result" { value = local.result }
这种方式利用Terraform对多for表达式的支持,一次性遍历所有层级的元素,直接生成目标扁平Map。
方式二:结合merge()函数合并子Map
先为每个item生成带前缀的子Map,再通过merge()将所有子Map合并为一个顶层Map:
locals { items = { foo = { config = { prefix = "foo-prefix:" values = { "key1" : "value1", "key2" : "value2" } } }, bar = { config = { prefix = "bar-prefix:" values = { "key3" : "value3", "key4" : "value4" } } } } # 修改后的result定义 result = merge([ for _, item in local.items : { for key, val in item.config.values : "${item.config.prefix}${key}" => val } ]...) } output "result" { value = local.result }
这里的[...]生成一个包含多个子Map的列表,...是Terraform的展开运算符,将列表元素作为merge()的多个参数,最终合并为单一Map。
两种方式都能得到你期望的输出结果:
result = { "bar-prefix:key3" = "value3" "bar-prefix:key4" = "value4" "foo-prefix:key1" = "value1" "foo-prefix:key2" = "value2" }
内容的提问来源于stack exchange,提问作者RQDQ
相关产品推荐
相关产品推荐

