我正试图从写入该值的变量中获取与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: true
或setup
模块。