条件判断与错误处理:fail模块、failed_when、changed_when

2024-2-1 23:44 wsl Ansible自动化 阅读量:1041

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

 

 

 

 

版权所有:
文章标题:条件判断与错误处理:fail模块、failed_when、changed_when
文章链接:https://www.51itlab.net/?post=168
本站文章均为原创,未经授权请勿用于任何商业用途

热门标签