ansible-playbook如何判断并中断执行

今天碰到一个需求,当使用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运行

[[email protected] 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后输出如下:

[[email protected] 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

[[email protected] 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"

[[email protected] 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也可以达到相同的效果

时间: 2024-08-07 02:39:51

ansible-playbook如何判断并中断执行的相关文章

ansible playbook 详解

上篇文章介绍了 ansible 的安装配置及实例:http://msiyuetian.blog.51cto.com/8637744/1748143 下面这篇文章主要介绍 ansible 的 playbook 详解,playbook 就是相当于把模块或函数写入到配置文件里面,然后我们执行该配置文件来达到远程运维自动化的目的. 一.playbook的简单使用 1.创建文件实例 1)编辑配置文件 [[email protected] ~]# cd /etc/ansible/ [[email prote

ansible playbook使用总结

Ansible playbook的使用 playbooks概念 task: 任务:使用各模块所执行的特性操作任务,比如:-m user -a 'name= password=' Variables: 变量: Templates: 模板 在定义模板后可以实现各节点对应的变量来取代,表达式自身会根据当前节点所赋值做运算,之后生成的值则赋予这个参数,用于生产不同配置的配置文件,所以模板主要实现配置不同场景文本文件 而且这种使用模板语言来定义 模板语言中可以根据定义替换成特定主机的某些值 handler

ansible使用二(ansible playbook)

ansible playbook ansible playbooks 是使用ansible简单的配置管理部署系统的基础,使用YAML语法格式的配置文件.每一个playbook中包含一系列的任务.使用ansible playbook可以更方便的管理.维护多态主机. 1.yaml语法    yaml是”YAML Ain't a Markup Language”的缩写,即不是一种标记性语言,它是一种直观的能够被电脑识别的数据序列化格式,是一个可读性高并且容易被人类阅读,容易和脚本语言交互,用来表达资料

Ansible PlayBook语法(4)

title: Ansible PlayBook语法(4) date: 2018-12-02 10:53:24 tags: Ansible categories: Ansible copyright: true --- Ansible是新出现的自动化运维工具,基于Python开发,集合了众多运维工具(puppet.cfengine.chef.func.fabric)的优点,实现了批量系统配置.批量程序部署.批量运行命令等功能,ansible是基于模块工作的,本身没有批量部署的能力,真正具有批量部署

运维自动化之ansible playbook一键化解决大量主机bash更新问题

今天发现有bash漏洞,但我这里近1000台服务器,为了方便.省时间,觉得使用ansible安装bash更新包,下面分享一下我的安装方法. 1.安装的playbook的内容 19:00:03 # cd /etc/ansible [email protected]:/etc/ansible 19:00:06 # cat update_bash.yml  --- - hosts: "{{ host }}"   remote_user: "{{ user }}"   ga

ansible playbook yummodule error

ansible playbookweb.yaml[[email protected] Desktop]# cat web.yaml- name: web servers  remote_user: root  hosts: webservers tasks:  - name: install httpd    yum: name=httpd state=present  - name: httpd service     service: name=httpd enabled=yes state

Ansible playbook API 开发 调用测试

Ansible是Agentless的轻量级批量配置管理工具,由于出现的比较晚(13年)基于Ansible进行开发的相关文档较少,因此,这里通过一些小的实验,结合现有资料以及源码,探索一下Ansible的二次开发. 随笔的内容分为三个部分 playbook编辑执行 python 调用API执行playbook java调用python程序进行playbook的执行 实验的环境是centos6,ansible版本是1.9.4,python版本是2.6.6,jdk版本是1.7U79 一.playboo

自动化运维工具ansible playbook和roles的使用

ansible的结构: Inventory 用来定义被控制端 Modules 定义被控制端可用的操作 Ad Hoc Commands 定义被控制端可以执行命令的 Playbook 批量运行的方式 Tasks: 任务:由各模块所支持执行的特定操作:可以通过ansible-doc module_name来查看帮助文档,非常详细 -m  user -a 'name= password=' Variables: 变量 Templates: 模板:(如执行httpd服务时,各节点上httpd的配置文件内容

Ansible playbook 批量修改服务器密码 先普通后root用户

fsckzy Ansible playbook 批量修改服务器密码 客户的需求:修改所有服务器密码,密码规则为Rfv5%+主机名后3位 背景:服务器有CentOS6.7,SuSE9.10.11,root不能直接登录,需先登录普通用户,再切换到root. 首先在hosts 下面添加一个组[test],下面跟ip,每行一个. ansible基于ssh连接inventory中指定的远程主机时,将以此处的参数指定的属性进行: ansible_ssh_port 指定ssh 端口 ansible_ssh_u