ansible方便在于能批量下發(fā),并返回結果和呈現(xiàn)孙乖。簡單、高效份氧。
但有的任務執(zhí)行起來卻不那么直接的圆,可能會花比較長的時間,甚至可能會比ssh的超時時間還要長半火。這種情況任務是不是沒法執(zhí)行了?
ansible考慮到了這種情況季俩,官方文檔介紹了這個問題的解決方法钮糖,就是讓下發(fā)的任務執(zhí)行的連接變?yōu)楫惒剑喝蝿障掳l(fā)之后,長連接不再保持酌住,而是每隔一段時間輪詢結果店归,直到任務結束。
這是官網相關的介紹
他們在playbook的任務中加入兩個參數(shù):async和poll酪我。
- async參數(shù)值代表了這個任務執(zhí)行時間的上限值消痛。即任務執(zhí)行所用時間如果超出這個時間,則認為任務失敗都哭。此參數(shù)若未設置秩伞,則為同步執(zhí)行。
- poll參數(shù)值代表了任務異步執(zhí)行時輪詢的時間間隔欺矫。
官方給出例子:
----
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
這時候已經不怕任務超時了纱新。可以執(zhí)行一個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執(zhí)行異步任務族檬,并且注冊了一個名字叫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