一、fail模块
在shell中,可能会有这样的需求:当脚本执行至某个阶段时,需要对某个条件进行判断,如果条件成立,则立即终止脚本的运行。在shell中,可以直接调用"exit"即可执行退出。事实上,在playbook中也有类似的模块可以做这件事。即fail模块。
fail模块用于终止当前playbook的执行,通常与条件语句组合使用,当满足条件时,终止当前play的运行。
选项只有一个:
- msg:终止前打印出信息(自定义报错信息)
# 使用fail模块中断playbook输出
---
- hosts: web1
tasks:
- shell: echo "error helllo ansible"
register: echo_test
- fail:
msg: "shell is error"
when: "'error' in echo_test.stdout"
- debug:
msg: "因为在fail模块中的when满足条件,即在stdout的标准输出里面出现了error字符,满足条件运行fail模块,并输出信息shell is error,退出后续任务执行,所以我不会出现哦"
二、failed_when
当fail和when组合使用的时候,还有一个更简单的写法,即failed_when,当满足某个条件时,ansible主动触发失败
如果在yy_test存在错误输出,且错误输出中,包含了`failed`字串,即返回失败状态:
---
- hosts: web1
gather_facts: no
tasks:
- shell: systemctl start nginx
register: yy_test
failed_when: "'failed' in yy_test.stderr"
- debug:
var: yy_test
stderr:返回的信息中标准错误输出
手动修改被控端nginx配置文件发生错误,systemctl start nginx启动失败
注意:failed_when的条件成立并不意味这shell模块中的命令执行失败了,只不过是达到了退出执行playbook的条件
通过fail模块和when条件语句,写成如下:
---
- hosts: web1
gather_facts: no
tasks:
- shell: systemctl start nginx
register: yy_test
ignore_errors: true
# failed_when: "'failed' in yy_test.stderr"
- fail:
msg: "nginx failed"
when: "yy_test.stderr and 'failed' in yy_test.stderr" # 'failed' in yy_test.stderr 当条件成立时,就会执行fail模块,退出playbook执行
- debug:
var: yy_test
手动修改被控端nginx配置文件发生错误,systemctl start nginx启动失败
三、changed_when
当我们控制一些远程主机执行某些任务时,当任务在远程主机上成功执行,状态发生更改时,会返回changed状态响应,状态未发生更改时,会返回OK状态响应,当任务被跳过时,会返回skipped状态响应。我们可以通过changed_when来手动更改changed响应状态。
当返回的结果rc = 0时,满足条件返回的结果是true,debug输出变量yy_test状态就会变成changed(输出显示黄色)
此时此刻的nginx是可以正常启动的,rc会返回0
---
- hosts: web1
gather_facts: no
tasks:
- shell: systemctl start nginx
register: yy_test
ignore_errors: true
- debug:
var: yy_test
changed_when: yy_test.rc == 0
当changed_when为false时,该条task在执行以后,永远不会返回changed状态:
---
- hosts: web1
gather_facts: no
tasks:
- copy:
content: changed_when
dest: /root/yyds.txt
changed_when: False