错误处理

概述

参考:

忽略失败的任务(ignore_errors)

默认情况下,当任意目标机器上的任务结果失败时,Ansible 都会停止继续执行,我们可以通过 ignore_errors 关键字忽略错误,以便继续执行后续任务。 ignore_errors 指令仅在任务能够运行并返回“失败”值时起作用。它不会让 Ansible 忽略未定义的变量错误、连接失败、执行问题(例如,缺少包)或语法错误。

改变任务状态(failed_when 与 changed_when)

Ansible 可以通过特定条件定义任务的执行状态,通过对 failed_whenchanged_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 的判断逻辑有时候很反直觉,使用时一定要万分注意


最后修改 October 4, 2023: 合并 commit (98ba273b)