首页 > 解决方案 > 如何处理来自 ansible 角色的错误

问题描述

我一直在调用具有多个角色的剧本,每个角色都表示一个 TESTCASE。如果其中一个角色在执行期间失败,我需要运行剧本而不失败。我正在使用ignore_errors: yes. 但是,这确实忽略了错误,我需要在最后打印失败的角色的名称?是否可以 ?

- hosts: WEB
  gather_facts: no
  vars:
  roles:
    - { role: CHECK_CONNECTION, ignore_errors: yes, tags: always }
    - { role: CHECK_CPU, ignore_errors: yes, tags: always }
    - { role: CHECK_MEM, ignore_errors: yes, tags: always }

问题:如何执行整个剧本并最后打印失败的角色?

标签: ansible

解决方案


一个选项是使用Blocks的救援部分

创建include_role.yml

- name: include role
  block:
    - include_role:
        name: "{{ item_my_role }}"
  rescue:
    - set_fact:
        failed_roles: "{{ failed_roles|default([]) + [ item_my_role ] }}"

并循环include_tasks。无法循环块。

vars:
  my_roles:
    - CHECK_CONNECTION
    - CHECK_CPU
    - CHECK_MEM
tasks:
- include_tasks: include_role.yml
  loop: "{{ my_roles }}"
  loop_control:
    loop_var: item_my_role
- debug:
    var: failed_roles|default([])

使用loop_control loop_var并创建唯一变量,例如item_my_role,避免包含角色内部的潜在冲突。如果变量在包含的角色中使用,则以下救援部分会将错误的项目添加到列表中。


推荐阅读