错误处理
概述
参考:
忽略失败的任务(ignore_errors)
默认情况下,当任意目标机器上的任务结果失败时,Ansible 都会停止继续执行,我们可以通过 ignore_errors
关键字忽略错误,以便继续执行后续任务。
ignore_errors 指令仅在任务能够运行并返回“失败”值时起作用。它不会让 Ansible 忽略未定义的变量错误、连接失败、执行问题(例如,缺少包)或语法错误。
改变任务状态(failed_when 与 changed_when)
Ansible 可以通过特定条件定义任务的执行状态,通过对 failed_when
、changed_when
关键字指定的条件进行判断,用以定义 failed、changed、ok 等任务执行状态意味着什么。
failed_when
- 若结果为真,则任务执行结果变为
fatal
- 若结果为假,则任务执行结果变为
changed
changed_when
- 若结果为真,则任务执行结果变为
changed
- 若结果为假,则任务执行结果变为
ok
比如,我们常用 shell 模块执行一些命令,而 shell 模块的任务状态总是 changed 的~~如果一个 shell 命令执行后,没有变化,我们想让他将任务状态设为 ok,就可以通过 changed_when 功能,比如现在有如下两个任务
- name: Changed_when 判断的结果为真时,任务状态为 changed
shell:
cmd: "docker start changed_when"
register: is_started
changed_when: "'changed_when' in is_started['stdout']"
ignore_errors: true
- name: Changed_when 判断的结果为假时,任务状态为 ok
shell:
cmd: "docker start changed_when"
register: is_started
changed_when: "'changed_when' in is_started['stderr']"
ignore_errors: true
- name: Failed_when 判断的结果为真时,任务状态为 failed
shell:
cmd: "docker start failed_when"
register: is_started
failed_when: "'failed_when' in is_started['stdout']"
ignore_errors: true
- name: Failed_when 判断的结果为假时,任务状态为 changed
shell:
cmd: "docker start failed_when"
register: is_started
failed_when: "'failed_when' in is_started['stderr']"
ignore_errors: true
假设目标机器上已经有一个已经停止的,名为 test 的容器,则执行结果如下
~]# ansible-playbook -i inventory/test.yaml -e @inventory/test_password.yaml playbooks/error_handing.yaml
PLAY [test] ****************************************************************************************************************************************
TASK [error_handing : Changed_when 判断的结果为真时,任务状态为 changed] *****************************************************************************************
changed: [hw-cloud-xngy-jump-server-linux-2]
TASK [error_handing : Changed_when 判断的结果为假时,任务状态为 ok] **********************************************************************************************
ok: [hw-cloud-xngy-jump-server-linux-2]
TASK [error_handing : Failed_when 判断的结果为真时,任务状态为 failed] *******************************************************************************************
fatal: [hw-cloud-xngy-jump-server-linux-2]: FAILED! => {"changed": true, "cmd": "docker start failed_when", "delta": "0:00:00.253780", "end": "2022-
...ignoring
TASK [error_handing : Failed_when 判断的结果为假时,任务状态为 changed] ******************************************************************************************
changed: [hw-cloud-xngy-jump-server-linux-2]
PLAY RECAP *****************************************************************************************************************************************
hw-cloud-xngy-jump-server-linux-2 : ok=4 changed=3 unreachable=0 failed=0 skipped=0 rescued=0 ignored=1
由于启动一个容器,如果能正常启动,将会返回容器名,所以我们通过判断命令行的输出内容中是否包含 test 字符串来判断容器是否启动了
- 若容器还没启动,则命令行会返回字符串,那么 changed_when 的判断结果为真,说明产生了变化,则将任务状态设置为 changed;
- 若容器已经启动,则命令行不会返回任何字符串,那么 changed_when 的判断结果就为假,说明没有任何变化,此时任务状态则设置为 ok。
failed_when 的效果同理 注意:failed_when 与 changed_when 的判断逻辑有时候很反直觉,使用时一定要万分注意
反馈
此页是否对你有帮助?
Glad to hear it! Please tell us how we can improve.
Sorry to hear that. Please tell us how we can improve.