ansible任務的異步執行 96 茶客furu聲 關注 2016.07.12 01:40* 字數 458 閱讀 1777評論 0喜歡 4 ansible方便在於能批量下發,並返回結果和呈現。簡單、高效。 但有的任務執行起來卻不那么直接,可能會花比較長的時間,甚至可能會比ssh的超時時間還要長。這種情況任務是不是沒法執行了? ansible考慮到了這種情況,官方文檔介紹了這個問題的解決方法,就是讓下發的任務執行的連接變為異步:任務下發之后,長連接不再保持,而是每隔一段時間輪詢結果,直到任務結束。 這是官網相關的介紹 他們在playbook的任務中加入兩個參數:async和poll。 async參數值代表了這個任務執行時間的上限值。即任務執行所用時間如果超出這個時間,則認為任務失敗。此參數若未設置,則為同步執行。 poll參數值代表了任務異步執行時輪詢的時間間隔。 官方給出例子: ---- 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 這時候已經不怕任務超時了。可以執行一個45s的任務,當然也可以根據需要自己設置。另外,如果poll為0,就相當於一個不關心結果的任務。 如果還想要更方便地看輪詢結果,ansible還提供了這個模塊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 第一個job執行異步任務,並且注冊了一個名字叫yum_sleeper,用於提供給第二個job作為輪詢對象,並且poll設為0,它自己不再輪詢。 第二個job使用async_status模塊,進行輪詢並返回輪詢結果。准備檢查30次。結果如下: 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