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參數來查看輸出
- command: /tmp/test.sh
使用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如何判断并中断执行的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: 用VC6.0遇到的一个问题
- 下一篇: swift 基础学习之属性修饰符