You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.07.12 11:03:14