如何处理来自 ansible 角色的错误

mon*_*onk 5 ansible

我一直在调用具有多个角色的剧本,每个角色都代表一个测试用例。如果角色之一在执行过程中失败,我需要运行剧本而不会失败。我正在使用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 }
Run Code Online (Sandbox Code Playgroud)

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

Vla*_*tka 5

一种选择是使用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 ] }}"
Run Code Online (Sandbox Code Playgroud)

并循环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([])
Run Code Online (Sandbox Code Playgroud)

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