日韩性视频-久久久蜜桃-www中文字幕-在线中文字幕av-亚洲欧美一区二区三区四区-撸久久-香蕉视频一区-久久无码精品丰满人妻-国产高潮av-激情福利社-日韩av网址大全-国产精品久久999-日本五十路在线-性欧美在线-久久99精品波多结衣一区-男女午夜免费视频-黑人极品ⅴideos精品欧美棵-人人妻人人澡人人爽精品欧美一区-日韩一区在线看-欧美a级在线免费观看

歡迎訪問 生活随笔!

生活随笔

當前位置: 首頁 > 编程资源 > 编程问答 >内容正文

编程问答

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

發(fā)布時間:2025/4/16 编程问答 43 豆豆
生活随笔 收集整理的這篇文章主要介紹了 ansible-playbook如何判断并中断执行 小編覺得挺不錯的,現(xiàn)在分享給大家,幫大家做個參考.

今天碰到一個需求,當使用ansible-playbook在執(zhí)行一個腳本后,根據(jù)腳本返回的內容判斷是否繼續(xù)往下執(zhí)行還是中斷執(zhí)行,查詢官網(wǎng)發(fā)現(xiàn)使用register寄存器可以實現(xiàn)記錄腳本輸出,使用when+fail模塊來判斷是否往下繼續(xù)執(zhí)行或者中斷,以下是一個簡單例子:

ansible服務在172.16.133.128上,先執(zhí)行一個腳本,腳本返回success時在172.16.133.129上創(chuàng)建一個目錄/tmp/test,如果返回failed則中斷執(zhí)行

先在172.16.133.129上配置一個簡單腳本/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寄存器,具體寄存了什么內容,可以使用-v參數(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"來判斷是否執(zhí)行或者跳過

修改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‘時就會執(zhí)行創(chuàng)建目錄操作,輸出不為‘failed‘,則跳過執(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
可以看到當stdout為success時,創(chuàng)建目錄的操作直接跳過了

現(xiàn)在回到最終要達到的目的,當腳本輸出為‘failed‘時,我們要中斷ansible-playbook執(zhí)行,而不是跳過,這時需要配合fail模塊來實現(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運行到第二個task時就會報錯并拋出msg

ansible官網(wǎng)文檔:http://docs.ansible.com/ansible/playbooks_conditionals.html#register-variables

注:寄存器中的數(shù)據(jù)都可以拿來使用,如"rc","stderr"等,當然也有很多種方法,文中的‘failed‘是嚴格匹配,也可以使用模糊查找,如result.stdout.find(‘failed‘) != -1也可以達到相同的效果

本文出自 “漂泊的魚” 博客,請務必保留此出處http://faded.blog.51cto.com/6375932/1762688

轉載于:https://blog.51cto.com/lookingdream/2054763

總結

以上是生活随笔為你收集整理的ansible-playbook如何判断并中断执行的全部內容,希望文章能夠幫你解決所遇到的問題。

如果覺得生活随笔網(wǎng)站內容還不錯,歡迎將生活随笔推薦給好友。