如何在Ansible Tower执行结束后汇总失败的断言?
汇总Ansible Playbook中失败的断言(无需自定义插件)
可以通过Ansible内置模块实现断言失败后的汇总,核心思路是先让所有断言执行完毕,再收集并筛选失败的结果,最后统一输出详情。以下是两种实用方案:
方案一:逐个注册断言结果(适合个性化配置)
如果每个断言需要单独设置参数,可采用此方法:
- 执行断言并注册结果
开启ignore_errors: yes保证所有断言都能执行,同时将每个断言的结果注册到独立变量:
- name: 执行断言1 ansible.builtin.assert: that: - "inventory_hostname in groups['web_servers']" fail_msg: "断言1失败:当前主机不在web_servers组中" ignore_errors: yes register: assert_1_result - name: 执行断言2 ansible.builtin.assert: that: - "ansible_facts['memory_mb']['real']['total'] > 2048" fail_msg: "断言2失败:主机内存不足2GB" ignore_errors: yes register: assert_2_result # 重复上述结构,完成所有20-30个断言的定义
- 收集失败断言
遍历所有注册的断言结果,筛选出执行失败的项:
- name: 收集失败的断言 ansible.builtin.set_fact: failed_assertions: "{{ failed_assertions | default([]) + [item] }}" loop: - "{{ assert_1_result }}" - "{{ assert_2_result }}" # 依次添加所有断言的注册变量 when: item.failed
- 汇总并输出结果
按需输出失败详情,可选终止Playbook:
- name: 输出失败断言汇总 ansible.builtin.debug: msg: | 以下断言执行失败: {% for assert in failed_assertions %} - {{ assert.msg }} {% endfor %} when: failed_assertions is defined and failed_assertions | length > 0 - name: 存在失败断言则终止Playbook ansible.builtin.fail: msg: | 共检测到{{ failed_assertions | length }}个断言失败,详情: {% for assert in failed_assertions %} - {{ assert.msg }} {% endfor %} when: failed_assertions is defined and failed_assertions | length > 0
方案二:循环批量执行断言(更简洁高效)
如果断言逻辑可批量定义,用循环能大幅减少重复代码:
- 定义断言集合
在变量中统一配置所有断言的条件和失败提示:
vars: check_assertions: - condition: "inventory_hostname in groups['web_servers']" fail_msg: "断言1失败:当前主机不在web_servers组中" - condition: "ansible_facts['memory_mb']['real']['total'] > 2048" fail_msg: "断言2失败:主机内存不足2GB" - condition: "ansible_facts['distribution'] == 'Ubuntu'" fail_msg: "断言3失败:主机操作系统不是Ubuntu" # 继续添加剩余断言
- 批量执行断言
循环遍历断言集合,统一注册所有结果:
- name: 批量执行所有断言 ansible.builtin.assert: that: "{{ item.condition }}" fail_msg: "{{ item.fail_msg }}" ignore_errors: yes register: all_assert_results loop: "{{ check_assertions }}"
- 筛选并汇总失败断言
直接从批量结果中提取失败项,输出汇总:
- name: 提取失败的断言 ansible.builtin.set_fact: failed_assertions: "{{ all_assert_results.results | selectattr('failed', 'equalto', true) | list }}" - name: 展示失败断言汇总 ansible.builtin.debug: msg: | 失败断言列表: {% for assert in failed_assertions %} - {{ assert.msg }} {% endfor %} when: failed_assertions | length > 0 - name: 存在失败断言时终止Playbook ansible.builtin.fail: msg: "共{{ failed_assertions | length }}个断言失败,详情见上方汇总" when: failed_assertions | length > 0
关键说明
- 两种方案均使用Ansible内置模块(
assert、set_fact、debug、fail)实现,无需编写自定义Python插件。 - 通过
ignore_errors: yes确保所有断言执行完毕,不会因单个失败中断流程。 - 自定义的
fail_msg能直接在汇总中展示问题详情,无需在日志中逐个查找。
内容的提问来源于stack exchange,提问作者Saikat
相关产品推荐
相关产品推荐

