如何忽略Ansible任务内错误,确保网卡混杂模式配置任务持续运行?
Ansible网卡混杂模式配置问题
需求:遍历指定网卡,为未开启混杂模式(promiscuous mode)的网卡启用该模式。但部分节点存在不存在的网卡,导致整个主机任务失败,其他存在的网卡也无法被处理。
原Playbook
--- - hosts: all gather_facts: no tasks: - name: Check promisc mode on shell: "ip a | grep '{{ item.1.name }}'" register: promisc notify: check promiscuous with_subelements: - "{{ interface }}" - client handlers: - name: check promisc loop: "{{ promisc.results | rejectattr('stdout','contains','PROMISC') | map(attribute='item') | list }}" shell: "ip l set dev '{{ item.1.name }}' promisc on"
执行输出
changed: [host1] => (item=[{}, {'name': 'eth0'}]) changed: [host2] => (item=[{}, {'name': 'eth0'}]) changed: [host1] => (item=[{}, {'name': 'eth1'}]) failed: [host2] (item=[{}, {'name': 'eth1'}]) => {"ansible_loop_var": "item", "changed": true, "cmd": "ip a | grep 'eth1'", "delta": "0:00:00.007615", "end": "2022-11-14 10:05:33.972555", "item": [{}, {"name": "eth1"}], "msg": "non-zero return code", "rc": 1, "start": "2022-11-14 10:05:33.964940", "stderr": "", "stderr_lines": [], "stdout": "", "stdout_lines": []} changed: [host1] => (item=[{}, {'name': 'eth2' }]) changed: [host2] => (item=[{}, {'name': 'eth2'}]) RUNNING HANDLER [check promiscuous] ********************************************************************************************************************************************* PLAY RECAP ****************************************************************************************************************************************************************** host1 : ok=1 changed=1 unreachable=0 failed=0 skipped=1 rescued=0 ignored=0 host2 : ok=0 changed=0 unreachable=0 failed=1 skipped=0 rescued=0 ignored=0
问题分析
- host2因eth1不存在,
Check promisc mode on任务失败,导致该主机后续的handler完全被忽略,而host2上实际存在的eth0、eth2都未开启混杂模式。 - host1所有网卡已开启混杂模式,因此handler未触发,符合预期。
尝试过的方法及问题
- 使用
set_fact筛选返回码为0的结果:
- set_fact: res: "{{ promiscuous.results | selectattr('rc','defined') | map(attribute='rc') | list }}"
得到结果:
ok: [host1] => { "res": [ 0, 0, 0, ] }
但无法解决host2的任务失败导致handler不执行的问题。
- 添加
ignore_errors: yes,host2的返回码列表为[0,1,0],但任务仍会标记为失败,handler依旧不执行。
目前困惑:任务中已使用with_subelements循环,handler中也有循环,不知道如何遍历有效结果;不确定block/rescue模块是否适用(不想回滚已做的变更)。
内容的提问来源于stack exchange,提问作者Junk
相关产品推荐
相关产品推荐

