Ansible: отримати поточну IP-адресу цільового хоста


100

Як отримати поточну IP-адресу хосту в ролі?

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

Ви можете отримати ім'я хосту за допомогою, {{inventory_hostname}}а групу за допомогою{{group_names}}

Я пробував такі речі, як {{ hostvars[{{ inventory_hostname }}]['ansible_ssh_host'] }} іip="{{ hostvars.{{ inventory_hostname }}.ansible_ssh_host }}"

Відповіді:


124

Список усіх адрес зберігається у факті 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

Потім є адреси, присвоєні кожному мережевому інтерфейсу ... У таких випадках ви можете відобразити всі факти та знайти той, що має значення, яке ви хочете використовувати.


Як ви відображаєте всі прапори?
ВСС

1
Чи можете ви перерахувати всі прапори всередині завдання?
ВСС

2
@SJC Прапори? Ви маєте на увазі факти, правда? Так, запустити setup:модуль з register: allfactsі відобразити за допомогою- debug: var=allfacts
techraf

4
значення gather_factsповинно бути trueдля того, щоб це працювало. це істинно за замовчуванням, але можна перетворити його на false, якщо інформація про хости не потрібна.
shshnk

1
@poige Це може бути неправильно, якщо ви ставите нове запитання, як і ви.
techraf

69

Ви можете отримати 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']

У деяких випадках це може не вдатися, див. Це: medium.com/opsops/…
RafalS

25

Ви можете використовувати у своєму template.j2 так {{ ansible_eth0.ipv4.address }}само, як і ви {{inventory_hostname}}.

ps: Будь ласка, зверніться до наступного допису блогу, щоб отримати більше інформації про те, ЯК ЗБІРАТИ ІНФОРМАЦІЮ ПРО ДИСТАНЦІЙНІ ДОМАЙНЕРИ З МОЖЛИВИМИ ФАКТАМИ ЗБИРАННЯ .

'сподіваючись, що колись це допоможе комусь ッ


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, ім'я_інвентаря_хосту буде 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 здається KO або попросити апі маркер ... ifconfig.me краще і стабільний сервіс з років: +1
Бастьєн

Ніколи не запитували маркер API. Я не можу говорити про узгодженість послуги, я не стежив за нею, але це ніколи не підводило мене.
Пол Паркер,

2

Проста команда налагодження:

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

1

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

так у шаблоні, наприклад:

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

Примітки:

  • Оскільки не тільки ім'я DNS може використовуватися в інвентаризації, перевірку, якщо це вже не IP, краще додавати
  • Очевидно, що ця квитанція не працюватиме, як призначено для непрямих специфікацій хостів (наприклад, використання хостів переходу, наприклад)

Але все-таки він обслуговує 99% (образно кажучи) випадків використання.


1
А що, якщо DNS не використовується в середовищі?
techraf

(Або я відчуваю твій біль. Інакше ти не будеш задавати наївних запитань подібним чином.) - Якщо DNS не використовується в інвентаризації, просто використовуй ansible_host безпосередньо, як зазначено у моїй відповіді.
Poige

1
Abs, що якщо 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"
}
Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.