comment accéder à la variable hôte d'un hôte différent avec Ansible?

45

Supposons qu'un hôte collecte des données et les place dans un groupe [collectors]. J'ai aussi des hôtes en groupe [reporters]. Donc, je veux définir une variable sur les journalistes de l' groups['collectors'][0]adresse IP. Mais le manuel de création de rapporteurs ne fonctionne pas sur un [collectors]groupe, donc les informations relatives à cet hôte ne sont pas collectées. Est-il possible de ne pas coder en dur l'adresse IP?

hryamzik
la source

Réponses:

87

Vous pouvez accéder à peu près à tous les faits / variables d'inventaire en procédant comme suit:

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

ou, si vous voulez le faire via un index dans un groupe:

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

Le gros truc est que vous devez collecter les faits pour tous les hôtes / groupes qui vous intéressent. Vous voudriez donc modifier votre livre de jeu qui fonctionne contre le groupe de journalistes afin d'inclure une tâche non-op (factice) appliquée au groupe de collectionneurs. Ansible collectera ainsi des informations sur les hôtes des collecteurs afin de pouvoir y accéder à partir du groupe de rapporteurs. Donc, vous voudrez peut-être ajouter quelque chose comme ceci en haut de votre classeur de journalistes:

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

Les crochets vides signifient en principe qu'aucune tâche ne sera exécutée, mais cela obligera Ansible à rassembler des informations sur les collecteurs afin que vous puissiez ensuite les référencer dans les tâches que vous exécutez contre vos journalistes.

Modifier # 1

Je me suis dit que je devrais aussi mentionner que depuis la version 1.8 de Ansible, une fonctionnalité de mise en cache des faits est maintenant disponible. La mise en cache des faits repose sur un serveur Redis pour stocker les faits entre les exécutions du livre de lecture. Lorsque cette fonction est activée, un livre de lecture peut faire référence à des faits obtenus par un autre livre de lecture exécuté précédemment. L'exemple de la documentation Ansible donne:

Imaginez, par exemple, une très grande infrastructure avec des milliers d’hôtes. La mise en cache des faits peut être configurée pour s'exécuter de nuit, mais la configuration d'un petit ensemble de serveurs peut s'exécuter de manière ponctuelle ou périodique tout au long de la journée. Avec la mise en cache des faits activée, il ne serait pas nécessaire de «toucher» tous les serveurs pour référencer les variables et les informations les concernant.

Bruce P
la source
2
Est-il possible de définir l'index associatif en tant que variable? par exemple ansible localhost --extra-vars "metamorphosis_ip = 172.16.3.73" -a "echo {{hostvars [{{metamorphosis_ip}}] ['inv_domain']}}"
corretge
Pour ajouter à la réponse ci-dessus, assurez-vous de référencer la FAQ Ansible ici: docs.ansible.com/ansible/faq.html, qui explique des choses en détail, telles que la boucle sur un groupe d'hôtes ou la définition d'une variable pour obtenir un hôte spécifique. dans un groupe.
einarc
Merci pour l'idée de récupérer des faits à partir d'un nœud avec une liste de tâches vide.
pedz