一、使用forks在Ansible中配置並行
1、Aniable運行play機制
1️⃣:當Ansible處理playbook時,會按順序運行每個play。確定play的主機列表之后,Ansible將按順序運行每個任務
2️⃣:通常,所有主機必須在任何主機在play中啟動下一個任務之前成功完成任務
3️⃣:注意:
- 理論上,Ansible可以同時連接到play中的所有主機以執行每項任務。這非常適用於小型主機列表。但如果該play以數百台主機為目標,則可能會給控制節點帶來沉重負擔
4️⃣:Ansible所進行的最大同時連接數由Ansible配置文件中的forks參數控制,默認情況下設為5(forks:分叉)
- 通過以下方式之一來驗證:
- 方式一:
[root@localhost ~]# ansible-config dump|grep -i forks DEFAULT_FORKS(default) = 5
- 方式二:
[root@localhost ~]# grep forks /etc/ansible/ansible.cfg #forks = 5
- 方式三:
[root@localhost ~]# ansible-config list | grep -i forks DEFAULT_FORKS: description: Maximum number of forks Ansible will use to execute tasks on target - {name: ANSIBLE_FORKS} - {key: forks, section: defaults} name: Number of task forks
- 方式一:
5️⃣:例如,假設Ansible控制節點配置了5個forks的默認值,並且play具有10個受管主機。
Ansible將在前5個受管主機上執行play中的第一個任務,然后在其他5個受管主機上對第一個任務執行第二輪。
在所有受管主機上執行第一個任務后,Ansible將繼續一次在5受管主機的組中的所有受管主機上執行下一個任務。Ansible將依次對每個任務執行此操作,直到play結束
6️⃣:forks的默認值設置得非常保守。如果你的控制節點正在管理Linux主機,則大多數任務將在受管主機上運行,並且控制節點的負載較少。
在這種情況下,通常可以將forks的值設置得更高,可能接近100,然后性能就會提高
7️⃣:如果playbook在控制節點上運行很多代碼,則應明智地提高forks限值。如果使用Ansible管理網絡路由器和交換機,則大多數模塊在控制節點上運行而不是在網絡設備上運行。
由於這會增加控制節點上的負載,因此其支持forks數量增加的能力將顯著低於僅管理Linux主機的控制節點
8️⃣:可以從命令行覆蓋Ansible配置文件中forks的默認設置。ansible和ansible-playbook命令均提供-f或--forks選項以指定要使用的forks數量
二、管理滾動更新
1、Ansible運行滾動機制
1️⃣:通常,當Ansible運行play時,它會確保所有受管主機在啟動任何主機進行下一個任務之前已完成每個任務。在所有受管主機完成所有任務后,將運行任何通知的處理程序
2️⃣:但是,在所有主機上運行所有任務可能會導致意外行為。
- 例如,如果play更新負載均衡Web服務器集群,則可能需要在進行更新時讓每個Web服務器停止服務。如果所有服務器都在同一個play中更新,則它們可能全部同時停止服務
3️⃣:避免此問題的一種方法是使用serial關鍵字,通過play批量運行主機。在下一批次啟動之前,每批主機將在整個play中運行
4️⃣:演示實例:
[root@localhost project]# cat playbook.yml
---
- hosts: all
serial: 2
tasks:
- name: install httpd
yum:
name: httpd
state: present
notify:
- start httpd
handlers:
- name: start httpd
service:
name: httpd
state: started
在上面的示例中,Ansible一次在兩個受管主機上執行play,直至所有受管主機都已更新
5️⃣:更新機制:
- Ansible首先在前兩個受管主機上執行play中的任務。如果這兩個主機中的任何一個或兩個都通知了處理程序,則Ansible將根據這兩個主機的需要運行處理程序。
- 在這兩個受管主機上執行完play時,Ansible會在接下來的兩個受管主機上重復該過程。Ansible繼續以這種方式運行play,直到所有受管主機都已更新
6️⃣:假設上一示例中的webservers組包含5個Web服務器,它們位於負載均衡器后面。將serial參數設置為2后,play一次將運行兩台Web服務器。因此,5台Web服務器中的大多數服務器將始終可用
- 相反,如果不使用serial關鍵字,將同時在5台Web服務器上執行play和生成的處理程序。這可能會導致服務中斷,因為Web服務將在所有Web服務器上同時重新啟動
7️⃣:重要:
- 在設置了serial: 2的上一個場景中,如果出現問題並且處理的前2個主機的play失敗,則playbook將中止,其余3個主機將不會通過play運行。這是一個有用的功能,因為只有一部分服務器會不可用,使服務降級而不是中斷
- serial關鍵字也可以指定為百分比。此百分比應用於play中的主機總數,以確定滾動更新批處理大小。無論百分比為何,每一工序的主機數始終為1或以上
