ansible - 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 中使用。
解决方案
看起来您有一个可行的解决方案,但值得一提的是,您也可以查询路由表以获取该信息。该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 地址。
推荐阅读
- mongodb - Mongodb combine aggregate queries
- c++ - 向 avformat_open_input 添加超时
- jquery - 为什么我的 jquery .on('change') 不适用于动态更改的行
- c++ - 如何将 C++ 模板代码转换为等效的 C 代码
- javascript - Javascript 检查文件大小是否超过 25mb
- reactjs - 如何在反应中滚动到模态屏幕中的 Ref
- java - 我如何将 java 连接到 sqlite db 浏览器
- javascript - Javascript如何添加负数和正数
- python - OpenCV 将 VideoCap 属性设置为 CAP_PROP_CONVERT_RGB 会生成奇怪的布尔参数错误
- php - 用于连接到 Oracle 的 php 的 dockerfile 设置