Gostaria de preencher o template por valores, mas tenho o conteúdo idêntico ao do template.
O resultado deve ser algo assim no arquivo hosts.yaml
. O modelo ainda não está concluído e será editado.
rnd_hetzner:
hosts:
rnd.test:
ansible_port: 22
ansible_host: 1.1.2.3
Modelo:
# 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 %}
Terraforma
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"
}
Seguindo os conselhos da
templatefile
documentação sobre como gerar JSON ou YAML válidos , aqui está uma maneira idiomática de fazer isso.O template consiste em uma única chamada
yamlencode
com a estrutura de dados descrita usando a linguagem de expressão própria do Terraform. Isso garante que o resultado seja sempre YAML válido, sem qualquer necessidade de escape especial:A configuração do Terraform seria semelhante a esta:
Vale considerar também a advertência na documentação do
hashicorp/local
provedor, que contribui com olocal_file
tipo de recurso utilizado acima:e
local_file
especificamente:Não há problema em ignorar esses avisos quando apropriado, mas isso significa que o comportamento de tal configuração do Terraform não corresponderia ao que os usuários do Terraform podem esperar de outros provedores: que o estado desejado e o estado real devem convergir após a execução bem-sucedida e, portanto, os planos futuros
terraform apply
irão estará vazio, a menos que o estado desejado mude. Qualquer pessoa que trabalhe com esta configuração precisará ser treinada para ver o Terraform propondo a criaçãolocal_file.ansible_inventory
em cada execução em um novo diretório de trabalho, mesmo que o estado desejado não tenha mudado.Obrigado a todos. Eu encontrei uma solução.
Eu recebo esse JSON
em local.ips
e meu modelo agora é: