144 votes

Ansible : obtenir l'adresse IP de l'hôte cible actuel

Comment obtenir l'adresse IP de l'hôte actuel dans un rôle ?

Je sais que vous pouvez obtenir la liste des groupes dont l'hôte est membre et le nom d'hôte de l'hôte mais je ne trouve pas de solution pour obtenir l'adresse IP.

Vous pouvez obtenir le nom d'hôte en utilisant {{inventory_hostname}} et le groupe en utilisant {{group_names}}

J'ai essayé des choses comme {{ hostvars[{{ inventory_hostname }}]['ansible_ssh_host'] }} et ip="{{ hostvars.{{ inventory_hostname }}.ansible_ssh_host }}"

163voto

techraf Points 30698

Une liste de toutes les adresses est stockée dans un fait ansible_all_ipv4_addresses une adresse par défaut dans ansible_default_ipv4.address .

---
- hosts: localhost
  connection: local
  tasks:
    - debug: var=ansible_all_ipv4_addresses
    - debug: var=ansible_default_ipv4.address

Ensuite, il y a les adresses attribuées à chaque interface réseau... Dans ce cas, vous pouvez afficher tous les faits et trouver celui qui a la valeur que vous voulez utiliser.

0 votes

Comment afficher tous les drapeaux ?

0 votes

ansible <host> -m setup ou all au lieu de hostname pour tous les hôtes dans le fichier d'inventaire

1 votes

Pouvez-vous énumérer tous les drapeaux à partir d'une tâche ?

89voto

Pasi H Points 1129

Vous pouvez obtenir l'adresse IP à partir de hostvars , dict ansible_default_ipv4 et la clé address

hostvars[inventory_hostname]['ansible_default_ipv4']['address']

et l'adresse IPv6 respectivement

hostvars[inventory_hostname]['ansible_default_ipv6']['address']

Un exemple de livre de jeu :

---
- hosts: localhost
  tasks:
    - debug: var=hostvars[inventory_hostname]['ansible_default_ipv4']['address']
    - debug: var=hostvars[inventory_hostname]['ansible_default_ipv6']['address']

2 votes

Cela peut échouer dans certains cas, voir ceci : medium.com/opsops/

0 votes

Ce n'est pas l'adresse à laquelle ansible se connecte. Elle peut correspondre, mais ce n'est pas obligatoire.

28voto

Orsius Points 371

Vous pouvez utiliser dans votre modèle.j2 {{ ansible_eth0.ipv4.address }} de la même manière que vous utilisez {{inventory_hostname}} .

ps : Veuillez vous référer au blogpost suivant pour avoir plus d'informations sur COMMENT COLLECTER DES INFORMATIONS SUR DES HÔTES DISTANTS AVEC ANSIBLE GATHERS FACTS .

en espérant que cela aidera quelqu'un un jour

16 votes

Soyez très prudent. De nos jours, l'interface réseau par défaut n'est pas toujours 'eth0'. Elle s'appelle parfois ens3 o enp2s0 et d'autres choses du genre. Vous avez juste de meilleurs paris si vous utilisez ansible_default_ipv4 et si ça ne marche pas, alors revenez en arrière et cherchez des valeurs par défaut raisonnables.

7 votes

Cela fonctionnait probablement dans le passé, mais avec Ansible 2.7, cette variable est indéfinie.

0 votes

Ce n'est pas l'adresse à laquelle ansible se connecte. Elle peut correspondre, mais ce n'est pas obligatoire.

5voto

sbwoodside Points 3860

Si vous voulez le IP publique externe et que vous vous trouvez dans un environnement en nuage comme AWS ou Azure, vous pouvez utiliser la fonction Module ipify_facts :

# TODO: SECURITY: This requires that we trust ipify to provide the correct public IP. We could run our own ipify server.
- name: Get my public IP from ipify.org
  ipify_facts:

Ceci placera l'IP publique dans la variable ipify_public_ip .

0 votes

Cela ne fonctionne pas toujours. Pour moi ipify_public_ip la variable est vide

2 votes

Pour AWS, inventory_hostname sera l'adresse IP.

0 votes

Ce plugin peut fonctionner dans certaines circonstances, si vous accédez à l'Internet derrière un NAT, il ne fonctionnera pas. En fait, il fonctionne lorsque les serveurs sont accessibles à l'internet et peuvent utiliser le site ipify.org pour résoudre leur IP externe lorsqu'ils accèdent au site.

4voto

poige Points 166

http://docs.ansible.com/ansible/latest/plugins/lookup/dig.html

ainsi dans le modèle, par exemple :

{{ lookup('dig', ansible_host) }}

Notes :

  • Puisque le nom DNS n'est pas le seul à pouvoir être utilisé dans l'inventaire, il est préférable d'ajouter une vérification si ce n'est pas déjà une IP.
  • Il est évident que ce reçu ne fonctionnerait pas comme prévu pour les spécifications indirectes des hôtes (comme l'utilisation d'hôtes de saut, par exemple).

Il n'en reste pas moins qu'il répond à 99 % (au sens figuré) des cas d'utilisation.

1 votes

Et que se passe-t-il si le DNS n'est pas utilisé dans l'environnement ?

0 votes

(Si le DNS n'est pas utilisé dans l'inventaire un, il suffit d'utiliser ansible_host directement comme indiqué dans ma réponse.

1 votes

Abs et si ansible_host n'est pas l'adresse IP de l'hôte en question ?

Prograide.com

Prograide est une communauté de développeurs qui cherche à élargir la connaissance de la programmation au-delà de l'anglais.
Pour cela nous avons les plus grands doutes résolus en français et vous pouvez aussi poser vos propres questions ou résoudre celles des autres.

Powered by:

X