ansible 默认会检查命令和模块的返回状态,并进行相应的错误处理,通常遇到错误就中断 playbook 的执行,这些默认行为都是可以改变的

Ansible技术问答:http://linux.xyz/topic/Ansible

1、忽略错误

- name: this will not be counted as a failure
 command: /bin/false
 ignore_errors: yes

command 和 shell 模块执行的命令如果返回非零状态码则 ansible 判定这两个模块执行失 败,可以通过 ignore_errors: yes 忽略返回状态码

- name: this will not be counted as a failure
 command: shell_cmd || /bin/true

2、自定义错误:failed_when

不依靠返回状态码,而是自定义错误判定条件

- name: this command prints FAILED when it fails
 command: /usr/bin/example-command -x -y -z
 register: command_result
 failed_when: "command_result.stderr and 'FAILED' in command_result.stderr"

这个例子中,命令不依赖返回状态码来判定是否执行失败,而是要查看命令返回内容是否有FAILED 字符串,如果包含此字符串则判定命令执行失败。

实际中的应用:

---
- hosts: 192.168.0.105
 gather_facts: no
 sudo: yes
 sudo_user: coc
 tasks:
 - shell: ps -U coc|grep _coc_game|wc -l #计算指定进程数,如果有三个进程则为启动成功
 register: cmd_result
 failed_when: "'3' not in cmd_result.stdout" #如果进程数量不为 3,则表示启动失败
 failed_when: cmd_result.stdout != 3 #经过测试,用 jinja2 语法写也是可以的

3、自定义状态:changed_when

ansible 会自动判断模块执行状态,command、shell 及其他模块如果修改了远程主机状态,则被判定为 changed 状态,不过可以自己决定达到 changed 状态的条件

tasks:
 - shell: /usr/bin/billybass --mode="take me to the river"
 register: bass_result
 changed_when: "bass_result.rc != 2" #命令返回状态码不为 2,则为 changed状态
 # this will never report 'changed' status
 - shell: wall 'beep'
 changed_when: False #永远也不会达到 changed 状态