Ansible - 7 - 性能優化


Ansible 性能優化

在默認設置的情況下,Ansible的執行效率已經可以滿足大多數場景。
面對巨量目標主機時,可以通過一些配置優化去再提高ansible的執行效率。

Ansible 基本設置

# 通過 time 命令統計執行時間
time <ansible-command>


# 關閉SSH密鑰檢測
- 以SSH登錄遠程設備時,默認該設備會檢查遠程主機的公鑰,並且將該公鑰記錄在~/.ssh/known_hosts文件中
- 當下次該主機訪問時會覈對公鑰,如果公鑰不同則會發出警告,如果公鑰相同,則會提示輸入密碼
- 對主機公鑰的檢查是根據StrictHostKeyChecking變量的檢查級別確定:no(不檢查)、ask(是否檢查要詢問)、yes(每次都檢查)、False(關閉檢查)
- 設置 /etc/ansible/ansible.cfg 中參數 host_key_checking = False


# 併發數forks
- Ansible默認只會創建5個進程併發執行任務,所以在任務中只能同時控制5臺主機執行
- forks是線程數,受限於CPU的核心數,加大forks值能讓CPU儘量提升併發數量,一定程度上提高執行效率
- 設置 /etc/ansible/ansible.cfg 中 forks 參數,默認值爲5
- 在執行命令時通過 -f 參數指定併發數


# 關閉 gather_facts
- playbook默認執行第一個tasks是gather_facts,用於收集主機信息
- 如果任務並不需要調用主機信息變量,建議關閉可以減少Ansible在收集客戶端信息的時間,提高運行速度
- 可以在playbook文件中設置gather_facts參數爲false或no(不區分大小寫)
gather_facts: False 
gather_facts: no
- 也可以設置 /etc/ansible/ansible.cfg 中參數
gather_facts: no


# 設置 facts緩存
- 不過禁用facts,可以採用facts緩存保證一定的運行效率來使用facts信息
- 在ansible.cfg中可以配置多種facts緩存的方式:json文件,redis,memcache等
- 使用redis存儲facts文件需安裝redis和響應的python庫
- 以json文件方式爲例
gathering=smart
fact_caching_timeout=86400
fact_caching=jsonfile
fact_caching_connection=/path/to/ansible_fact_cache


# serial滾動更新
- 併發可以在ansible.cfg裏修改配置,也可以在playbook中限制服務端的併發數量
- Ansible默認將嘗試並行管理playbook中所有的機器,可以使用serial關鍵字定義一次應管理多少主機
- 常應用與負載均衡環境下,不能一次性停止所有主機的場景
- 在play或者task下都可以設置serial參數,但其值對應的主機數不應大於forks值 
serial: "30%"  # 按百分比執行
serial: 2      # 指定單次執行數量


# OpenSSH鏈接優化(非必要,不建議)
- 默認情況下,使用OpenSSH時,服務器端會根據客戶端的IP地址進行DNS反向解析,然後根據獲取到的主機名再次進行DNS查詢得到IP地址,比較這兩個IP地址是否一致
- 可以在一定程度上提高安全性,但會花費更多時間,可以關閉這一特性來實現加速SSH鏈接速度
- 設置 /etc/ssh/sshd_config 中參數 UseDNS no


# 開啓pipeling
- 發送執行命令代替命令臨時文件(針對不使用sudo的場景,建議以單獨ansible.cfg文件方式開啓)
- 設置 /etc/ansible/ansible.cfg 中參數 pipelining = True

Ansible 異步async與輪詢polling特性

# Ansible的異步async與輪詢polling特性
# 適合使用到ansible的polling特性的場景
# - task需要運行很長的時間,這個task很可能會達到timeout
# - 任務需要在大量的機器上面運行
# - 任務是不需要等待它完成的

# 不適合使用polling特性的場景
# - task任務是需要運行完後才能繼續另外的任務的
# - task任務能很快的完成

# 注意:需在ansible服務端的/etc/ansible/ansible.cfg文件裏配置"host_key_checking = False"  

- hosts: all
  max_fail_percentage: 30  # 主機數最大失敗百分比,只有在大於時中止tasks的執行,結合serial參數則以serial值爲基準
  serial: 7  # 定義同時執行操作的主機數,一般要小於forks的值,否則會按forks值進行“分片”執行任務
  tasks:
    - name: test-1
      shell: sleep 5 && echo "test-1 done" && hostname && date
      async: 9  # 任務執行時間的上限值,超時則任務失敗,建議設置爲略大於任務正常實際執行時長,設置爲0時表示一直等待任務結束
      poll: 2  # 檢查任務結果的間隔時長,建議設置爲小於任務實際執行時長,設置爲0表示不用等待結果繼續執行後續任務
      register: script_result
    - name: test-2
      async_status: jid={{ script_result.ansible_job_id }}  # 通過模塊async_status查看輪詢結果
      register: job_result
      until: job_result.finished  #  
      retries: 10  # 重試10次
    - name: test-3  # 將在所有主機執行完成後一次性返回結果
      shell: echo "test-3 done" && hostname && date

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章