ansible預設隻會建立5個程序,是以一次任務隻能同時控制5台機器執行.那如果你有大量的機器需要控制,或者你希望減少程序數,那你可以采取異步執行.ansible的子產品可以把task放進背景,然後輪詢它.這使得在一定程序數下能讓大量需要的機器同時運作起來.
使用async和poll這兩個關鍵字便可以并行運作一個任務. async這個關鍵字觸發ansible并行運作任務,而async的值是ansible等待運作這個任務的最大逾時值,而poll就是ansible檢查這個任務是否完成的頻率時間.
如果你希望在整個叢集裡面平行的執行一下updatedb這個指令.使用下面的配置
- hosts: all
tasks:
- name: Install mlocate
yum: name=mlocate state=installed
- name: Run updatedb
command: /usr/bin/updatedb
async: 300
poll: 10
你會發現當你使用上面的例子控制超過5台機器的時候,command.在上面yum子產品會先在5台機器上跑,完成後再繼續下面的機器.而上面command子產品的任務會一次性在所有機器上都執行了,然後監聽它的回調結果
如果你的command是控制機器開啟一個程序放到背景,那就不需要檢查這個任務是否完成了.你隻需要繼續其他的動作,最後再使用wait_for這個子產品去檢查之前的程序是否按預期中開啟了便可.隻需要把poll這個值設定為0,便可以按上面的要求配置ansible不等待job的完成.
最後,或者你還有一種需求是有一個task它是需要運作很長的時間,那你需要設定一直等待這個job完成.這個時候你把async的值設成0便可.
總結來說,大概有以下的一些場景你是需要使用到ansible的polling特性的
你有一個task需要運作很長的時間,這個task很可能會達到timeout.
你有一個任務需要在大量的機器上面運作
你有一個任務是不需要等待它完成的
當然也有一些場景是不适合使用polling特性的
你的這個任務是需要運作完後才能繼續另外的任務的
你的這個任務能很快的完成