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).