como acessar a variável host de um host diferente com o Ansible?

45

Digamos que tenha um host que colete alguns dados e ele esteja em um grupo [collectors]. Eu também tenho anfitriões em grupo [reporters]. Então, eu quero definir uma variável em repórteres do groups['collectors'][0]endereço IP. Mas o manual para a criação de repórteres não é executado em [collectors]grupo, portanto, os fatos para esse host não são coletados. Existe uma maneira de não codificar o endereço IP?

hryamzik
fonte

Respostas:

87

Você pode acessar praticamente todos os fatos / variáveis ​​do inventário fazendo algo assim:

{{ hostvars['foo.example.com']['ansible_eth0']['ipv4']['address'] }}

ou, se você quiser fazer isso através de um índice em um grupo:

{{ hostvars[groups['collectors'][0]]['ansible_eth0']['ipv4']['address'] }}

O grande truque é que você precisa coletar os fatos de todos os hosts / grupos nos quais está interessado. Portanto, convém modificar seu playbook que é executado no grupo de repórteres para incluir uma tarefa não-operacional (fictícia) aplicada para o grupo de colecionadores. Isso fará com que a Ansible colete fatos sobre os hosts dos coletores, para que possam ser acessados ​​pelo grupo de repórteres. Portanto, convém adicionar algo assim à parte superior do manual de repórteres:

- hosts: collectors
  name: Gather facts from collectors
  tasks: [ ]

Os colchetes vazios basicamente significam que nenhuma tarefa será executada, mas isso ainda forçará o Ansible a reunir fatos sobre os coletores, para que você possa referenciá-los nas tarefas que executa contra seus repórteres.

Editar # 1

Ocorreu-me que também devo mencionar que, na versão 1.8 do Ansible, existe um recurso de cache de fatos que agora está disponível. O cache de fatos depende de um servidor redis para armazenar fatos entre execuções de playbook. Com essa opção ativada, um manual pode fazer referência a fatos que foram obtidos por outro manual que foi executado anteriormente. O exemplo da documentação do Ansible fornece:

Imagine, por exemplo, uma infraestrutura muito grande com milhares de hosts. O cache de fatos pode ser configurado para ser executado todas as noites, mas a configuração de um pequeno conjunto de servidores pode ser executada ad-hoc ou periodicamente ao longo do dia. Com o cache de fatos ativado, não seria necessário "acertar" todos os servidores para fazer referência a variáveis ​​e informações sobre eles.

Bruce P
fonte
2
Existe uma maneira de definir o índice associativo como uma variável? no exemplo localhost ansible --extra-vars "metamorphosis_ip = 172.16.3.73" -a "echo {{hostvars [{{metamorphosis_ip}}] ['inv_domain']}}"
corrija
Para adicionar à resposta acima acima, não deixe de consultar as Perguntas frequentes sobre o Ansible aqui: docs.ansible.com/ansible/faq.html, que explica tudo em detalhes, como fazer um loop sobre um grupo de hosts ou definir uma variável para obter um host específico num grupo.
einarc
Obrigado pela ideia de buscar fatos de um nó com uma lista de tarefas vazia.
pedz