如何在Terraform中合并两个对象数组的对应元素?
解决Terraform中对象数组的合并问题
你遇到的问题核心是merge()函数的作用对象是单个map或对象,而非数组(tuple),直接传入数组自然会报错;而tomap()无法将对象数组转为map,因为数组元素是独立对象,没有符合map要求的键值结构。
要实现按索引一一合并两个数组中的对象,正确的做法是用zip()函数将两个数组的元素按索引配对,再通过for循环逐个合并每对对象:
locals { fqdns_map = [ { "fqdn" = "db.example.com" }, { "fqdn" = "lb.example.com" }, { "fqdn" = "web.example.com" }, ] ipv4s_map = [ { "ipv4_address" = "1.1.1.1" }, { "ipv4_address" = "2.2.2.2" }, { "ipv4_address" = "3.3.3.3" }, ] merged_map = [ for pair in zip(local.fqdns_map, local.ipv4s_map) : merge(pair[0], pair[1]) ] }
代码说明:
zip(local.fqdns_map, local.ipv4s_map)会将两个数组中索引相同的元素组合成元组,比如第一个元组为({fqdn = "db.example.com"}, {ipv4_address = "1.1.1.1"})- 遍历每个元组,用
merge(pair[0], pair[1])将元组内的两个对象合并为一个新对象 - 最终生成的
merged_map就是你需要的结构
内容的提问来源于stack exchange,提问作者mocart
相关产品推荐
相关产品推荐

