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?

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.


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
Ao utilizar nosso site, você reconhece que leu e compreendeu nossa Política de Cookies e nossa Política de Privacidade.
Licensed under cc by-sa 3.0 with attribution required.