Digamos que eu gostaria de executar a seguinte tarefa no ansible:
- name: dns-cloudflare | Request certificate
ansible.builtin.shell:
cmd: certbot certonly \
--dns-cloudflare \
--dns-cloudflare-credentials {{ certbot_cloudflare_credentials_file }} \
--non-interactive \
--agree-tos \
--expand \
--email {{ certbot_email }} \
--domain {{ __domains }}
args:
executable: /bin/bash
creates: "{{ certbot_directory }}/{{ item.name }}/{{ item.name }}/cert.pem"
Eu o construo com um bloco como este:
certbot_cert:
- name: test1.example.com
cn:
- test2-cn.example.com
post-hook: systemctl restart apache2
- name: test3.example.com
Quero adicionar o argumento --post-hook ao meu comando certbot, dependendo de onde item.post-hook
. E o conteúdo deste gancho não é estático, tudo o que eu digitar lá deve aparecer no meu comando certbot como --post-hook 'systemctl restart apache2'
Mas quando eu não defino esta variável, não deve haver um pós-hook vazio, ele não deve estar no comando certbot. .
Como posso conseguir isso?
Brinquei com variáveis e filtros e li a documentação, mas não encontrei uma maneira adequada de lidar com isso. Duplicar esta tarefa várias vezes para cada argumento opcional possível não deve ser o caminho.
A maneira como você escreveu o valor de
cmd
não preserva novas linhas - que é o que você deseja, pois isso significa (a) que você não precisa escapar (\
) do final das linhas como fez no seu exemplo, e (b) você pode usar convenientemente condicionais jinja para suprimir algumas linhas.Assim:
Para o primeiro item em
certbot_cert
, isso será executado:E para a segunda linha será executado: