【问题标题】:How to deal with errors coming from ansible roles如何处理来自 ansible 角色的错误
【发布时间】:2019-08-26 12:18:26
【问题描述】:

我一直在调用具有多个角色的剧本,每个角色都表示一个 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


    【解决方案1】:

    一个选项是使用Blocksrescue部分

    创建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,避免包含的角色内部的潜在冲突。如果变量在包含的角色中使用,则以下救援部分会将错误的项目添加到列表中。

    【讨论】:

    • 对不起,我很困惑。我已经创建了 include_role.yml 现在如何将角色传递给它,例如 - { role: CHECK_CONNECTION, ignore_errors: yes, tags: always } ??
    • 我在答案中添加了一个 my_roles 示例。您可能希望根据自己的需要进行调整。
    • 它在第一个角色上失败并且没有让第二个角色运行,我认为需要忽略错误?我能做到吗?
    • 阻止/救援部分不需要忽略错误 (RTD)。如果其他角色依赖于崩溃的角色,它们可能会崩溃。在 rescue 部分中,您必须清理/准备所有内容以供其他角色通过。 rescue 部分的目的是继续游戏。救援部分也不应该崩溃。如果您遇到问题,请关注How to create a Minimal, Complete, and Verifiable example 并更新问题。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2014-10-03
    • 2014-12-05
    • 1970-01-01
    相关资源
    最近更新 更多