如何在Terraform中合并并排序键值对(LogicMonitor属性问题)
解决Terraform LogicMonitor自定义属性排序导致的误报变更问题
问题分析
LogicMonitor设备属性按name字母序存储和返回,但当前通过concat合并内置属性与传入变量的方式,无法保证最终列表的固定顺序。Terraform会将列表顺序变化识别为资源变更,导致更新时误报大量不必要的修改。
解决方案
通过先合并属性、再按name字段排序的方式,强制自定义属性列表与LogicMonitor的顺序一致,避免Terraform误判变更。
实现代码
locals { # 合并内置属性与传入的自定义属性,保留原有逻辑 combined_properties = concat([ { name = "host_fqdn" value = "${var.name}.${var.dns_domain}" }, { name = "ocid" value = oci_core_instance.server.id }, { name = "private_ip" value = oci_core_instance.server.private_ip }, { name = "snmp.version" value = "v2c" } ], var.logicmonitor_properties) # 提取所有属性的name并按字母排序 sorted_property_names = sort([for p in local.combined_properties : p.name]) } # 按排序后的name重新构建属性列表 custom_properties = [ for name in local.sorted_property_names : one([ for p in local.combined_properties : p if p.name == name ]) ]
代码说明
- 合并属性:通过
locals保留原有的concat逻辑,将内置属性和传入的自定义属性合并为一个列表。 - 生成排序后的name列表:用
sort函数对提取出的所有属性name字段进行字母排序,得到固定顺序的name序列。 - 构建有序属性列表:遍历排序后的name,从合并列表中取出对应属性对象,生成最终的有序列表。
这种方式确保每次Terraform执行时,custom_properties的顺序都与LogicMonitor API返回的字母序一致,彻底解决顺序变化导致的误报变更问题。
内容的提问来源于stack exchange,提问作者Jeroen G
相关产品推荐
相关产品推荐

