您好,登錄后才能下訂單哦!
簡單介紹和說明下,優化ansible執行速度的方法,具體如下~
ansible的"-t"或"--tree"選項是將ansible的執行結果按主機名保存在指定目錄下的文件中。
ansible test -m ping -o -f 6 -t /tmp/tree
至于保存的內容為何?實際上僅僅只是保存了普通的輸出內容而已。
# pwd
/tmp/tree
# cat 192.168.246.187
{"ansible_facts": {"discovered_interpreter_python": "/usr/bin/python"}, "changed": false, "ping": "pong"}
如要開啟ssh長連接,要求ansible端的openssh版本高于或等于5.6。使用ssh -V
可以查看版本號。然后設置ansible 使用ssh連接被控端的連接參數,此處修改/et c/ans ible/ansible.cfg
,在此文件中啟動下面的連接選項,其中ControlPersist=5d
是控制ssh連接會話保持時長為5天。
ssh_args = -C -o ControlMaster=auto -o ControlPersist=5d
除此之外直接設置/etc/ssh/ssh_config
(不是sshd_config
,因為ssh命令是客戶端命令)中對應的長連接項也是可以的。
開啟長連接后,在會話過期前會一直建立連接,在netstat
的結果中會看到ssh連接是一直established
狀態,且會在當前用戶家目錄的.ans ible/cp
目錄下生成一些 socket 文件,每個會話一個文件。
例如:執行一次ad-hoc
操作:
ansible test -m ping
查看netstat ,發現ssh進程的會話一直是established狀態。
netstat -lnpta
且家目錄下~/.ansible/cp/
下會生成對應的socket文件。
??關于 ssh 保持長連接的方法:
(1)修改server端的etc/ssh/sshd_config
ClientAliveInterval 60 #server每隔60秒發送一次請求給client,然后client響應,從而保持連接
ClientAliveCountMax 3 #server發出請求后,客戶端沒有響應得次數達到3,就自動斷開連接,正常情況下,client不會不響應
systemctl reload sshd
(2)修改client端的etc/ssh/ssh_config添加以下:(在沒有權限改server配置的情形下)
ServerAliveInterval 60 #client每隔60秒發送一次請求給server,然后server響應,從而保持連接
ServerAliveCountMax 3 #client發出請求后,服務器端沒有響應得次數達到3,就自動斷開連接,正常情況下,server不會不響應
(3)命令行臨時修改
在命令參數里ssh -o ServerAliveInterval=60
這樣子只會在需要的連接中保持持久連接, 畢竟不是所有連接都要保持持久的。
pipeline也是openssh的一個特性。在ansible執行每個任務的流程中,有一個過程是將臨時任務文件put到一個 ansible 端的一個臨時文件中,然后sftp傳輸到遠端,然后通過ssh連接過去遠程執行這個任務。
如果開啟了pipelining
,一個任務的所有動作都在一個ssh會話中完成,也會省去sftp到遠端的過程,它會直接將要執行的任務在ssh會話中進行。
開啟pipelining的方式是配置文件(如ansible.cf g)中設置pipelining=true
,默認是false。
但是要注意,如果在ansible中使用sudo命令的話(ssh user@host sudo cmd),需要在被控節點的/etc/sudoers
中 禁用"requiretty"。
之所以要設置/etc/sudoers中的requiretty,是因為ssh遠程執行命令時,它的環境是非登錄式非交互式shell,默認不會分配tty,沒有tty,ssh的sudo就無法關閉密碼回顯(使用"-tt"選項強制SSH分配tty)。
所以出于安全考慮,/etc/sudoers中默認是開啟requiretty的,它要求只有擁有tty的用戶才能使用sudo,也就是說ssh連接過去不允許執行sudo 。可以通過 visudo/vim 編輯配置文件,注釋該選項來禁用它。
grep requiretty /etc/sudoers
# Defaults requiretty
修改設置/etc/sudoers是在被控節點上進行的(或者ansible連接過去修改),其實在ansible端也可以解決sudo的問題,只需在ansible的ssh參數上加上"- tt "選項即可。
ssh_args = -C -o ControlMaster=auto -o ControlPersist=5d -tt
開啟pipelining后,每次執行任務時都大量減少了ssh連接次數(只需要一次ssh連接),且省去了sftp傳輸任務文件的過程,因此在管理大量節點時能極大提升執行效率。
默認ansible在遠程執行任務是按批并行執行的,一批控制多少臺主機由命令行的"-f"或"--forks"選項控制。例如,默認的并行進程數是5,如果有20臺被控主機,那么只有在每5臺全部執行完一個任務才繼續下一批的5臺執行該任務,即使中間某臺機器性能較好,完成速度較快,它也會空閑地等待在那,直到所有20臺主機都執行完該任務才會以同樣的方式繼續下一個任務。如下所示:
h2 h3 h4 h5 h6(T1)-->h7 h7 h8 h9 h20(T1)...-->h26 h27 h28 h29 h30(T1)-->h2 h3 h4 h5 h6(T2)-->.....
在ansible 2.0中,添加了一個策略控制選項strategy,默認值為"linear",即上面按批并行處理的方式。還可以設置 strategy的值為"free"。
在free模式下,ansible會盡可能快的切入到下一個主機。同樣是上面的例子,首先每5臺并行執行一個任務,當其中某一臺機器由于性能較好提前完成了該任務,它不會等待其他4臺完成,而是會跳出該任務讓ansible切入到下一臺機器來執行該任務。也就是說,這種模式下,一臺主機完成一個任務后,另一臺主機會立即執行任務,它是"前赴后繼"的方式。如下所示:
h2 h3 h4 h5 h6(T1)-->h2 h3 h4 h5 h7(T1)-->h2 h4 h5 h7 h7(T1)-->......-->h27 h28 h29 h30(T1) h2(T2)-->h28 h29 h30(T1) h2 h3(T2)-->...
設置的方式如下:
- hosts: all
strategy: free
tasks:
...
ansible或ansible-playbook默認總是先收集facts信息。在被控主機較少的情況下,收集信息還可以容忍,如果被控主機數量非常大,收集 facts 信息會消耗掉非常多時間。
可以設置gather_facts: no
來禁止ansible收集facts信息,但是有時候又需要使用facts中的內容,這時候可以設置facts的緩存。例如,在空閑的時候收集facts ,緩存下來,在需要的時候直接讀取緩存進行引用。
ansible的配置文件中可以修改'gathering'的值為smart
、implicit
或者explicit
。
(1)smart 表示默認收集facts,但facts已有的情況下不會收集,即使用緩存facts;
(2)implicit 表示默認收集facts ,要禁止收集,必須使用gather_facts: False
;
(3)explicit 則表示默認不收集,要顯式收集,必須使用gather_facts: Ture
;
在使用facts緩存時(即設置為smart),ansible支持兩種f acts緩存:redis
和jsonfile
。
例如,以下是/etc/ansible/ansible.cfg
中jsonfile格式的緩存配置方法。
[defaults]
gathering = smart
fact_caching_timeout = 86400 ## 這里設置的緩存過期時間為86400秒,即緩存一天。
fact_caching = jsonfile fact_caching_connection = /path/to/cachedir ## 緩存的json文件放在/path/to/cachedir目錄下,各主機的緩存 文件以主機名命名。
緩存文件是一個json文件,要查看緩存文件,如/path/to/cachedir/192.168.100.59中的內容, 使用如下語句即可:
cat /path/to/cachedir/192.168.100.59 | python -m json.tool
本博文是參考馬龍帥大佬文章整理生成,屬于博主讀書筆記,如有侵權,請大佬與我聯系,立刪!
最后,感謝開源,擁抱開源~
免責聲明:本站發布的內容(圖片、視頻和文字)以原創、轉載和分享為主,文章觀點不代表本網站立場,如果涉及侵權請聯系站長郵箱:is@yisu.com進行舉報,并提供相關證據,一經查實,將立刻刪除涉嫌侵權內容。