使用Terraform templatefile遍历资源数量并生成独立文件
用Terraform的templatefile函数替代template_file生成多节点独立文件
核心实现思路
在locals中使用for表达式遍历节点索引(替代count),为每个节点调用templatefile函数生成渲染后的内容,最终得到一个包含所有节点模板内容的列表。
完整代码实现
1. 定义locals生成模板内容列表
locals { # 遍历0到node-count-1的索引,为每个节点生成渲染后的模板内容 ansible_inventories = [ for i in range(var.node-count) : templatefile("${path.module}/inventory.tpl", { host_ip = aws_eip.node_eip[i].public_ip vpc_name = var.vpc_name }) ] }
2. 修改null_resource生成文件
直接引用locals中的列表元素,为每个节点生成独立文件:
resource "null_resource" "inventory" { count = var.node-count provisioner "local-exec" { # 从locals列表中取对应索引的内容,写入目标文件 command = "echo '${local.ansible_inventories[count.index]}' > /tmp/${var.vpc_name}_node_${count.index}.ini" } # 依赖EIP资源确保IP已分配 depends_on = [aws_eip.node_eip] }
模板文件(inventory.tpl)无需修改
原模板的变量插值语法完全兼容templatefile函数,保持原有内容即可:
[all] ${host_ip} StrictHostKeyChecking=no -F /tmp/${vpc_name}_node.cfg'
关键说明
- 用
range(var.node-count)生成连续索引,替代原count.index的作用 - 直接通过
aws_eip.node_eip[i].public_ip访问对应节点的EIP,比element函数更直观 locals中的内容会自动依赖aws_eip.node_eip,显式声明depends_on可提升可读性
内容的提问来源于stack exchange,提问作者brandog
相关产品推荐
相关产品推荐

