Terraform模板变量未被值替换问题求助
问题:Terraform模板未被变量值填充,生成文件与模板完全一致
预期生成的hosts.yaml示例
rnd_hetzner: hosts: rnd.test: ansible_port: 22 ansible_host: 1.1.2.3
模板文件内容(ansible_inventory.tpl)
# Ansible Inventory --- all: hosts: {% for instance, details := instances_ips.value %} {{ instance }}: ansible_host: {{ details.external_ip }} {% endfor %} children: all_servers: hosts: {% for instance, _ := instances_ips.value %} {{ instance }} {% endfor %}
当前Terraform配置
locals { instances_ips = { "value" : { "app-server" : { "external_ip" : "1.27.1.1" }, "db-server" : { "external_ip" : "1.24.9.1" } } } } resource "local_file" "ansible_inventory" { content = templatefile("${path.module}/templates/ansible_inventory.tpl", { instances_ips = jsonencode(local.instances_ips) } ) filename = "${path.module}/templates/hosts.yaml" }
问题原因
传递变量给templatefile时,用jsonencode把local.instances_ips转成了JSON字符串,但模板里的{% for %}循环需要遍历Terraform原生对象类型,无法解析JSON字符串的结构,导致循环逻辑未执行,生成的文件和原始模板内容一致。
解决方案
1. 修正变量传递方式
去掉jsonencode,直接传递原生Terraform对象给模板:
resource "local_file" "ansible_inventory" { content = templatefile("${path.module}/templates/ansible_inventory.tpl", { instances_ips = local.instances_ips } ) filename = "${path.module}/templates/hosts.yaml" }
2. (可选)调整模板结构匹配预期输出
如果需要生成和示例一致的rnd_hetzner开头结构,修改模板如下:
# Ansible Inventory --- rnd_hetzner: hosts: {% for instance, details := instances_ips.value %} {{ instance }}: ansible_port: 22 ansible_host: {{ details.external_ip }} {% endfor %}
内容的提问来源于stack exchange,提问作者Rostyslav Malenko
相关产品推荐
相关产品推荐

