【问题标题】:Ansible: How to get the interface name of the host machine where ansible connect from?Ansible:如何获取ansible连接的主机的接口名称?
【发布时间】:2020-04-23 12:07:35
【问题描述】:

我想确定主机的接口 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


    【解决方案1】:

    看起来您有一个可行的解决方案,但值得一提的是,您也可以在路由表中查询该信息。 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 地址。

    【讨论】:

    • 有点复杂,但我接受该解决方案,因为它是我问题的确切答案。以后可能有用。
    【解决方案2】:

    好吧,我想我找到了:

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

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

    【讨论】:

      【解决方案3】:

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

      "{{ ansible_default_ipv6.address }}"
      

      至于变量ansible_default_ipv6,您可以获取更多信息。

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

      2.另一种解决方法

      你可以从这个变量中获取主机的所有ipv6地址

      "{{ ansible_all_ipv6_addresses }}"
      

      并根据ip地址, 您可以区分在ansible主机的同一“网段”中的IP地址

      提示:将ipv6 替换为ipv4,也可以正常工作

      【讨论】:

      • 这行不通。我第一次尝试了,但是 ansible_default_ipvx_address 会告诉我该网络的地址,默认路由设置为。这并不总是 ansible 连接的地址。 (想想本地网络和ansible连接到那里的情况)
      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2019-10-31
      • 2021-01-17
      • 1970-01-01
      • 2017-08-08
      • 2017-02-08
      相关资源
      最近更新 更多