首页 > 解决方案 > Ansible:如何获取ansible连接的主机的接口名称?

问题描述

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

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

我唯一的问题是接口可能不是 ens192,因为我有多个接口的主机。我总是需要 ansible 连接到主机的接口地址,这可能是 ensX

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

更新:

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

标签: ansible

解决方案


看起来您有一个可行的解决方案,但值得一提的是,您也可以查询路由表以获取该信息。该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将使用 interfacehe-ipv6和 source address 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 地址。


推荐阅读