Terraform动态生成文件时如何保持map定义的遍历顺序?
解决Terraform遍历Map时保持定义顺序的问题
Terraform的原生Map类型默认会按键的字母顺序排序遍历,所以你直接遍历local.template_filenames_with_vars时,会按aaa、bbb的顺序处理,而非你定义的顺序。要保持自定义顺序,最可靠的方式是单独维护一个键的顺序列表,基于列表遍历而非直接遍历Map。
修改后的代码示例
第一步:定义模板处理顺序列表
在locals中新增一个列表,明确指定你想要的模板处理顺序:
locals { # 显式定义模板处理顺序,按你需要的bbb、aaa排列 template_process_order = ["bbb", "aaa"] template_filenames_with_vars = { bbb = { var = 1 } aaa = { var = 1 } } }
第二步:基于顺序列表遍历Map
修改local_file资源的content部分,遍历顺序列表,再通过列表元素索引Map获取对应变量:
resource "local_file" "myfile" { filename = "file.txt" content = <<EOT ${ join("\n\n", [ for template_name in local.template_process_order : templatefile("${template_name}.txt", local.template_filenames_with_vars[template_name]) ]) } EOT }
原理说明
Terraform的Map类型本质是无序键值对集合,定义时的书写顺序会被忽略,默认按字母序排序键。通过单独维护顺序列表,我们可以完全控制遍历顺序——列表的元素顺序就是模板的处理顺序,再通过元素值去Map中匹配对应的变量配置,就能保证最终生成的文件内容按你预期的顺序拼接。
内容的提问来源于stack exchange,提问作者sctx
相关产品推荐
相关产品推荐

