我想按值填充模板,但我的内容与模板相同。
文件中的结果应该是这样的hosts.yaml
。模板尚未完成,将进行编辑。
rnd_hetzner:
hosts:
rnd.test:
ansible_port: 22
ansible_host: 1.1.2.3
模板:
# 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 %}
地形
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"
}
遵循文档中有关如何生成有效 JSON 或 YAML 的建议
templatefile
,这是一种惯用的方法。该模板包含对
yamlencode
使用 Terraform 自己的表达式语言描述的数据结构的单个调用。这确保结果始终是有效的 YAML,无需特殊转义:Terraform 配置类似于以下内容:
还值得考虑提供者文档中的警告注释
hashicorp/local
,它提供了local_file
上面使用的资源类型:具体来说
local_file
:在适当的时候忽略这些警告是可以的,但这确实意味着这种 Terraform 配置的行为与 Terraform 用户对其他提供者的期望不匹配:成功运行后期望状态和实际状态应该收敛,因此未来的计划
terraform apply
将除非所需的状态发生变化,否则为空。local_file.ansible_inventory
使用此配置的任何人都需要接受培训,以期望看到 Terraform 建议在新工作目录中的每次运行中创建,即使所需的状态没有以其他方式更改。感谢大家。我找到了解决办法。
我得到这个 JSON
在本地.ips中
我现在的模板是: