今天碰到一个需求,当使用ansible-playbook在执行一个脚本后,根据脚本返回的内容判断是否继续往下执行还是中断执行,查询官网发现使用register寄存器可以实现记录脚本输出,使用when+fail模块来判断是否往下继续执行或者中断,以下是一个简单例子:

ansible服务在172.16.133.128上,先执行一个脚本,脚本返回success时在172.16.133.129上创建一个目录/tmp/test,如果返回failed则中断执行

先在172.16.133.129上配置一个简单脚本/tmp/test.sh

#!/bin/bash
echo "failed"

配置yml文件test.yml,先配置执行脚本部分


  • hosts: 172.16.133.129
    remote_user: root
    tasks:

    • command: /tmp/test.sh
      register: result
      这里使用了register寄存器,具体寄存了什么内容,可以使用-v参数来查看输出

使用ansible-playbook运行

[root@localhost ansible]# ansible-playbook -v test.yml
PLAY [172.16.133.129] *
GATHERING FACTS *
**

ok: [172.16.133.129]
TASK: [command /tmp/test.sh] **
changed: [172.16.133.129] => {"changed": true, "cmd": ["/tmp/test.sh"], "delta": "0:00:00.002602", "end": "2016-04-11 17:00:57.227517", "rc": 0, "start": "2016-04-11 17:00:57.224915", "stderr": "", "stdout": "failed", "warnings": []}
PLAY RECAP ****
172.16.133.129 : ok=2 changed=1 unreachable=0 failed=0
register保存的信息就时“=>”后面的字典信息,信息保存在result变量中

可以看到"stdout"就是脚本的标准输出信息,这时可以使用"when"来判断是否执行或者跳过

修改test.yml


  • hosts: 172.16.133.129
    remote_user: root
    tasks:

    • command: /tmp/test.sh
      register: result

    • file: path=/tmp/test state=directory
      when: result.stdout == ‘failed‘
      当脚本输出为‘failed‘时就会执行创建目录操作,输出不为‘failed‘,则跳过执行

执行yml后输出如下:

[root@localhost ansible]# ansible-playbook -v test.yml

PLAY [172.16.133.129] *****

GATHERING FACTS ***
ok: [172.16.133.129]

TASK: [command /tmp/test.sh] **
changed: [172.16.133.129] => {"changed": true, "cmd": ["/tmp/test.sh"], "delta": "0:00:00.002618", "end": "2016-04-11 17:11:07.957097", "rc": 0, "start": "2016-04-11 17:11:07.954479", "stderr": "", "stdout": "failed", "warnings": []}

TASK: [file path=/tmp/test state=directory] ***
changed: [172.16.133.129] => {"changed": true, "gid": 0, "group": "root", "mode": "0755", "owner": "root", "path": "/tmp/test", "size": 4096, "state": "directory", "uid": 0}

PLAY RECAP ****
172.16.133.129 : ok=3 changed=2 unreachable=0 failed=0

修改test.sh,输出‘success‘,然后执行test.yml

[root@localhost ansible]# ansible-playbook -v test.yml

PLAY [172.16.133.129] *****

GATHERING FACTS ***
ok: [172.16.133.129]

TASK: [command /tmp/test.sh] **
changed: [172.16.133.129] => {"changed": true, "cmd": ["/tmp/test.sh"], "delta": "0:00:00.002611", "end": "2016-04-11 17:14:08.456293", "rc": 0, "start": "2016-04-11 17:14:08.453682", "stderr": "", "stdout": "success", "warnings": []}

TASK: [file path=/tmp/test state=directory] ***
skipping: [172.16.133.129]

PLAY RECAP ****
172.16.133.129 : ok=2 changed=1 unreachable=0 failed=0
可以看到当stdout为success时,创建目录的操作直接跳过了

现在回到最终要达到的目的,当脚本输出为‘failed‘时,我们要中断ansible-playbook执行,而不是跳过,这时需要配合fail模块来实现,并且可以抛出自定义信息

修改test.sh文件,输出‘failed‘

修改test.yml


  • hosts: 172.16.133.129
    remote_user: root
    tasks:

    • command: /tmp/test.sh
      register: result

    • name: if stdout ‘failed‘ ,Interrupt execution
      fail: msg="check failed"
      when: result.stdout == ‘failed‘

    • file: path=/tmp/test state=directory
      如果脚本执行返回‘failed‘,中断执行,并抛出信息"check failed"

[root@localhost ansible]# ansible-playbook -v test.yml

PLAY [172.16.133.129] *****

GATHERING FACTS ***
ok: [172.16.133.129]

TASK: [command /tmp/test.sh] **
changed: [172.16.133.129] => {"changed": true, "cmd": ["/tmp/test.sh"], "delta": "0:00:00.002632", "end": "2016-04-11 17:27:47.248996", "rc": 0, "start": "2016-04-11 17:27:47.246364", "stderr": "", "stdout": "failed", "warnings": []}

TASK: [check ,Interrupt execution] ****
failed: [172.16.133.129] => {"failed": true}
msg: check failed

FATAL: all hosts have already failed -- aborting

PLAY RECAP ****
to retry, use: --limit @/root/test.retry

172.16.133.129 : ok=2 changed=1 unreachable=0 failed=1
playbook运行到第二个task时就会报错并抛出msg

ansible官网文档:http://docs.ansible.com/ansible/playbooks_conditionals.html#register-variables

注:寄存器中的数据都可以拿来使用,如"rc","stderr"等,当然也有很多种方法,文中的‘failed‘是严格匹配,也可以使用模糊查找,如result.stdout.find(‘failed‘) != -1也可以达到相同的效果

本文出自 “漂泊的鱼” 博客,请务必保留此出处http://faded.blog.51cto.com/6375932/1762688

转载于:https://blog.51cto.com/lookingdream/2054763

ansible-playbook如何判断并中断执行相关推荐

  1. ansible的条件判断、迭代执行、tags

    在ansible中支持条件判断,这使我们操作更加灵活 使用when进行条件测试 示例1: 将 testservers 组中的其中一台主机上的 httpd 服务卸载掉,另外主机不卸载 1 2 3 4 5 ...

  2. ansible playbook play task执行顺序

    当我们使用ansible-playbook执行playbook,我们可以指定一个或者多个playbook,而一个playbook中可以有多个play,这些play下面又会存在一个或者多个task,这些 ...

  3. Python+Django+Ansible Playbook自动化运维项目实战(二)

    Python+Django+Ansible Playbook自动化运维项目实战 一.资产管理,自动化发现.扫描 1.服务端资产探测.扫描发现 1)资产管理的资产: 2)抽象与约定: 2.探测协议和模块 ...

  4. Python+Django+Ansible Playbook自动化运维项目实战:资产管理

    Python+Django+Ansible Playbook自动化运维项目实战 一.资产管理,自动化发现.扫描 1.服务端资产探测.扫描发现 1)资产管理的资产: 2)抽象与约定: 2.探测协议和模块 ...

  5. Ansible playbook

    一.Ansible playbook 简介和使用场景 1.简介 playbook 是 ansible 用于配置,部署,和管理被控节点的剧本. 通过 playbook 的详细描述,执行其中的一系列 ta ...

  6. ansible playbook详细教程(笔记)

    ctrl F  执行playbook命令   ansible ­playbook -­i "inventory文件名" playbook.yml ­f 10 (并行级别10) 加参 ...

  7. ansible———playbook剧本

    ansible--playbook剧本 文章目录 ansible--playbook剧本 一.主机清单 二.Yaml文件 三.playbook剧本 四.Handlers介绍 五.条件测试 一.主机清单 ...

  8. Ansible PlayBook语法

    PlayBook语法实例 playbook是由一个或多个play组成的列表,play的主要功能在于将事先归并为一组的主机装扮成事先通过Ansible中的tasks定义好的角色(play的内容被称为ta ...

  9. ansible——playbook剧本的讲解与应用

    目录 一.playbook  概述 1.1  playbook  介绍 1.2  Ansible playbook 使用场景 1.3 yaml基本语法规则 1.4 yaml支持的数据结构 1.3  示 ...

最新文章

  1. HashSet 和 TreeSet的区别
  2. Boost:等待和通知操作的模糊测试
  3. Linux驱动编程 step-by-step (七) 并发 竞态 (信号量与自旋锁)
  4. Toolbar详解 · Material Design Part 2
  5. anaconda 卸载_Windows安装Anaconda使用教程
  6. opencv历史代码下载
  7. UnrealVS插件使用简介(UBT编译,UE4热更新)
  8. 全国计算机软件专业二本大学排名,2017全国二本大学专业排名
  9. kafka在rack间平衡replica
  10. idea 的Igonre 设置
  11. 神威太湖之光入门指南
  12. Wordpress 网站设计入门 把Wordpress放在一个独立子目录下
  13. 一文说明前端和后端的区别、职业发展以及就业前景!
  14. 推流是什么,直播为什么要推流
  15. python学习——函数
  16. 股票投资 - 如何看懂集合竞价
  17. 配置JDK和Tomcat环境变量
  18. 4台机器完全分布式安装hadoop,bigbrother的补充
  19. 想要成为数据分析师 需要具备哪些专业技能?
  20. 【Opencv】-----倾斜图片转正

热门文章

  1. 怎么让html 整体加大,让一个Html元素撑满整个屏幕可以这样玩
  2. js导出的xlsx无法打开_js-xlsx实现文件导出、下载(excel)
  3. python 爬带端口的网站_程序员带你爬取爬虫最爱扒的网站数据。快来看!
  4. Android应用程序模块:应用、任务、进程和线程
  5. 服务器常用shell巡检脚本
  6. 第一篇:数据库基本管理(mysql)
  7. 学计算机科学与技术考研考哪些专业课程,计算机科学与技术考研考哪些科目 备考技巧有哪些...
  8. selenium java 验证码_如何使用Selenium WebDriver和Java从图像(验证码)中读取文本
  9. android opengl es 纹理 不同设备 白色,android – OpenGL ES 2.0纹理没有在某些设备上显示...
  10. java 反射field_java – 使用反射获取Field的泛型类型