




版權說明:本文檔由用戶提供并上傳,收益歸屬內容提供方,若內容存在侵權,請進行舉報或認領
文檔簡介
1、 Ansible 的配置優化指南 【摘要】本文介紹如何通過配置優化,來加速Ansible的執行速度,以提高自動化運維的工作效率,做到等同于有代理通訊方式的效率。前言Ansible服務端使用了默認的SSH無代理方式與客戶端通信,效率遠低于有代理的通訊方式,然而通過本文,您將學習到如何通過配置優化,來加速Ansible的執行速度,以提高自動化運維的工作效率,做到等同于有代理通訊方式的效率,包括:如何開啟SSH長連接,避免SSH短連接的通信開銷;開啟Pipelin-ing,利用SSH會話來縮短PUT腳本至遠端客戶端執行的流程;開啟Accelerate模式,利用遠端客戶端上運行的守護進程,優化Ansi
2、ble的執行流程;在Playbook中修改Ansible的執行策略,減少多主機批量執行過程的等待;在Playbook中使用異步特性,減少執行任務的同步等待;設置Facts緩存,通過提前將Facts信息緩存于本地JSON文件、Redis或Memcached內存數據庫中,來提高PlayBook的執行效率。1.Ansible執行速度過慢問題在測試連通性的過程中,利用默認配置,發現有一個問題非常困擾,就是通過Ansible服務端向客戶端執行命令非常緩慢,主要體現在創建SSH的通道很慢,雖然Ansible在同一個task里面是并行的控制多臺受管端,但是每一個task都需要和受控端創建SSH通道,非常影響
3、效率。由下面也能看出,一個簡單的PING命令都要耗時13秒以上。time ansible test -m pingX.X.X.X | SUCCESS = changed: false,ping: pongreal 0m13.030suser 0m1.147ssys 0m0.263s這種執行效率顯然是無法接受的,那么通過配置優化來提升Ansible的執行效率勢在必行。2.開啟SSH長連接我們知道Ansible模式是使用SSH和遠端主機進行通信,所以Ansible對于SSH的依賴性非常強,下面我們第一步就從SSH入手來優化Ansible。OpenSSH在5.6版本以后支持了Multiplexing
4、(多路復用)功能,它支持同一主機的多個SSH會話共享單一TCP連接進行通訊,一旦第一個連接建立,后續連接就不再需要憑證,從而消除了每次連接同一機器都需要鍵入密碼的麻煩并且大幅度節省了服務器端的資源,這種功能也稱作長連接機制。如果Ansible中控機的SSH -V版本高于5.6時,我們可以直接在ansible.cfg文件中設置SSH長連接即可。設置參數如下:ssh_connectionssh_args = -o ControlMaster=auto -o ControlPersist=5dContro1Persist=5d這個參數是設置整個長連接的保持時間,默認值為60秒,這里設置為5天,如果開
5、啟后,通過SSH連接過的設備都會在用戶當前目錄的/ansible/cp/目錄下生成一個socket文件,每個會話一個文件,以便相同連接復用,也可以通過netstat命令查看,會發現有一個ESTABLISHED狀態的連接一直與遠端設備進行著TCP連接。如果長連接時間超過Contro1Persist的設定值,連接將被斷開,socket文件也將被清理。另外,如果不僅僅需要Ansible開啟SSH長連接,SSH命令也保持長連接的話,可以修改Ansible中控端的SSH CLIENT的全局性配置文件:/etc/ssh/ssh_config,或者修改當前用戶的/.ssh/config文件,使本用戶生效:S
6、erverAliveInterval 30ServerAliveCountMax 3ControlMaster autoControlPath /.ssh/sockets/%r%h-%pControlPersist 5d其中ServerAliveInterval表示client每隔30秒發送一次請求給server,然后server響應,從而保持連接;ServerAliveCountMax表示client發出請求后,服務器端沒有響應的次數達到3,就自動斷開連接;ControlPath表示socket的存放和復用路徑。如果我們的Ansible中控機SSH-V版本低于5.6時,則需要升級到5.6版本
7、后才能啟用SSH Multiplex-ing特性。通過SSH-V命令查看了下當前演示環境的OpenSSH的版本為:OpenSSH_5.3p1,這次需要將openssh版本升級到OpenSSH_6.7p1,安裝包的下載地址為:/blfs/view/7.7/postlfs/openssh.html升級過程如下:查看是否缺少依賴包:rpm -qa|egrep “gcc|make|perl|pam|pam-devel”缺少了依賴包,可以通過YUM源直接安裝這些缺少的包:yum y install gcc* make perl pam pam-devel上傳安裝包:openssh-6.7p1.tar.g
8、z備份ssh:mv /etc/ssh /etc/ssh.bak編譯安裝新版本OpenSSH:gzip -dc openssh-6.7p1.tar.gz|tar -xvf cd openssh-6.7p1./configure -prefix=/usr -sysconfdir=/etc/ssh -with-pam -with-zlib -with-md5-passwordsmake卸載舊版本OpenSSH:rpm -a|grep opensshrpm -e rpm qa|grep openssh -nodeps安裝新版本OpenSSH:make install配置OpenSSH,主要是保證ssh
9、-copy-id等命令能夠正常使用:cd openssh-6.7p1install -v -m755 contrib/ssh-copy-id /usr/bininstall -v -m644 contrib/ssh-copy-id.1 /usr/share/man/man1install -v -m755 -d /usr/share/doc/openssh-6.7p1install -v -m644 INSTALL LICENCE OVERVIEW README* /usr/share/doc/openssh-6.7p1查看是否升級到了新版本:ssh VOpenSSH_6.7p1, OpenS
10、SL 1.0.1e-fips 11 Feb 2013復制啟動腳本到/etc/init.d:cp /root/openssh-6.7p1/contrib/redHat/sshd.init /etc/init.d/sshd將sshd加入開機自啟動:chkconfig -add sshd重新啟動sshdservice sshd restart執行速度驗證:time ansible X.X.X.X -a uptimeX.X.X.X | SUCCESS | rc=0 15:37:17 up 881 days, 17:12, 1 user, load average: 0.00, 0.00, 0.00re
11、al 0m4.228suser 0m2.591ssys 0m0.327s通過OpenSSH的版本升級,我們發現速度優化較為明顯,執行速度為4秒左右。我們當然不然滿足于此,看看按照前面介紹的方式,開啟Multiplexing功能特性后的Ansible執行速度又如何:time ansible X.X.X.X -a uptimeX.X.X.X | SUCCESS | rc=0 15:37:31 up 881 days, 17:12, 1 user, load average: 0.00, 0.00, 0.00real 0m3.075suser 0m2.532ssys 0m0.310s執行速度又降低了
12、1秒,看來復用了長連接,減少SSH的TCP通信開銷還是有效果的。3.開啟PipeliningPipelining也是OpenSSH的一個特性,在Ansible的整個執行流程中,包含三個步驟:首先,基于調用的模塊生成一個Python腳本其次,再將Python腳本復制到主機上最后,在遠端服務器上執行這個Python腳本我們可以看到,其中有一個流程就是把生成好的本地Python腳本PUT到遠端服務器執行,如果開啟了Pipelining,Ansible執行Python腳本的時候并不會復制它,而是通過管道傳遞給SSH會話,Ansible使用的SSH會話將減少到一個,這樣可以大大提高整個執行效率。尤其是在
13、在部署大規模服務器或引用模塊非常多時,開啟Pipelining特性會給Ansible帶來更加顯著的性能提升。下面我們通過一個示例展示整個過程。首先在ansible.cfg配置文件中設置Pipelining。ssh_connectionpipelining = True再來看開啟了Pipelining之后整個Ansible的執行流程有什么變化:開啟Pipelining之前的流程如下:開啟Pipelining之后的流程如下:我們可以看到開啟了Pipelining之后整個流程少了一個PUT腳本和SFTP去遠端服務器的流程,且大量減少了SSH連接次數,第一步就是直接調用ssh執行腳本。那么經過優化后的
14、耗時又如何呢:time ansible X.X.X.X -a uptimeX.X.X.X | SUCCESS | rc=0 15:38:26up881days,17:13,0users,loadaverage:0.00,0.00,0.00real 0m1.741suser 0m1.429ssys 0m0.176s耗時又降低了1.3秒。但是我們要注意,如果在Ansible中使用sudo命令的話,例如:ssh userhost sudo cmd,需要在被控節點的/etc/sudoers中禁用requiretty。這是因為ssh遠程執行命令時,它的環境是非登錄式非交互式shell,默認不會分配tty
15、,沒有tty,ssh的sudo就無法關閉密碼回顯(業可以在Ansible命令行中使用-tt參數來強制SSH分配tty)。所以出于安全考慮,/etc/sudoers中默認是開啟requiretty的,它要求只有擁有tty的用戶才能使用sudo,也就是說ssh連接過去不允許執行sudo。所以我們需要編輯sudo配置文件,通過注釋該選項來禁用它。如果我們在Playbook中不適用sudo越權功能,則不需要在被控節點的sudo配置文件中禁用該選項。4.開啟Accelerate模式除了OpenSSH上述兩個功能之外,Ansible還有一個Accelerate模式,這和前面SSH Multiplexing
16、功能有點類似,因為都依賴Ansible中控機跟遠端機器有一個長連接。但是Accelerate是使用Python程序在遠端機器上運行一個守護進程,然后Ansible會通過這個守護進程監聽的端口進行通信。開啟Accelerate模式很簡單,只要在Playbook中配置accelerate:true即可開啟。但是需要注意,如果開啟Accelerate模式,則需要在Ansible中控機與遠端機器都安裝python-keyczar軟件包,軟件包的下載地址如下:/index.php3/stat/4/idpl/49957349/dir/redhat_el_6/com/python-keyczar-0.71c
17、-1.el6.noarch.rpm.html安裝python-keyczar軟件包,中控機和遠端都需要安裝。遠程批量安裝可以參考采用之前所介紹的方式實施。yum install python-pyasn1rpm -ivh python-keyczar-0.71c-1.el6.noarch.rpm定義ansible.cfg文件中Accelerate參數,例如遠端機器的監昕端口以及timeout設置。當然這些參數也可以在寫playbook的時候再定義:accelerateaccelerate_port = 5099accelerate_timeout= 30accelerate_connect_t
18、imeout= 5.0在Playbook中定義Accelerate,例如:- hosts: allaccelerate: trueaccelerate_port: 5099然而,RedHat官方目前不贊成使用Accelerate模式。因為在啟用ControlPersist和Pipelining管道的情況下,Ansible的執行效率比較高。Accelerate功能在后面的Ansible版本中將被刪除。5.修改Ansible執行策略默認Ansible在遠程執行任務是按批并行執行的,一批控制多少臺主機由命令行的-f參數或ansible.cfg配置中的-forks選項控制。例如,默認的并行進程數是5,
19、如果有20臺被控主機,那么只有在每5臺全部執行完一個任務才繼續下一批的5臺執行該任務,即使中間某臺機器性能較好,完成速度較快,它也會空閑地等待在那,直到所有20臺主機都執行完該任務才會以同樣的方式繼續下一個任務。在Ansible 2.0版本后,添加了一個策略控制選項strategy,默認值為linear,即上面按批并行處理的方式。我們還可以設置strategy的值為free。在free模式下,Ansible會盡可能快的切入到下一個主機。同樣是上面的例子,首先每5臺并行執行一個任務,當其中某一臺機器由于性能較好提前完成了該任務,它不會等待其他4臺完成,而是會跳出該任務讓Ansible切入到下一臺
20、機器來執行該任務。也就是說,這種模式下,一臺主機完成一個任務后,另一臺主機會立即執行任務,它是前赴后繼的方式。所以這種策略的執行結果給人感覺是無序的甚至是雜亂無章的,而且每次執行結果的Task顯示順序很可能不一樣。利用Playbook,這兩種策略的設置的方式如下:- hosts: all strategy: freetasks:.6.任務執行優化默認情況下Playbook中的任務在執行時會一直保持連接,直到該任務在每個主機節點都執行完畢,下一個任務才會開始執行。有時這是不必要的,比如有些操作運行時間比SSH超時時間還要長。解決該問題最簡單的方式是一起執行它們,然后輪詢直到任務執行完畢,簡單的意
21、思就是,像下面的例子,執行任務后,Ansible就不等它了,往下執行下一個任務,然后每隔5秒鐘去看看它執行完成沒,超時時間為45秒,async參數值代表了這個任務執行時間的上限值。即任務執行所用時間如果超出這個時間,則認為任務失敗。如果async參數若未設置,則為同步執行。我們也可以對執行時間非常長(有可能遭遇超時)的操作使用異步模式。為了異步啟動一個任務,可以指定其最大超時時間以及輪詢其狀態的頻率。如果沒有為 poll 指定值,那么默認的輪詢頻率是10秒鐘。- - hosts: all remote_user: root tasks: - name: simulate long runnin
22、g op (15 sec), wait for up to 45 sec, poll every 5 sec command: /bin/sleep 15 async: 45 poll: 5在異步執行任務時,需要注意那些有依賴性的任務。對于那些對資源要求占有排它鎖的任務,如yum,不應該將Poll的間隔設置為0。如果設置為0,很可能會導致資源阻塞。總結來說,大概有以下一些場景需要使用到Ansible的異步特性:某個Task需要運行很長的時間,這個Task很可能會達到ssh連接的Timeout。沒有任務是需要等待它才能完成的,即沒有任務依賴此任務是否完成的狀態。需要盡快返回當前shell的。當然
23、也有一些場景不適合使用異步特性:這個任務是需要運行完后才能繼續另外的任務的。申請排它鎖的任務。7.設置Facts緩存當我們用ansible-playbook執行Playbook的時候,我們會發現,默認第一個Task都是GATHERINGFACTS,這個過程就是Ansible收集每臺主機的Facts信息,方便我們在Playbook中直接引用Facts里的信息。當然如果我們的Playbook中不需要Facts信息,可以在Playbook中設置gather_facts: False來提高Playbook的效率:- hosts: gather_facts: notasks:.也可以在ansible.c
24、fg文件中添加如下配置來默認禁用Facts采集:defaultsgathering = explicit但是如果我們既想每次執行Playbook的時候都能收集Facts信息,又想加速這個收集過程,這時候可以設置Facts的緩存。例如,在空閑的時候收集Facts,緩存下來,在需要的時候直接讀取緩存進行引用,直到緩存過期。目前Ansible支持使用Json文件,Redis、Memcached內存數據庫來存儲Facts信息。Json文件緩存Fact信息使用Json文件作為Fact緩存后端時,Ansible將會把采集的Fact寫入Ansible中控機的上的文件中。如果系統中已經存在這個文件,那么Ansible將使用這個文件中的數據,而不再連接到主機去采集Fact。下面我們首先通過示例來了解如何使用Json文件存儲Facts信息,在ansible.cfg文件中添加:defaultsgathering = smartfact_caching_timeout = 86400fact_caching = jsonfilefact_caching_connection = /tmp/ansible_fact_cacheAnsible的配置文件中可以
溫馨提示
- 1. 本站所有資源如無特殊說明,都需要本地電腦安裝OFFICE2007和PDF閱讀器。圖紙軟件為CAD,CAXA,PROE,UG,SolidWorks等.壓縮文件請下載最新的WinRAR軟件解壓。
- 2. 本站的文檔不包含任何第三方提供的附件圖紙等,如果需要附件,請聯系上傳者。文件的所有權益歸上傳用戶所有。
- 3. 本站RAR壓縮包中若帶圖紙,網頁內容里面會有圖紙預覽,若沒有圖紙預覽就沒有圖紙。
- 4. 未經權益所有人同意不得將文件中的內容挪作商業或盈利用途。
- 5. 人人文庫網僅提供信息存儲空間,僅對用戶上傳內容的表現方式做保護處理,對用戶上傳分享的文檔內容本身不做任何修改或編輯,并不能對任何下載內容負責。
- 6. 下載文件中如有侵權或不適當內容,請與我們聯系,我們立即糾正。
- 7. 本站不保證下載資源的準確性、安全性和完整性, 同時也不承擔用戶因使用這些下載資源對自己和他人造成任何形式的傷害或損失。
最新文檔
- 服裝合同采購6篇
- 專業網站建設試題及答案
- 上海土建安全員模擬題庫及答案
- 糖果加工合同6篇
- 室內設計課件
- 城區水環境綜合治理勞務施工合同6篇
- 電動吊籃租賃合同與電動工具租賃合同2篇
- 幼兒園愛衛生講文明
- 健康促進縣區課件
- 機械設計及其制度課件
- 2025年度工地渣土運輸與道路清掃保潔合同
- DB11- 206-2023 儲油庫油氣排放控制和限值
- 外賣餐飲業食品安全管理與操作規程培訓課件
- 《刑法總則》課件
- 《智慧運輸運營》課程標準
- 個稅返還獎勵財務人員政策
- 2025年上海市普陀區招聘161名社區工作者歷年高頻重點提升(共500題)附帶答案詳解
- 【MOOC答案】《中國文化傳承與科技創新》(北京郵電大學)中國慕課章節作業網課答案
- 員工團隊合作
- 壓縮空氣管道管理規定模版(3篇)
- 三大音樂教學法在課堂中的應用研究-講座課件
評論
0/150
提交評論