Ansible 忽略任务中的错误,如果任何任务有错误,则在 playbook 结束时失败
Ansible Ignore errors in tasks and fail at end of the playbook if any tasks had errors
我正在学习 Ansible。我有一个 playbook 来清理资源,我希望 playbook 忽略每一个错误并一直持续到最后,如果有错误则在最后失败。
我可以忽略错误
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"
最后我怎么失败了?我有几项任务,我的 "When" 条件是什么?
使用Fail模块。
- 将 ignore_errors 用于您需要忽略以防出错的每个任务。
- 每当任何任务执行失败时设置一个标志(例如,result = false)
- 在 playbook 的最后,检查是否设置了标志,并根据该标志执行失败
- fail: msg="The execution has failed because of errors."
when: flag == "failed"
更新:
使用寄存器来存储您在示例中显示的任务的结果。然后,使用这样的任务:
- 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
详细了解块中的错误处理 here。
尝试failed_when
- 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
然后用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
并进行注册。从我发布的 link 和我的测试中,任务属性无论是否失败都会被注册。
示例输出:
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
我正在学习 Ansible。我有一个 playbook 来清理资源,我希望 playbook 忽略每一个错误并一直持续到最后,如果有错误则在最后失败。
我可以忽略错误
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"
最后我怎么失败了?我有几项任务,我的 "When" 条件是什么?
使用Fail模块。
- 将 ignore_errors 用于您需要忽略以防出错的每个任务。
- 每当任何任务执行失败时设置一个标志(例如,result = false)
- 在 playbook 的最后,检查是否设置了标志,并根据该标志执行失败
- fail: msg="The execution has failed because of errors." when: flag == "failed"
更新:
使用寄存器来存储您在示例中显示的任务的结果。然后,使用这样的任务:
- 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
详细了解块中的错误处理 here。
尝试failed_when
- 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
然后用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
并进行注册。从我发布的 link 和我的测试中,任务属性无论是否失败都会被注册。
示例输出:
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