Ansible Netbox自动化:如何根据IP获取对应网络接口名称?
Ansible遍历多IP接口生成IP-接口映射
收集到的接口数据
"interface_ips": { "br0": { "ipv4": [ "10.0.0.10", "10.0.0.11" ], "ipv6": [], "mac": "aa:bb:cc:dd:ee:ff", "mtu": "1500", "type": "bridge" }, "lxcbr0": { "ipv4": [ "10.100.0.10" ], "ipv6": [], "mac": "ff:ee:dd:cc:bb:aa", "mtu": "1500", "type": "bridge" } }
需求
遍历所有IPv4和IPv6地址,生成每个IP对应的接口名称列表,期望输出:
- 10.0.0.10 - br0 - host
- 10.0.0.11 - br0 - host
- 10.100.0.10 - lxcbr0 - host
尝试的错误任务
仅能获取每个接口的第一个IPv4地址,无法遍历所有地址:
- name: Extract IPv4 addresses and interface names set_fact: ip_interface_map: "{{ ip_interface_map | default({}) | combine({item.value.ipv4[0]: item.key}) }}" loop: "{{ interface_ips | dict2items }}"
解决方案
使用loop遍历每个接口,再通过map处理该接口下的所有IP地址,将其格式化为目标字符串并收集到列表中:
- name: 生成IP-接口映射列表 set_fact: ip_interface_list: >- {{ ip_interface_list | default([]) + item.value.ipv4 | map('regex_replace', '^(.*)$', '\1 - ' ~ item.key ~ ' - host') | list + item.value.ipv6 | map('regex_replace', '^(.*)$', '\1 - ' ~ item.key ~ ' - host') | list }} loop: "{{ interface_ips | dict2items }}"
说明
interface_ips | dict2items:将接口字典转换为{key: 接口名, value: 接口详情}的列表格式,方便遍历。- 对每个接口的
ipv4和ipv6列表,用map结合regex_replace给每个IP添加接口名和固定后缀- host。 - 将处理后的IPv4、IPv6地址列表合并到
ip_interface_list中,最终得到所有IP的映射条目。
执行完成后,ip_interface_list变量就会包含你期望的所有条目,可直接用于后续输出或Netbox自动化操作。
内容的提问来源于stack exchange,提问作者Mateusz Jasek
相关产品推荐
相关产品推荐

