【问题标题】:How to ignore specific errors in an Ansible task如何忽略 Ansible 任务中的特定错误
【发布时间】:2022-12-28 17:35:36
【问题描述】:

如果有一个 Ansible 任务,有时会因为创建用户帐户期间的一些错误而失败。特别是如果用户帐户已经在使用中并且用户已登录。如果任务失败并显示特定错误消息,例如“用户帐户正在使用”,则播放必须继续。那时不需要失败,而只是在预定义的错误消息上。任务看起来像这样。

- name: modify user
  user:
    state: "{{ user.state | default('present') }}"
    name: "{{ user.name }}"
    home: "{{ user_base_path }}/{{ user.name }}"
    createhome: true

因为它不是 shell 命令,所以我不能简单地注册一个 var 并检查 .rc 的输出。当我注册一个 var 并在调试模式下打印它时,我也没有得到 stderr 或 stdout。这是我检查错误消息的第一种方法。我的想法用完了,如何过滤特定错误并通过任务,但其他一切都失败了。 ignore_errors: yes 不是一个好的解决方案,因为在某些情况下任务应该会失败。

【问题讨论】:

  • Register 可以在没有 shell 模块的情况下使用。
  • 这是正确的,但我没有将 rc 作为返回值,并且出于某种原因我也没有看到用户模块的 stdout 或 stderr。这使得很难过滤特定错误。

标签: ansible


【解决方案1】:

根据 ansible 文档,我们得到 stdoutstderr 作为返回字段。

我建议使用标志 ignore_errors: yes 并按照此示例捕获返回

---
- hosts: localhost
  vars:
    user:
      name: yash
    user_base_path: /tmp
  tasks:

    - name: modify user
      user:
        state: "{{ user.state | default('present') }}"
        name: "{{ user.name }}"
        home: "{{ user_base_path }}/{{ user.name }}"
        createhome: true
      register: user_status
      ignore_errors: yes

    - name: stdout_test
      debug:
        msg:  "{{ user_status.err }}"

    - name: Fail on not valid
      fail:
        msg: failed
      when: '"user account in use" not in user_status.err'

输出:

PLAY [localhost] *************************************************************************************************************************************************************************************

TASK [Gathering Facts] *******************************************************************************************************************************************************************************
ok: [localhost]

TASK [modify user] ***********************************************************************************************************************************************************************************
fatal: [localhost]: FAILED! => {"changed": false, "err": "<main> attribute status: eDSPermissionError
<dscl_cmd> DS Error: -14120 (eDSPermissionError)
", "msg": "Cannot create user "yash".", "out": "", "rc": 40}
...ignoring

TASK [stdout_test] ***********************************************************************************************************************************************************************************
ok: [localhost] => {
    "msg": "<main> attribute status: eDSPermissionError
<dscl_cmd> DS Error: -14120 (eDSPermissionError)
"
}

TASK [Fail on not valid] *****************************************************************************************************************************************************************************
fatal: [localhost]: FAILED! => {"changed": false, "msg": "failed"}

PLAY RECAP *******************************************************************************************************************************************************************************************
localhost                  : ok=3    changed=0    unreachable=0    failed=1    skipped=0    rescued=0    ignored=1   

【讨论】:

    【解决方案2】:

    您可以使用when,将返回值保存在registerset_fact,然后根据该值下注。

    【讨论】:

      【解决方案3】:

      您可以在没有 shell 模块的情况下使用 register

      该模块还有额外的return values

      检查这个使用:

      - name: modify user
        user:
          state: "{{ user.state | default('present') }}"
          name: "{{ user.name }}"
          home: "{{ user_base_path }}/{{ user.name }}"
          createhome: true
        register: modify_user_result
      
      - name: debug
        debug:
          var: modify_user_result
      

      【讨论】:

      • 这是如何“忽略特定错误”的?如@error404 所述,这会导致任务在没有 ignore_errors: yes 的情况下失败
      猜你喜欢
      • 2016-12-17
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2021-05-15
      相关资源
      最近更新 更多