You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何忽略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未触发,符合预期。

尝试过的方法及问题

  1. 使用set_fact筛选返回码为0的结果:
- set_fact:
    res: "{{ promiscuous.results | selectattr('rc','defined') | map(attribute='rc') | list }}"

得到结果:

ok: [host1] => {
    "res": [
       0,
       0,
       0,
    ]
}

但无法解决host2的任务失败导致handler不执行的问题。

  1. 添加ignore_errors: yes,host2的返回码列表为[0,1,0],但任务仍会标记为失败,handler依旧不执行。

目前困惑:任务中已使用with_subelements循环,handler中也有循环,不知道如何遍历有效结果;不确定block/rescue模块是否适用(不想回滚已做的变更)。


内容的提问来源于stack exchange,提问作者Junk

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.08.12 12:25:59