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

39

Digamos que você tenha um host que coleta alguns dados e esteja em um grupo [collectors] . Eu também tenho hosts no grupo [reporters] . Então eu quero definir uma variável em repórteres do endereço groups['collectors'][0] ip. Mas a cartilha para a configuração de repórteres não é executada no grupo [collectors] , então os fatos para esse host não são coletados. Existe uma maneira de não codificar o endereço IP?

    
por hryamzik 21.10.2014 / 10:05

1 resposta

74

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

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

ou, se você quiser fazer isso por meio de um índice em um grupo:

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

O grande truque é que você precisa coletar os fatos para todos os hosts / grupos nos quais está interessado. Então, você quer modificar seu manual que é executado contra o grupo de repórteres para incluir uma tarefa não-op (fictícia). que é aplicado ao grupo de coletores. Isso fará com que o Ansible colete fatos sobre os hosts de coletores para que eles possam ser acessados pelo grupo de repórteres. Então, talvez você queira adicionar algo assim ao topo de seu manual de reportagens:

- 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 executar com seus repórteres.

Editar # 1

Ocorreu-me que eu também deveria mencionar que, a partir da versão 1.8 do Ansible, há um cache de fatos recurso que agora está disponível. O cache de fatos depende de um servidor redis para armazenar fatos entre execuções de playbook. Com ele ativado, um manual pode referenciar fatos obtidos por outro manual que foi executado anteriormente. O exemplo que a documentação do Ansible fornece:

Imagine, for instance, a very large infrastructure with thousands of hosts. Fact caching could be configured to run nightly, but configuration of a small set of servers could run ad-hoc or periodically throughout the day. With fact-caching enabled, it would not be necessary to “hit” all servers to reference variables and information about them.

    
por 23.10.2014 / 23:37