一、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