Como posso definir uma variável Ansible cujo valor é outra variável na mesma estrutura de mapeamento ?
Para permitir um namespace sensato de variáveis, estou definindo estruturas de mapeamento como esta, onde alguns valores dependem de outras variáveis na mesma estrutura:
acme:
directory:
hostname: "acme-staging-v02.api.letsencrypt.org"
letsencrypt:
config_dir: "/etc/letsencrypt"
keys_dir: "{{ letsencrypt.config_dir }}/keys"
csrs_dir: "{{ letsencrypt.config_dir }}/csr"
certs_dir: "{{ letsencrypt.config_dir }}/certs"
accounts_dir: "{{ letsencrypt.config_dir }}/accounts"
csr_file: "{{ letsencrypt.csrs_dir }}/{{ site_domain }}.csr"
account_key_file: "{{ letsencrypt.csrs_dir }}/{{ acme.directory.hostname }}"
email_address: "certificate-reminders@{{ site_domain }}"
Isso falha porque o Ansible não pode resolver os valores que fazem referência a outros na mesma estrutura de dados:
loop recursivo detectado na string do modelo: {{ letsencrypt.config_dir }}/keys
Então eu pensei que a pesquisavars
permitiria adiar essa resolução:
acme:
directory:
hostname: "acme-staging-v02.api.letsencrypt.org"
letsencrypt:
config_dir: "/etc/letsencrypt"
keys_dir: "{{ lookup('vars', 'letsencrypt.config_dir') }}/keys"
csrs_dir: "{{ lookup('vars', 'letsencrypt.config_dir') }}/csr"
certs_dir: "{{ lookup('vars', 'letsencrypt.config_dir') }}/certs"
accounts_dir: "{{ lookup('vars', 'letsencrypt.config_dir') }}/accounts"
csr_file: "{{ lookup('vars', 'letsencrypt.csrs_dir') }}/{{ site_domain }}.csr"
account_key_file: >-
{{ lookup('vars', 'letsencrypt.csrs_dir') }}/{{ acme.directory.hostname }}
email_address: "certificate-reminders@{{ site_domain }}"
Isso falha porque o Ansible está tentando resolver essa pesquisa imediatamente:
Nenhuma variável encontrada com este nome: letsencrypt.config_dir
Claro que eu poderia dividi-los para que sejam variáveis separadas. Isso anula meu propósito, porém, de manter todas as variáveis fortemente relacionadas agrupadas no mesmo namespace.
Então, o que me permitirá definir a estrutura de dados para que alguns valores possam depender de outras variáveis na mesma estrutura ?
(Obrigado a @michael-hampton por levar a esta resposta.)
Conforme descrito no Ansible issue#8603 , o analisador de configuração está lendo os valores das variáveis e imediatamente tentando renderizar os modelos que encontra ao definir as variáveis . Isso faz com que a análise falhe quando um modelo faz referência a uma variável ainda não completamente definida.
Um comentário de 'rquelibari' dá uma boa análise:
e explica em detalhes como isso acontece.
Um comentário subsequente de 'cmpunchs' indica diretamente a solução necessária:
Portanto, até que o analisador YAML no Ansible seja corrigido para ler os valores das variáveis como texto simples sem tentar renderizar imediatamente os modelos (e adiar a renderização até que todas as variáveis sejam definidas), essa referência cruzada nos valores ainda não pode ser feita nas variáveis do Ansible .