ansible方便在于能批量下發(fā),并返回結(jié)果和呈現(xiàn)。簡單、高效。
但有的任務(wù)執(zhí)行起來卻不那么直接,可能會(huì)花比較長的時(shí)間,甚至可能會(huì)比ssh的超時(shí)時(shí)間還要長。這種情況任務(wù)是不是沒法執(zhí)行了?
ansible考慮到了這種情況,官方文檔介紹了這個(gè)問題的解決方法,就是讓下發(fā)的任務(wù)執(zhí)行的連接變?yōu)楫惒剑喝蝿?wù)下發(fā)之后,長連接不再保持,而是每隔一段時(shí)間輪詢結(jié)果,直到任務(wù)結(jié)束。
這是官網(wǎng)相關(guān)的介紹
他們在playbook的任務(wù)中加入兩個(gè)參數(shù):async和poll。
- async參數(shù)值代表了這個(gè)任務(wù)執(zhí)行時(shí)間的上限值。即任務(wù)執(zhí)行所用時(shí)間如果超出這個(gè)時(shí)間,則認(rèn)為任務(wù)失敗。此參數(shù)若未設(shè)置,則為同步執(zhí)行。
- poll參數(shù)值代表了任務(wù)異步執(zhí)行時(shí)輪詢的時(shí)間間隔。
官方給出例子:
----
hosts: all
remote_user: root
tasks:
- name: simulate long running op (15 sec), wait for up to 45 sec, poll every 5 sec
command: /bin/sleep 15
async: 45
poll: 5
這時(shí)候已經(jīng)不怕任務(wù)超時(shí)了??梢詧?zhí)行一個(gè)45s的任務(wù),當(dāng)然也可以根據(jù)需要自己設(shè)置。另外,如果poll為0,就相當(dāng)于一個(gè)不關(guān)心結(jié)果的任務(wù)。
如果還想要更方便地看輪詢結(jié)果,ansible還提供了這個(gè)模塊async_status。
---
# Requires ansible 1.8+
- name: 'YUM - fire and forget task'
yum: name=docker-io state=installed
async: 1000
poll: 0
register: yum_sleeper
- name: 'YUM - check on fire and forget task'
async_status: jid={{ yum_sleeper.ansible_job_id }}
register: job_result
until: job_result.finished
retries: 30
第一個(gè)job執(zhí)行異步任務(wù),并且注冊了一個(gè)名字叫yum_sleeper,用于提供給第二個(gè)job作為輪詢對象,并且poll設(shè)為0,它自己不再輪詢。
第二個(gè)job使用async_status模塊,進(jìn)行輪詢并返回輪詢結(jié)果。準(zhǔn)備檢查30次。結(jié)果如下:
PLAY [all] *********************************************************************
TASK [setup] *******************************************************************
ok: [cloudlab001]
TASK [YUM - fire and forget task] **********************************************
ok: [cloudlab001]
TASK [YUM - check on fire and forget task] *************************************
FAILED - RETRYING: TASK: YUM - check on fire and forget task (29 retries left).
FAILED - RETRYING: TASK: YUM - check on fire and forget task (28 retries left).
FAILED - RETRYING: TASK: YUM - check on fire and forget task (27 retries left).
FAILED - RETRYING: TASK: YUM - check on fire and forget task (26 retries left).
FAILED - RETRYING: TASK: YUM - check on fire and forget task (25 retries left).
FAILED - RETRYING: TASK: YUM - check on fire and forget task (24 retries left).
changed: [cloudlab001]
PLAY RECAP *********************************************************************
cloudlab001 : ok=3 changed=1 unreachable=0 failed=0