如何使用Terraform的templatefile函数将Map输出为清单文件格式
如何使用Terraform的templatefile函数将Map输出为清单文件格式
我懂你现在的需求——就是要把Terraform里那个颜色分组的Map转换成指定格式的清单文件对吧?之前的模板写法没处理好数组元素的遍历,所以才会报错,咱们来调整一下就能解决问题。
首先先确认你的源Map变量(顺便帮你修正了拼写错误,原来的geen应该是green):
locals { inventory_map = { "black" = ["xyz"] "blue" = ["abc", "xyz"] "green" = ["abc"] "red" = ["abc", "xyz"] "yellow" = ["xyz"] } }
你的local_file资源结构其实没问题,问题出在模板文件的写法上。你之前直接输出${value}会把整个数组当成一个整体输出,而我们需要遍历数组里的每个元素,逐个换行显示。
修改你的.hosts.yaml.tftpl模板内容为:
%{ for key, values in color_groups ~} [${key}] %{ for value in values ~} ${value} %{ endfor ~} %{ endfor ~}
如果希望每个分组之间保留空行(让文件更易读),可以改成这样:
%{ for key, values in color_groups ~} [${key}] %{ for value in values ~} ${value} %{ endfor ~} %{ endfor ~}
这个模板的逻辑很简单:
- 外层循环遍历Map的每一组键值对,先输出带方括号的组名
[${key}] - 内层循环遍历当前组对应的数组,把每个元素单独输出一行
- (可选)组之间添加空行分隔
最后你的local_file资源可以保持原样(或者指定你想要的输出文件名):
resource "local_file" "host_file" { content = templatefile("./hosts.yaml.tftpl", { color_groups = local.inventory_map }) filename = "./hosts.ini" # 按需修改文件名,比如hosts.txt }
这样运行Terraform之后,生成的文件内容就完全符合你的预期啦!
备注:内容来源于stack exchange,提问作者drmaa
相关产品推荐
相关产品推荐

