example - ansible playbook format
Ansible: obtener la dirección IP del host objetivo actual (7)
¿Cómo se obtiene la dirección IP del host actual en un rol?
Sé que puede obtener la lista de grupos a los que pertenece el host y el nombre de host del host, pero no puedo encontrar una solución para obtener la dirección IP.
Puede obtener el nombre de host usando
{{inventory_hostname}}
y el grupo usando
{{group_names}}
He intentado cosas como
{{ hostvars[{{ inventory_hostname }}][''ansible_ssh_host''] }}
e
ip="{{ hostvars.{{ inventory_hostname }}.ansible_ssh_host }}"
El siguiente fragmento devolverá la IP pública de la máquina remota y también la IP predeterminada (es decir, LAN)
Esto imprimirá ip entre comillas también para evitar confusiones al usar archivos de configuración.
>> main.yml
---
- hosts: localhost
tasks:
- name: ipify
ipify_facts:
- debug: var=hostvars[inventory_hostname][''ipify_public_ip'']
- debug: var=hostvars[inventory_hostname][''ansible_default_ipv4''][''address'']
- name: template
template:
src: debug.j2
dest: /tmp/debug.ansible
>> templates/debug.j2
public_ip={{ hostvars[inventory_hostname][''ipify_public_ip''] }}
public_ip_in_quotes="{{ hostvars[inventory_hostname][''ipify_public_ip''] }}"
default_ipv4={{ hostvars[inventory_hostname][''ansible_default_ipv4''][''address''] }}
default_ipv4_in_quotes="{{ hostvars[inventory_hostname][''ansible_default_ipv4''][''address''] }}"
Otra forma de encontrar IP pública sería utilizar el módulo
uri
:
- name: Find my public ip
uri:
url: http://ifconfig.me/ip
return_content: yes
register: ip_response
Su IP estará en
ip_response.content
Puede obtener la dirección IP de
hostvars
, dict
ansible_default_ipv4
y la
address
clave
hostvars[inventory_hostname][''ansible_default_ipv4''][''address'']
y dirección IPv6 respectivamente
hostvars[inventory_hostname][''ansible_default_ipv6''][''address'']
Un ejemplo de libro de jugadas:
---
- hosts: localhost
tasks:
- debug: var=hostvars[inventory_hostname][''ansible_default_ipv4''][''address'']
- debug: var=hostvars[inventory_hostname][''ansible_default_ipv6''][''address'']
Puede usar en su template.j2
{{ ansible_eth0.ipv4.address }}
la misma manera que usa
{{inventory_hostname}}
.
pd: Consulte la siguiente publicación de blog para obtener más información sobre CÓMO RECOPILAR INFORMACIÓN SOBRE HOSTS REMOTOS CON HECHOS DE REUNIONES ANIBLES .
''esperando que ayude a alguien algún día ッ
Si desea la IP pública externa y se encuentra en un entorno de nube como AWS o Azure, puede usar el módulo 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:
Esto colocará la IP pública en la variable
ipify_public_ip
.
Una lista de todas las direcciones se almacena en un hecho
ansible_all_ipv4_addresses
, una dirección predeterminada en
ansible_default_ipv4.address
.
---
- hosts: localhost
connection: local
tasks:
- debug: var=ansible_all_ipv4_addresses
- debug: var=ansible_default_ipv4.address
Luego hay direcciones asignadas a cada interfaz de red ... En tales casos, puede mostrar todos los hechos y encontrar el que tiene el valor que desea utilizar.
http://docs.ansible.com/ansible/latest/plugins/lookup/dig.html
así en plantilla, por ejemplo:
{{ lookup(''dig'', ansible_host) }}
Notas:
- Dado que no solo se puede usar el nombre DNS en el inventario, se debe agregar una verificación si no es IP.
- Obviamente, este recibo no funcionaría según lo previsto para las especificaciones indirectas del host (como usar hosts de salto, por ejemplo)
Pero aún sirve el 99% (en sentido figurado) de los casos de uso.