Use a variável somente se definido no Ansible

4

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

    
por Garreth McDaid 12.10.2015 / 16:02

1 resposta

3

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

É realmente simples. Para definir um remote_user diferente para sistemas individuais sem precisar aplicar cargas de hacks a playbooks existentes, basta adicionar o var ao host em seu inventário:

[web_servers]
server1 ansible_ssh_user=user
server2

Neste caso, sempre que um jogo incorpora o servidor1, o "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).

    
por 12.10.2015 / 16:49

Tags