Meu colega e eu utilizamos o Ansible para gerenciar um grupo de servidores.
Nós usamos o arquivo .ansible.cfg em nossos diretórios home locais para configurar nossos ambientes locais e manter nossos livros em um repositório git.
Ao se autenticar em servidores, eu uso user1 e ele usa user2. 95% dos nossos servidores possuem essas contas, mas, historicamente, alguns servidores têm apenas uma conta de "usuário".
Estamos usando o host_vars para definir a variável remote_user para a minoria dos servidores em questão.
No entanto, em nossos manuais, geralmente utilizamos "todos" para estipular quais servidores queremos atingir e usamos o parâmetro --limit na linha de comando para especificar exatamente quais servidores devem receber a atualização. Nosso farm de servidores é um legado de servidores mal projetados, que precisam ser mantidos on-line até que sejam removidos em alguns anos, e descobrimos que essa abordagem atende melhor às nossas necessidades.
Nosso problema é que nosso parâmetro remote_user é definido em nosso arquivo .ansible.cfg, onde é exposto como variável de ambiente, em vez de uma variável de script.
Isso significa que, se nossa tarefa contiver:
remote_user: "{{ remote_user }}"
Ele só funcionará para hosts para os quais essa variável é definida
Para os 95% de hosts para os quais não definimos essa variável, a tarefa falha.
Existe uma maneira de usar somente a variável se ela estiver definida?
por exemplo
Se remote_user estiver definido, use-o, se não, use a variável de ambiente definida em .ansible.cfg
Nota: sei que posso usar:
- name: Do something
remote_user: "{{ remote_user }}"
when: remote_user is defined
Em uma definição de tarefa, mas isso só se aplica a essa tarefa e não quero ter que atualizar toda a tarefa
Quando eu realmente preciso é que essa condição esteja disponível na definição de hosts, ou seja:
---
- hosts: all
remote_user: "{{ remote_user }}"
when: remote_user is defined
Mas isso é ilegal no Ansible