Ansible: Как получить имя интерфейса хоста, с которого ansible подключается? - PullRequest
1 голос
/ 05 января 2020

Я бы хотел определить интерфейсный IPv6-адрес хоста, с которого ansible подключается, и использовать его в качестве переменной в моей книге воспроизведения. Я знаю, как получить адрес ipv6 из фактов:

{{ ansible_facts['ens192']['ipv6'][0]['address'] }}

Моя единственная проблема в том, что интерфейс может быть чем-то другим, кроме ens192, потому что у меня есть хосты с несколькими интерфейсами. Мне всегда нужен адрес этого интерфейса, где ansible подключается к хосту, который может быть ensX

. Если бы вы могли предоставить мне решение для IPv4, для меня этого достаточно. :) Обратите внимание, что default_ipv4_address не работает для меня, потому что интерфейс по умолчанию не всегда, где идет соединение ansible.

ОБНОВЛЕНИЕ:

Я думаю, было бы хорошо, если бы я мог получить адрес IPv6, к которому подключается ansible, и каким-то образом получить его переменную. Поэтому, если ansible подключается к host1.something.local и имеет IPv6-адрес: 2001: 1: 2: 3 :: 4, получите этот IPv6-адрес как переменную и используйте его в playbook.

Ответы [ 3 ]

1 голос
/ 06 января 2020

Похоже, у вас есть решение, которое работает, но за то, что оно того стоит, вы могли бы просто запросить эту информацию в ваших таблицах маршрутизации. Команда ip route get покажет вам как имя интерфейса, так и адрес источника, используемый для подключения к другому хосту. Например:

$ ip route get 2607:f8b0:4006:800::200e
2607:f8b0:4006:800::200e from :: via 2001:470:1f06:46f::1 dev he-ipv6 proto static src 2001:470:1f06:46f::2 metric 675 pref medium

Из вышеприведенного вывода мы видим, что соединение с 2607:f8b0:4006:800::200e будет использовать интерфейс he-ipv6 и адрес источника 2001:470:1f06:46f::2.

. Вы можете использовать это в вот такая пьеса:

---
- hosts: targethost
  tasks:
    - name: get local address
      delegate_to: localhost
      command: >-
        ip route get {{ hostvars['targethost'].ansible_default_ipv6.address }}
      register: route

    - set_fact:
        local_address: "{{ dict(route_parts|zip(route_parts[1:])).src }}"
        local_interface: "{{ dict(route_parts|zip(route_parts[1:])).dev }}"
      vars:
        route_parts: "{{ route.stdout.splitlines()[0].split()[1:] }}"

    - debug:
        msg:
          - "local address: {{ local_address }}"
          - "local interface: {{ local_interface }}"

Это должно работать как с адресами ipv4, так и с ipv6.

0 голосов
/ 06 января 2020

1. Это самый простой способ получить IP-адрес по умолчанию, на который маршрут по умолчанию указывает

"{{ ansible_default_ipv6.address }}"

Что касается переменной ansible_default_ipv6, вы можете получить дополнительную информацию.

такие как имя интерфейса, шлюз, адрес ma c и т. д.

2. другой метод обхода

Из этой переменной можно получить все ipv6-адреса хоста

"{{ ansible_all_ipv6_addresses }}"

И по IP-адресу вы можете различить guish IP-адрес, который находится в том же «сегменте сети» ansible хост

Советы: замените ipv6 на ipv4, тоже отлично работает

0 голосов
/ 05 января 2020

Окей, я думаю, что нашел это:

{{ hostvars[inventory_hostname]['ansible_env'].SSH_CONNECTION.split(' ')[2] }}

Это получит адрес, к которому подключается ansible. Если IPv6 предпочтителен, то это будет адрес IPv6. В противном случае это будет адрес IPv4.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...