Ansible:如何获取Ansible连接所在主机的接口名?

Ansible:如何获取Ansible连接所在主机的接口名?,ansible,Ansible,我想确定主机的接口ipv6地址,ansible从该地址连接,并在我的playbook中将其用作变量。我知道如何从以下事实中获取ipv6地址: {{ ansible_facts['ens192']['ipv6'][0]['address'] }} 我唯一的问题是接口可能不是ens192,因为我有多个接口的主机。我总是需要ansible连接到主机的接口地址,可能是ensX 如果您能为我提供IPv4解决方案,对我来说已经足够好了。:)请注意,默认的ipv4地址对我不起作用,因为默认接口并不总是ans

我想确定主机的接口ipv6地址,ansible从该地址连接,并在我的playbook中将其用作变量。我知道如何从以下事实中获取ipv6地址:

{{ ansible_facts['ens192']['ipv6'][0]['address'] }}
我唯一的问题是接口可能不是ens192,因为我有多个接口的主机。我总是需要ansible连接到主机的接口地址,可能是ensX

如果您能为我提供IPv4解决方案,对我来说已经足够好了。:)请注意,默认的ipv4地址对我不起作用,因为默认接口并不总是ansible连接的来源

更新:


我想如果我能得到ansible连接的IPv6地址,并以某种方式得到它的变量,那将是一件好事。因此,如果ansible连接到host1.something.local,并且它有一个IPv6地址:2001:1:2:3::4,则将该IPv6地址作为变量并在playbook中使用。

好的,我想我找到了它:

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

这将获得ansible连接到的地址。如果首选IPv6,则它将是IPv6地址。否则,它将是一个IPv4地址。

看起来您已经找到了一个可行的解决方案,但为了实现它的价值,您还可以查询路由表以获取该信息。
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地址。

1。这是获取默认路由指向的默认ip地址的最简单方法

"{{ ansible_default_ipv6.address }}"
对于变量
ansible\u default\u ipv6
,您可以获得更多信息

如接口名称、网关、mac地址等

2.另一种变通方法

您可以从此变量获取主机的所有ipv6地址

"{{ ansible_all_ipv6_addresses }}"
根据ip地址, 您可以区分ansible主机的同一“网段”中的ip地址


提示:将
ipv6
替换为
ipv4
,效果也不错

有点复杂,但我接受这个解决方案,因为它正是我问题的答案。以后可能有用。这将不起作用。我第一次尝试了一下,但是ansible_default_ipvx_address将为我提供netowrk的地址,其中默认路由设置为。这并不总是ansible连接到的地址。(想想有一个本地网络并且ansible连接到那里的情况)