Use variável apenas se definida em Ansible

Use variável apenas se definida em Ansible

Meu colega e eu usamos o Ansible para gerenciar um grupo de servidores.

Usamos o arquivo .ansible.cfg em nossos diretórios iniciais locais para configurar nossos ambientes locais e manter nossos manuais em um repositório git.

Ao autenticar em servidores, eu uso o usuário1 e ele usa o usuário2. 95% dos nossos servidores possuem essas contas, mas historicamente, alguns servidores possuem apenas uma conta de "usuário".

Estamos usando host_vars para definir a variável remote_user para a minoria de servidores em questão.

No entanto, em nossos manuais, geralmente usamos "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 e mal projetados que precisam ser mantidos on-line até serem desativados em alguns anos, e descobrimos que essa abordagem atende melhor às nossas necessidades.

Nosso problema é que nosso parâmetro remote_user está definido em nosso arquivo .ansible.cfg, onde é exposto como uma variável de ambiente em vez de uma variável de script.

Isso significa que se nossa tarefa contém:

remote_user: "{{ remote_user }}"

Funcionará apenas para hosts para os quais essa variável está definida

Para 95% dos hosts para os quais não definimos esta variável, a tarefa falha.

Existe uma maneira de usar a variável apenas se ela estiver definida?

por exemplo

Se remote_user estiver definido, use-o; caso contrário, use a variável de ambiente definida em .ansible.cfg

Nota: eu 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 aplicará a essa tarefa, e não quero ter que atualizar todas as tarefas

O que 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

Responder1

Como sempre, depois de passar 2 horas adiando a pergunta aqui, encontro a resposta 5 minutos depois de postar a pergunta!

É muito simples. Para definir um remote_user diferente para sistemas individuais sem ter que aplicar muitos hacks aos playbooks existentes, basta adicionar var ao host em seu inventário:

[web_servers]
server1 ansible_ssh_user=user
server2

Neste caso, sempre que uma peça incluir o servidor1, "usuário" será usado como o usuário ssh. Para server2, o valor de remote_user do seu arquivo ansible.cfg será usado (por exemplo, user1, user2 etc, dependendo do ambiente local).

informação relacionada