- ansible的執行效率比saltstack要慢的多的多,特別是被控節點量很大的時候
- 在被控節點不太多的時候,默認的設置已經夠快,但是即使被控節點數量巨大的時候,也可以通過一些優化去極大的提高ansible的執行效率
1. 關閉gathering facts功能
ansible-playbook的第一個步驟總是進行gather facts,且不論是否在palybook中設定這個tasks。
如果不需要獲取被控企及的fact數據的話,就可以關閉獲取fact數據功能,關閉之后,可以加快ansible-playbook的執行效率,尤其是在有大量機器的時候非常明顯。
關閉獲取facts只需在playbook文件中加上 “gather_facts: False” 或者 “gather_facts: No” (False和No都小寫也行);或者直接在ansible的配置文件中配置。
- test_01.yml
- hosts: 10.0.0.205 remote_user: root gather_facts: False tasks: - name: first ansible test shell: executable=/bin/bash echo "first ansible test" >/tmp/ansible_test/ansible_first_test.txt
2. 開啟SSH pipelining
pipeline是openssh的一個特性,ssh pipelining是一個加速Ansible執行速度的一個簡單方法。
2.1 為何要開啟pipelining
在ansible執行每一個任務的整個流程中,有一個過程是將臨時任務文件put到遠程的ansible客戶機上,然后通過ssh連接過去遠程執行這個任務,如果開啟了pipelining,一個任務的所有動作都在一個ssh會話中完成,也會省去sftp到遠端的過程,它會直接將要執行的任務在ssh會話中進行。
開啟了pipelining之后,ansible的執行整個流程就少了一個PUT腳本去遠程服務端的流程,然后就可以批量對機器執行命令,可以明顯感受到速度的提升。
ssh pipelining默認是關閉的,默認關閉是為了兼容不同的sudo配置,主要是requiretty選項,如果不使用sudo,建議開啟ssh pipelining選項。打開此選項可以減少ansible執行沒有傳輸時ssh在被控機器上執行任務的連接數。但是如果使用sudo,必須關閉requiretty選項。
如果在ansible中使用sudo命令的話,需要在被控節點的 /etc/sudoer 中禁用 "requiretty",這樣設置是因為ssh遠程執行命令時,它的環境是非登錄式非交互式shell,默認不會分配tty,沒有tty,ssh的sudo就無法關閉密碼回顯(使用 -tt 選項前置ssh分配tty)。所以出於安全考慮,/etc/sudoers 中默認是開啟 requiretty的,它要求只有擁有tty的用戶才能使用sudo,也就是說ssh連接過去不允許執行sudo。
2.2 配置
1)Ansible開啟SSH pipelining
vim /etc/ansible/ansible.cfg
pipelining = True
2)sudo中禁用 requiretty
- 注意:這是在被Ansible管控的主機上設置的
grep requiretty /etc/sudoers # Defaults requiretty 直接將此項注釋即可
3. 開啟SSH長連接(ControlPersist特性)
3.1 優化思路
ansible天然支持openssh,默認連接方式下,它對ssh的依賴性非常強,所以優化ssh連接,在一定程序上也在優化ansible。其中一點就是開啟ssh的長連接,長時間保持連接狀態。
Ansible模式是使用SSH和遠程主機進行通信, 所以Ansible對SSH的依賴性非常強, 在OpenSSH 5.6版本以后SSH就支持了Multiplexing(多路復用)。所以如果Ansible中控機的SSH -V版本高於5.6時, 就可以使用ControlPersist來提高ssh連接速度,從而提高ansible執行效率。
- 查看ssh的版本:ssh -V
ControlPersist 特性需要高版本的SSH才支持,CentOS6默認是不支持的,如要要使用,需要自行升級openssh(版本高於5.6)
ControlPersist即持久化socket,一次驗證,多次通信,並且只需要修改ssh客戶端就行,也就是只需要修改Ansible機器。
3.2 設置ssh長連接
vim /etc/ansible/ansible.cfg ssh_args = -C -o ControlMaster=auto -o ControlPersist=3d # ControlPersist=5d,這個參數是設置整個長連接保持時間為5天 # 開啟此參數的ssh長連接功能后,在會話過期前會一直建立連接 # 通過SSH連接過的設備都會在當前用戶家目錄的 .ansible/cp 目錄下生成一個socket文件,每個會話對應生成一個socket文件
4. 設置facts緩存
在執行playbook時,默認第一次task就是gathering facts,這個過程就是Ansible在搜集每台主機的facts信息,以在playbook中直接使用facts中的信息。
但是如果既想在每次執行playbook的時候都能搜集facts,又想加速這個過程,就需要配置facts緩存了。
目前Ansible支持使用json文件存儲facts信息。
- 修改配置文件 /etc/ansible/ansible.cfg
gathering = smart fact_caching_timeout = 86400 fact_caching = jsonfile fact_caching_connection = /dev/shm/ansible_fact_cache
5. Ansible的 -t 選項
Ansible的 -t 或 --tree 選項是將ansible的執行結果按主機名保存在指定目錄下的文件中。
如果使用 -t 選項,將第一次執行得到的結果按 inventory中定義的主機名保存在文件中,下次執行到同一台主機時速度會變快很多,即使之后不再加上 -t 選項。
除了使用 -t 選項,使用重定向將結果重定向到某個文件中也是一樣的效果。
- 使用示例:
ansible websrv -m shell -a "executable=/bin/bash hostname -t /tmp/test"
- 參考:
- https://www.cnblogs.com/kevingrace/p/11647338.html