解析JSON输出以获取Mac地址的相应IP地址



我正试图从写入该值的变量中获取与MAC地址00 0C 29 DC 5B C2相对应的IP地址:

"arp.stdout_lines": [
"iso.3.6.1.2.1.4.22.1.2.1.192.168.0.2 "00 50 56 EC 7B 82 "",
"iso.3.6.1.2.1.4.22.1.2.1.192.168.0.128 "00 0C 29 DC 5B C2 "",
"iso.3.6.1.2.1.4.22.1.2.1.192.168.0.254 "00 50 56 EA F9 67 ""
]

我试着用以下方式来做:

tasks:
- set_fact:
matched:
"{{ arp | regex_search( 'hi', '\1' ) }}"
vars:
hi: "{{ iso.3.6.1.2.1.4.22.1.2.1.(.*)\"00 50 56 EC 7B 81 \" }}"
register: matched 

但什么都不起作用

选择行,将第一个项目拆分为点,并连接最后四个元素,例如

- set_fact:
matched: "{{ matched|d([]) + [item[-4:]|join('.')] }}"
loop: "{{ arp.stdout_lines|select('search', _mac)|
map('split')|map('first')|
map('split', '.')|list }}"
vars:
_mac: 00 0C 29 DC 5B C2

给出

matched:
- 192.168.0.128

一种系统的方法是使用ansible.netcommon.cli_parse并创建一个模板库。

考虑到您想要与网络相关的过滤,一种稍微不同的方法是使用ansible_facts来获取与给定Mac地址对应的IP地址。

- set_fact:
matched: "{{ ansible_facts[item]['ipv4']['address'] }}"
loop: "{{ ansible_interfaces }}"
when:
- ansible_facts[item]['macaddress'] is defined
- ansible_facts[item]['macaddress'] == "00:0c:29:dc:5b:c2"

请注意,这需要运行gather_facts: truesetup模块。

最新更新