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

如何在Ansible Tower执行结束后汇总失败的断言?

汇总Ansible Playbook中失败的断言(无需自定义插件)

可以通过Ansible内置模块实现断言失败后的汇总,核心思路是先让所有断言执行完毕,再收集并筛选失败的结果,最后统一输出详情。以下是两种实用方案:

方案一:逐个注册断言结果(适合个性化配置)

如果每个断言需要单独设置参数,可采用此方法:

  1. 执行断言并注册结果
    开启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个断言的定义
  1. 收集失败断言
    遍历所有注册的断言结果,筛选出执行失败的项:
- name: 收集失败的断言
  ansible.builtin.set_fact:
    failed_assertions: "{{ failed_assertions | default([]) + [item] }}"
  loop:
    - "{{ assert_1_result }}"
    - "{{ assert_2_result }}"
    # 依次添加所有断言的注册变量
  when: item.failed
  1. 汇总并输出结果
    按需输出失败详情,可选终止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

方案二:循环批量执行断言(更简洁高效)

如果断言逻辑可批量定义,用循环能大幅减少重复代码:

  1. 定义断言集合
    在变量中统一配置所有断言的条件和失败提示:
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"
    # 继续添加剩余断言
  1. 批量执行断言
    循环遍历断言集合,统一注册所有结果:
- name: 批量执行所有断言
  ansible.builtin.assert:
    that: "{{ item.condition }}"
    fail_msg: "{{ item.fail_msg }}"
  ignore_errors: yes
  register: all_assert_results
  loop: "{{ check_assertions }}"
  1. 筛选并汇总失败断言
    直接从批量结果中提取失败项,输出汇总:
- 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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.21 18:05:11