Ansible: получить текущий IP-адрес целевого хоста

102

Как получить текущий IP-адрес хоста в роли?

Я знаю, что вы можете получить список групп, членом которых является хост, и имя хоста, но я не могу найти решение для получения IP-адреса.

Вы можете получить имя хоста, используя {{inventory_hostname}}и группу, используя{{group_names}}

Я пробовал такие вещи, как {{ hostvars[{{ inventory_hostname }}]['ansible_ssh_host'] }} иip="{{ hostvars.{{ inventory_hostname }}.ansible_ssh_host }}"

SJC
источник

Ответы:

127

Список всех адресов хранится в факте ansible_all_ipv4_addresses, адрес по умолчанию - в ansible_default_ipv4.address.

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

Затем каждому сетевому интерфейсу назначаются адреса ... В таких случаях вы можете отобразить все факты и найти тот, который имеет значение, которое вы хотите использовать.

Techraf
источник
Как вы показываете все флаги?
SJC,
1
Можете ли вы перечислить все флаги в задаче?
SJC
2
@SJC Флаги? Вы имеете в виду факты, верно? Да, запускать setup:модуль с помощью register: allfactsи отображать с помощью- debug: var=allfacts
techraf 03 окт.2016,
4
значение gather_factsдолжно быть, trueчтобы это работало. по умолчанию оно истинно, но можно изменить его на ложь, если информация о хостах не требуется.
shshnk
1
@poige Может быть неправильно, если вы зададите новый вопрос, как и вы.
techraf
70

Вы можете получить IP-адрес hostvars, dict ansible_default_ipv4и keyaddress

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

и IPv6-адрес соответственно

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

Пример сценария:

---
- hosts: localhost
  tasks:
    - debug: var=hostvars[inventory_hostname]['ansible_default_ipv4']['address']
    - debug: var=hostvars[inventory_hostname]['ansible_default_ipv6']['address']
Pasi H
источник
Это может произойти сбой в некоторых случаях увидеть это: medium.com/opsops/...
RafalS
25

Вы можете использовать в своем template.j2 так {{ ansible_eth0.ipv4.address }}же, как и {{inventory_hostname}}.

ps: Пожалуйста, обратитесь к следующему сообщению в блоге, чтобы получить дополнительную информацию о том, КАК СОБИРАТЬ ИНФОРМАЦИЮ ОБ УДАЛЕННЫХ ХОЗЯЙКАХ С ДОСТУПНЫМИ ФАКТАМИ О GATHERS .

'Надеюсь, однажды это кому-то поможет ッ

Орсиус
источник
13
Будьте особенно осторожны. В настоящее время сетевой интерфейс по умолчанию не всегда «eth0». Иногда это называется ens3или enp2s0и тому подобное. У вас просто лучшие ставки, если вы используете, ansible_default_ipv4и если он не работает, тогда переключитесь обратно в поисках разумных значений по умолчанию.
Габор Гарами
4
Вероятно, раньше это работало, но в Ansible 2.7 эта переменная не определена.
Дирк
5

Если вам нужен внешний общедоступный IP-адрес и вы находитесь в облачной среде, такой как AWS или Azure, вы можете использовать модуль 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:

Это поместит публичный IP в переменную ipify_public_ip.

Саймон Вудсайд
источник
Это не всегда работает. Для меня ipify_public_ipпеременная пуста
Давиде
2
Для AWS inventory_hostname будет IP-адресом.
Беренд де Бур
Этот плагин может работать при определенных обстоятельствах: если вы выходите в Интернет через NAT, он не будет работать. В основном это работает, когда серверы доступны в Интернете и могут попасть на веб-сайт ipify.org для разрешения своего внешнего IP-адреса при доступе к сайту.
slm
1
@BerenddeBoer Неправильно. inventory_hostnameэто то, что установлено в инвентаре. Это может быть заданное имя хоста .ssh/config.
Teresa e Junior
@slm, как я уже сказал, если вы ищете внешний публичный IP. Если вы находитесь за NAT, у вас не будет внешнего общедоступного IP-адреса, поэтому вы бы не использовали этот метод.
Саймон Вудсайд
4

Другой способ найти общедоступный IP-адрес - использовать uriмодуль:

    - name: Find my public ip
      uri: 
        url: http://ifconfig.me/ip
        return_content: yes
      register: ip_response

Ваш IP будет в ip_response.content

хава
источник
Другой URL-адрес службы, который возвращает то же самое:https://ipecho.net/plain
Пол Паркер,
@PaulParker ipecho.net/plain кажется нокаутом или спрашивает токен api ... ifconfig.me лучший и стабильный сервис с годами: +1
bastien
Никогда не просили токен API. Я не могу говорить о стабильности сервиса, я не следил за ним, но он меня никогда не подводил.
Пол Паркер
3

Простая команда отладки:

ansible -i inventory/hosts.yaml -m debug -a "var=hostvars[inventory_hostname]" all

вывод:

"hostvars[inventory_hostname]": {
    "ansible_check_mode": false, 
    "ansible_diff_mode": false, 
    "ansible_facts": {}, 
    "ansible_forks": 5, 
    "ansible_host": "192.168.10.125", 
    "ansible_inventory_sources": [
        "/root/workspace/ansible-minicros/inventory/hosts.yaml"
    ], 
    "ansible_playbook_python": "/usr/bin/python2", 
    "ansible_port": 65532, 
    "ansible_verbosity": 0, 
    "ansible_version": {
        "full": "2.8.5", 
        "major": 2, 
        "minor": 8, 
        "revision": 5, 
        "string": "2.8.5"
    }, 

получить IP-адрес хоста:

ansible -i inventory/hosts.yaml -m debug -a "var=hostvars[inventory_hostname].ansible_host" all

zk01 | SUCCESS => {
    "hostvars[inventory_hostname].ansible_host": "192.168.10.125"
}
NOZUON ВЫСОКИЙ
источник
2

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

так в шаблоне, например:

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

Ноты:

  • Поскольку в инвентаре можно использовать не только DNS-имя, лучше добавить проверку, не IP-адрес.
  • Очевидно, что эта квитанция не будет работать, как предполагалось для косвенных спецификаций хоста (например, с использованием хостов перехода, например)

Но все же он обслуживает 99% (образно говоря) вариантов использования.

Poige
источник
1
А что, если DNS в среде не используется?
techraf
(Или я чувствую вашу боль. В противном случае вы не будете задавать такие наивные вопросы.) - Если DNS не используется в инвентаре, просто используйте ansible_host напрямую, как указано в моем ответе.
poige
1
Что делать, если ansible_hostречь идет не об IP-адресе хоста?
techraf
это не «а что». Просто «что», потому что ваш ранее заданный вопрос не учитывается, не забывайте.
poige
1
Я понятия не имею, что вы называете «настоящим IP-адресом». Вы знаете какие-то нереальные?
poige
1

В некоторых случаях простой ansible_default_ipv4.addressможет быть не тем, что вы думаете , используйте:

ansible_default_ipv4.address|default(ansible_all_ipv4_addresses[0])
РафальС
источник
0

Следующий фрагмент вернет общедоступный IP-адрес удаленного компьютера, а также IP-адрес по умолчанию (например, LAN)

Это также напечатает ip в кавычках, чтобы избежать путаницы при использовании файлов конфигурации.

>> 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'] }}"

Ахил Джалагам
источник
2
Некоторые комментарии вы бы улучшить этот ответ
Marged
0

Просто используйте ansible_ssh_hostпеременную

playbook_example.yml

- hosts: host1
  tasks:
  - name: Show host's ip
    debug:
      msg: "{{ ansible_ssh_host }}"

hosts.yml

[hosts]
host1   ansible_host=1.2.3.4

Результат

TASK [Show host's ip] *********************************************************************************************************************************************************************************************
ok: [host1] => {
     "msg": "1.2.3.4"
}
Андрей Быстринин
источник