如何通过遍历多组Terraform变量列表生成单个文件?
解决Terraform生成单文件inventory.ini的问题
你的代码因使用count创建了与列表长度对等的template_file实例,最终会输出多个独立内容块,导致生成多份文件。要生成包含目标多行内容的单个文件,只需在模板内部完成所有行的循环拼接,再写入指定文件即可。
实现代码
1. 渲染多行内容模板
data "template_file" "inventory" { template = <<EOL %{ for idx in range(length(var.mylist1)) }${var.mylist1[idx]} ip-address=${var.mylist2[idx]} eip-address=${var.mylist3[idx]} %{ endfor } EOL }
2. 将渲染结果写入单个文件
resource "local_file" "inventory_ini" { filename = "./mypath/inventory.ini" content = data.template_file.inventory.rendered }
可选:列表长度校验
为避免因三个列表长度不一致引发索引越界错误,可添加前置校验:
locals { list_length = length(var.mylist1) } resource "null_resource" "validate_list_length" { count = (local.list_length != length(var.mylist2) || local.list_length != length(var.mylist3)) ? 1 : 0 provisioner "local-exec" { command = "echo '错误:三个列表的长度必须完全一致' && exit 1" } }
说明
- 模板使用Terraform内置的
%{ for ... }循环语法,遍历列表索引并拼接每行的主机名、IP及弹性IP信息,最终生成完整的多行字符串。 local_file资源将渲染后的完整内容写入指定路径,确保仅生成单个目标文件。
内容的提问来源于stack exchange,提问作者brandog
相关产品推荐
相关产品推荐

