Ansible技术问询:如何让任务标记失败但继续执行Playbook?
解决Ansible跨主机端口测试:失败标记但不终止剧本执行
针对你遇到的问题——既要让端口测试失败时显示红色错误标记,又要让整个剧本执行完毕不中途停止,以下是两种可行方案:
方案1:使用continue_on_error参数(Ansible 2.11+)
这是最简洁的方法,利用Ansible内置参数实现任务失败后继续执行,同时保留错误标记。
修改后的ISM主机测试片段:
- hosts: '{{ env_type }}_ism' gather_facts: false become_method: runas become_user: System tasks: - name: Test ISM to IRE 2861 ansible.windows.win_wait_for: host: "{{ item }}" port: 2861 timeout: 3 loop: "{{ groups[ire] }}" # 任务失败时标记为错误(红色显示) failed_when: true # 允许该主机后续任务继续执行 continue_on_error: yes
同理修改IRE主机的测试任务:
- hosts: '{{ env_type }}_ire' gather_facts: false become_method: runas become_user: System tasks: - name: Test IRE to IFS 445 ansible.windows.win_wait_for: host: "{{ item }}" port: 445 timeout: 3 loop: "{{ groups[afs] }}" failed_when: true continue_on_error: yes
说明
continue_on_error: yes:单个任务失败后,该主机的后续任务不会终止,继续执行failed_when: true:只要win_wait_for检测失败,就标记任务为错误(红色显示),无需额外捕获结果- 跨主机的play不受影响,即使某台主机的任务失败,其他主机的play仍会正常执行
方案2:兼容旧版Ansible(2.10及以下)
如果你的Ansible版本低于2.11,可以用register+fail+meta: clear_host_errors的组合实现:
- hosts: '{{ env_type }}_ism' gather_facts: false become_method: runas become_user: System tasks: - name: Test ISM to IRE 2861 ansible.windows.win_wait_for: host: "{{ item }}" port: 2861 timeout: 3 register: port_test ignore_errors: yes loop: "{{ groups[ire] }}" - name: Mark failed tests as errors ansible.builtin.fail: msg: "Port 2861 test failed for host {{ item.item }}" loop: "{{ port_test.results }}" when: item.failed # 标记错误但不终止后续任务 ignore_errors: no - name: Clear host error state to continue execution meta: clear_host_errors
说明
- 用
register捕获所有端口测试的结果 - 遍历结果,对失败的测试用
fail模块标记为错误(红色) meta: clear_host_errors清除主机的错误状态,确保后续任务能继续执行
注意事项
- 两种方案都不会终止整个剧本,所有跨主机的play都会执行完毕
- 失败的任务会在输出中显示为红色错误,便于快速定位问题
- 方案1的
continue_on_error是任务级参数,只影响当前主机的后续任务,其他主机不受影响
内容的提问来源于stack exchange,提问作者StanS
相关产品推荐
相关产品推荐

