ansible-playbook如何判断并中断执行
今天碰到一個(gè)需求,當(dāng)使用ansible-playbook在執(zhí)行一個(gè)腳本后,根據(jù)腳本返回的內(nèi)容判斷是否繼續(xù)往下執(zhí)行還是中斷執(zhí)行,查詢官網(wǎng)發(fā)現(xiàn)使用register寄存器可以實(shí)現(xiàn)記錄腳本輸出,使用when+fail模塊來(lái)判斷是否往下繼續(xù)執(zhí)行或者中斷,以下是一個(gè)簡(jiǎn)單例子:
ansible服務(wù)在172.16.133.128上,先執(zhí)行一個(gè)腳本,腳本返回success時(shí)在172.16.133.129上創(chuàng)建一個(gè)目錄/tmp/test,如果返回failed則中斷執(zhí)行
先在172.16.133.129上配置一個(gè)簡(jiǎn)單腳本/tmp/test.sh
#!/bin/bash
echo "failed"
配置yml文件test.yml,先配置執(zhí)行腳本部分
- hosts: 172.16.133.129
remote_user: root
tasks:- command: /tmp/test.sh
register: result
這里使用了register寄存器,具體寄存了什么內(nèi)容,可以使用-v參數(shù)來(lái)查看輸出
- command: /tmp/test.sh
使用ansible-playbook運(yùn)行
[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保存的信息就時(shí)“=>”后面的字典信息,信息保存在result變量中
可以看到"stdout"就是腳本的標(biāo)準(zhǔn)輸出信息,這時(shí)可以使用"when"來(lái)判斷是否執(zhí)行或者跳過(guò)
修改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‘
當(dāng)腳本輸出為‘failed‘時(shí)就會(huì)執(zhí)行創(chuàng)建目錄操作,輸出不為‘failed‘,則跳過(guò)執(zhí)行
-
執(zhí)行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‘,然后執(zhí)行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
可以看到當(dāng)stdout為success時(shí),創(chuàng)建目錄的操作直接跳過(guò)了
現(xiàn)在回到最終要達(dá)到的目的,當(dāng)腳本輸出為‘failed‘時(shí),我們要中斷ansible-playbook執(zhí)行,而不是跳過(guò),這時(shí)需要配合fail模塊來(lái)實(shí)現(xiàn),并且可以拋出自定義信息
修改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
如果腳本執(zhí)行返回‘failed‘,中斷執(zhí)行,并拋出信息"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運(yùn)行到第二個(gè)task時(shí)就會(huì)報(bào)錯(cuò)并拋出msg
ansible官網(wǎng)文檔:http://docs.ansible.com/ansible/playbooks_conditionals.html#register-variables
注:寄存器中的數(shù)據(jù)都可以拿來(lái)使用,如"rc","stderr"等,當(dāng)然也有很多種方法,文中的‘failed‘是嚴(yán)格匹配,也可以使用模糊查找,如result.stdout.find(‘failed‘) != -1也可以達(dá)到相同的效果
本文出自 “漂泊的魚” 博客,請(qǐng)務(wù)必保留此出處http://faded.blog.51cto.com/6375932/1762688
轉(zhuǎn)載于:https://blog.51cto.com/lookingdream/2054763
總結(jié)
以上是生活随笔為你收集整理的ansible-playbook如何判断并中断执行的全部?jī)?nèi)容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: 用VC6.0遇到的一个问题
- 下一篇: swift 基础学习之属性修饰符