忽略任务中的错误,如果任何任务有错误,则在剧本末尾失败

我在学习安塞尔语。我有一个剧本来清理资源,我希望剧本忽略每一个错误,并继续下去,直到结束,然后失败在最后,如果有错误。

我可以忽略错误

  ignore_errors: yes

如果是一个任务,我可以执行类似的操作(通过敏感的错误捕捉)

- name: this command prints FAILED when it fails
command: /usr/bin/example-command -x -y -z
register: command_result
ignore_errors: True


- name: fail the play if the previous command did not succeed
fail: msg="the command failed"
when: "'FAILED' in command_result.stderr"

我怎么会在最后失败? 我有几个任务,我的“什么时候”条件是什么?

195568 次浏览

使用 失败模块。

  1. 在发生错误时,对每个需要忽略的任务使用  。
  2. 每当任务执行失败时,设置一个标志(比如 result = false)
  3. 在剧本的末尾,检查是否设置了标志,根据这一点,执行失败
- fail: msg="The execution has failed because of errors."
when: flag == "failed"

更新:

使用 register 存储任务的结果,如示例中所示。然后,使用这样的任务:

- name: Set flag
set_fact: flag = failed
when: "'FAILED' in command_result.stderr"

失败模块工作得很好! 谢谢。

我必须在检查之前定义我的事实,否则我会得到一个未定义的变量错误。

我在设置引号和空格时遇到了问题。

这个方法奏效了:

set_fact: flag="failed"

这抛出了一些错误:

set_fact: flag = failed

您可以将所有可能在块中失败的任务包装起来,并对该块使用 ignore_errors: yes

tasks:
- name: ls
command: ls -la
- name: pwd
command: pwd


- block:
- name: ls non-existing txt file
command: ls -la no_file.txt
- name: ls non-existing pic
command: ls -la no_pic.jpg
ignore_errors: yes

阅读更多关于块 给你中的错误处理的信息。

试试 失败的时候

- name: Fail task when the command error output prints FAILED
ansible.builtin.command: /usr/bin/example-command -x -y -z
register: command_result
failed_when: "'FAILED' in command_result.stderr"

我发现这个很有帮助:

Https://medium.com/opsops/anternative-way-to-handle-errors-in-ansible-245a066c340

要在任务中注册该任务。

register: some_name

然后加入 ignore_errors: yes

然后使用 set_fact获取每个寄存器属性:

- set_fact:
success: '\{\{ not([e1, e2]|map(attribute="failed")|max) }}'

然后把这个放在街区的尽头:

- name: Fail server build
command: >
bash scripts/test_file.sh
when: success == false
ignore_errors: yes

上面的代码块只有在成功为 false时才会执行。密钥是使用 ignore_errors并制作一个寄存器。从我发布的链接和测试中,如果任务失败或没有失败,任务属性将被注册。

输出示例:

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


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


TASK [Task 1 test] *********************************************************************************************
fatal: [localhost]: FAILED! => {"changed": true, "cmd": ["bash", "scripts/unknown_file.sh"], "delta": "0:00:00.004343", "end": "2021-10-20 14:20:59.320389", "msg": "non-zero return code", "rc": 127, "start": "2021-10-20 14:20:59.316046", "stderr": "bash: scripts/unknown_file.sh: No such file or directory", "stderr_lines": ["bash: scripts/unknown_file.sh: No such file or directory"], "stdout": "", "stdout_lines": []}
...ignoring


TASK [Task 2 test] *********************************************************************************************
changed: [localhost]


TASK [set_fact] ************************************************************************************************
ok: [localhost]


TASK [Fail server build] ***************************************************************************************
changed: [localhost]


TASK [debug] ***************************************************************************************************
ok: [localhost] => {
"success": false
}


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

在我的例子中,是 command _ result。“”。我继续查看,“ FAILED”输出是 command _ result。Stdout.所以我把最后一个“什么时候”改成了:

when: "'FAILED' in command_result.stdout"

希望我能帮助别人。我也是个初学者。