Ansible性能優化


  • 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

 


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM