Подтвердить что ты не робот

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

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

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

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

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

4b9b3361

Ответ 1

Список всех адресов хранится в факте 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

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

Ответ 2

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

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

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

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

Пример playbook:

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

Ответ 3

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

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

'надеясь, что однажды он поможет кому-то ッ

Ответ 4

Если вы хотите внешний публичный 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.

Ответ 5

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

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

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

Заметки:

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

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

Ответ 6

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

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

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

Ответ 7

Следующий фрагмент вернет публичный 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'] }}"