亲爱的社区,我请求您的帮助。
我会创建一个游戏手册,它将使用输入中给定的宏地址,并且应该尊重Unix格式。然后,如果给定的地址符合所需的格式,则另一个任务将检查给定的宏地址是否与主机中的已存在的地址匹配,**如果不存在,它将显示the interface related to that macaddress (如果没有),任务将失败,并带有错误消息"No interfaces found with mac address '$MACADDRESS'. Fatal error."。
以下是我所做的,我不知道应该做些什么来实现这个目标:
- hosts: all
gather_facts: no
vars_prompt:
- name: "MACADDRESS"
prompt: "mac address?(please use Unix format ex- 1a:2b:3c:4d:5e:6f )"
private: no
tasks:
- name: check macaddresssyntax
debug:
msg: "{{ MACADDRESS | ansible.utils.hwaddr('unix') }}"
register: mac_syntax
failed_when: mac_syntax failed
- name: check local mac
debug:
var: mac_syntax |intersect (ansible_facts['default_ipv4']|selectattr('macaddress') | map(attribute='interface')|list)发布于 2022-06-01 13:46:32
debug任务的结果(因为它没有用)。如果您想在某人输入无效的MAC地址时失败,请使用fail任务:gather_facts设置为false,但是由于不能进行事实收集,Ansible不会为您提供任何事实。如果希望Ansible向您提供有关主机接口的信息,则需要启用事实收集。check local mac任务中要做什么,但这似乎完成了您所要求的内容:matched\_interface #变量具有#匹配的MAC地址,则将其设置为当前接口名。-名称:检查本地mac set_fact: matched_interface:"{{ ifname }}“时:>-查找(‘vars’,set_fact == MACADDRESS vars:#由于任何原因,ansible用\_替换接口#name中的-。如果名称:{{ item.replace('-',‘_’}}“循环:{{ ansible_interfaces }}”-调试: msg:“与{{ ansible_interfaces }}相关的接口是{{ matched_interface }}”时:matched_interface|default(假)-matched_interface|default: msg:“没有找到带有mac地址{ MACADDRESS }}的接口”时:Notmatched_interface|default(False)在我的系统上运行上面的剧本,它有一个与address a2:29:ab:4e:e7:74的接口,如下所示:
$ ansible-playbook playbook.yaml -e MACADDRESS='a2:29:ab:4e:e7:74
PLAY [localhost] ***************************************************************
TASK [Gathering Facts] *********************************************************
ok: [localhost]
TASK [check macaddresssyntax] **************************************************
skipping: [localhost]
TASK [check local mac] *********************************************************
skipping: [localhost] => (item=veth92b9a89f)
...
ok: [localhost] => (item=example)
skipping: [localhost] => (item=lo)
...
TASK [debug] *******************************************************************
ok: [localhost] => {
"msg": "the interface related to a2:29:ab:4e:e7:74 is example"
}
TASK [fail] ********************************************************************
skipping: [localhost]
PLAY RECAP *********************************************************************
localhost : ok=3 changed=0 unreachable=0 failed=0 skipped=2 rescued=0 ignored=0 如果我使用我的系统中不存在的MAC地址运行它,我得到:
TASK [check local mac] *********************************************************
skipping: [localhost] => (item=veth168ad56c)
...
TASK [debug] *******************************************************************
skipping: [localhost]
TASK [fail] ********************************************************************
fatal: [localhost]: FAILED! => {"changed": false, "msg": "no interfaces found with mac address a2:29:ab:4e:e7:77"}
PLAY RECAP *********************************************************************
localhost : ok=1 changed=0 unreachable=0 failed=1 skipped=3 rescued=0 ignored=0 发布于 2022-06-01 16:39:43
收集网络事实并获取接口列表。例如,
- setup:
gather_subset: network
- debug:
var: ansible_facts.interfaces给出
ansible_facts.interfaces:
- lo0
- lo1
- pflog0
- wlan0将声明放在下面作为适切
_ifcs: "{{ ansible_facts.interfaces|map('extract', ansible_facts)|list }}"
_macs: "{{ _ifcs|json_query('[].macaddress') }}"
_devs: "{{ _ifcs|json_query('[].device') }}"
_macs_valid: "{{ _macs|map('ansible.utils.hwaddr', 'bool')|
map('ternary', true, false)|list }}"
_dev_mac_valid: "{{ _devs|zip(_macs)|zip(_macs_valid)|
map('flatten')|
selectattr(2) }}"
dev_mac_valid: "{{ _dev_mac_valid|map('zip', ['dev', 'mac', 'valid'])|
map('map', 'reverse')|
map('community.general.dict') }}"
dev_mac: "{{ dev_mac_valid|items2dict(key_name='dev', value_name='mac') }}"
mac_dev: "{{ dev_mac_valid|items2dict(key_name='mac', value_name='dev') }}"例如,这些计算值为
_macs: [unknown, unknown, unknown, '00:12:00:34:56:78']
_macs_valid: [false, false, false, true]
_devs: [lo0, lo1, pflog0, wlan0]
_dev_mac_valid:
- [wlan0, '00:12:00:34:56:78', true]
dev_mac_valid:
- dev: wlan0
mac: 00:12:00:34:56:78
valid: true
dev_mac:
wlan0: 00:12:00:34:56:78
mac_dev:
00:12:00:34:56:78: wlan0问:“检查给定的宏地址是否与主机中的现有地址匹配”
A:使用字典mac_dev。例如,
- pause:
prompt: "Enter MAC address"
register: result
- set_fact:
macaddress: "{{ result.user_input }}"
- assert:
that: macaddress|ansible.utils.hwaddr('bool')
fail_msg: Wrong MAC address
- assert:
that: macaddress in mac_dev.keys()|list
fail_msg: "No interfaces found with mac address {{ macaddress }}"
success_msg: "Interfaces {{ mac_dev[macaddress] }} found
with mac address {{ macaddress }}"如果有更多的主机,请声明所有主机的字典。
mac_dev_hosts: "{{ dict(ansible_play_hosts|
zip(ansible_play_hosts|
map('extract', hostvars, 'mac_dev'))) }}"然后,把所有的东西放在一起,例如,剧本
- hosts: test_11,test_12,test_13
gather_facts: false
vars:
_ifcs: "{{ ansible_facts.interfaces|map('extract', ansible_facts)|list }}"
_macs: "{{ _ifcs|json_query('[].macaddress') }}"
_devs: "{{ _ifcs|json_query('[].device') }}"
_macs_valid: "{{ _macs|map('ansible.utils.hwaddr', 'bool')|
map('ternary', true, false)|list }}"
_dev_mac_valid: "{{ _devs|zip(_macs)|zip(_macs_valid)|
map('flatten')|
selectattr(2) }}"
dev_mac_valid: "{{ _dev_mac_valid|map('zip', ['dev', 'mac', 'valid'])|
map('map', 'reverse')|
map('community.general.dict') }}"
dev_mac: "{{ dev_mac_valid|items2dict(key_name='dev', value_name='mac') }}"
mac_dev: "{{ dev_mac_valid|items2dict(key_name='mac', value_name='dev') }}"
mac_dev_hosts: "{{ dict(ansible_play_hosts|
zip(ansible_play_hosts|
map('extract', hostvars, 'mac_dev'))) }}"
tasks:
- setup:
gather_subset: network
- set_fact:
mac_dev: "{{ mac_dev }}"
- block:
- debug:
var: mac_dev_hosts|to_nice_yaml
- pause:
prompt: "Enter MAC address"
register: result
- set_fact:
macaddress: "{{ result.user_input }}"
- assert:
that: macaddress|ansible.utils.hwaddr('bool')
fail_msg: Wrong MAC address
- assert:
that: macaddress in mac_dev_hosts|json_query('*.keys(@)')|flatten
fail_msg: "No interface found with mac address {{ macaddress }}"
- debug:
msg: "Interface {{ dev }} found with mac address {{ macaddress }}
at {{ hst }}"
vars:
itm: "{{ mac_dev_hosts|dict2items|
selectattr('value', 'contains', macaddress)|first }}"
hst: "{{ itm.key }}"
dev: "{{ itm.value[macaddress] }}"
run_once: true给出
PLAY [test_11,test_12,test_13] ***************************************************************
TASK [setup] *********************************************************************************
ok: [test_13]
ok: [test_12]
ok: [test_11]
TASK [set_fact] ******************************************************************************
ok: [test_13]
ok: [test_11]
ok: [test_12]
TASK [debug] *********************************************************************************
ok: [test_11] =>
mac_dev_hosts|to_nice_yaml: |-
test_11:
00:12:00:34:56:AA: wlan0
test_12:
00:12:00:34:56:BB: wlan0
test_13:
00:12:00:34:56:CC: wlan0
TASK [pause] *********************************************************************************
[pause]
Enter MAC address:
00:12:00:34:56:CC^Mok: [test_11]
TASK [set_fact] ******************************************************************************
ok: [test_11]
TASK [assert] ********************************************************************************
ok: [test_11] => changed=false
msg: All assertions passed
TASK [assert] ********************************************************************************
ok: [test_11] => changed=false
msg: All assertions passed
TASK [debug] *********************************************************************************
ok: [test_11] =>
msg: Interface wlan0 found with mac address 00:12:00:34:56:CC at test_13
PLAY RECAP ***********************************************************************************
test_11: ok=8 changed=0 unreachable=0 failed=0 skipped=0 rescued=0 ignored=0
test_12: ok=2 changed=0 unreachable=0 failed=0 skipped=0 rescued=0 ignored=0
test_13: ok=2 changed=0 unreachable=0 failed=0 skipped=0 rescued=0 ignored=0例如,如果MAC缺失,游戏就会失败。
TASK [assert] ********************************************************************************
fatal: [test_11]: FAILED! => changed=false
assertion: macaddress in mac_dev_hosts|json_query('*.keys(@)')|flatten
evaluated_to: false
msg: No interface found with mac address 00:12:00:34:56:FFhttps://stackoverflow.com/questions/72462535
复制相似问题