實驗環境:ansible2.7
1、默認情況下,Ansible將嘗試並行管理playbook中所有的機器。對於滾動更新用例,可以使用serial關鍵字定義Ansible一次應管理多少主機:
- name: test play hosts: webservers serial: 2 gather_facts: False
// 獲取主機相關信息 true|false
tasks: - name: task one comand: hostname - name: task two command: hostname
在上面的例子中,如果我們在“WebServers”組中有4個主機,后面2個主機等到前面2個主機執行完后執行:
PLAY [webservers] **************************************** TASK [task one] ****************************************** changed: [web2] changed: [web1] TASK [task two] ****************************************** changed: [web1] changed: [web2] PLAY [webservers] **************************************** TASK [task one] ****************************************** changed: [web3] changed: [web4] TASK [task two] ****************************************** changed: [web3] changed: [web4] PLAY RECAP *********************************************** web1 : ok=2 changed=2 unreachable=0 failed=0 web2 : ok=2 changed=2 unreachable=0 failed=0 web3 : ok=2 changed=2 unreachable=0 failed=0 web4 : ok=2 changed=2 unreachable=0 failed=0
2、還可以將serial關鍵字指定為百分比,表示每次並行執行的主機數占總數的比例:
- name: test play hosts: webservers serial: "30%"
其他用法詳見官網:
https://docs.ansible.com/ansible/latest/user_guide/playbooks_delegation.html#id10
Ansible 並行和異步
增加並行進程數
Ansible提供一個forks的屬性,可以設置運行並行進程數。這個值默認比較保守,只有5個並行進程。我們可以根據自己的機器性能以及網絡情況來設定,很多人使用50,也有用500以上的。如果有很多機器要管理的話,可以嘗試先增加這個值,看看效果。有三個地方可以設置forks的數量:
- 環境變量:
export ANSIBLE_FORKS=100
- ansible.cfg這個配置文件里設置:
forks=100
- 運行ansible命令時增加參數:
-f 100
當機器數量比較大的時候,難免會有幾台機器不能正常執行。這時候ansible會有提示to retry, use: --limit @/xxx/xxx.retry
,把它增加到上個命令的后面就好了。
異步
有時候執行某個任務可能需要很長的時間,在集群規模較大的情況下慢得讓人無法忍受。這時可以考慮使用異步模式。在tasks
里增加async
的屬性,設成某個數字,比如60,意思就是這個任務最大運行時間不能超過60秒。也可以設成0,意思是不管任務運行多久,一直等待即可。如果沒有指定async
,則默認為同步模式。還可以設定poll
,默認值為10,意思就是每隔10秒輪詢查看結果。如果不需要查看結果,設為0就好了。還可以通過register
和async_status
設定暫時不查看結果,等需要的時候再查看。具體做法可以參考上面的異步模式官網文檔,也可以看翻譯的中文文檔。