一. 簡述:
??
搞過運維自動化工具的人,肯定會發現很多運維伙伴們經常用saltstack和ansible做比較,單從執行效率上來說,ansible確實比不上saltstack(ansible使用的是ssh,salt使用的是zeromq消息隊列[暫沒深入了解]),但其實ansible還是可以通過一些方面進行優化的,并且優化后的效率應不差salt太多。
二. 優化配置:
? ? 參考了一些資料,可優化以下方面:
? ?1.?開啟ssh長連接:
? ? ? ?所謂的長連接,指的是,在第一次認證進入會話后,保持連接,直到認證時間到期(這樣就節省了每次連接時的認證時間)。ssh的長連接時再OpenSSH 5.6版本以后才支持的,故如果版本不夠的話,想開啟長連接的話需要升級,配置ansible的ssh 長連接方法如下:
? ? ?編輯ansible配置文件修改以下參數:
ssh_args = -o ControlMaster=auto -o ControlPersist=2d #這里設置保持長連接的時間為2天
開啟后會在當前ansible/cp/下生成一個socket文件(也可通過netstat ,會有一個ESTABLISHED狀態連接)。
? 2.開啟pipelining:
? ? ?這個功能,目前還沒有研究明白, 官方也只提了下是openssh的一個管道特性,可以減少遠程操作的次數。開啟pipelining需要被操作主機/etc/sudoers中的ansible ssh 用戶配置改為requiretty,我這邊使用kerberos認證的,暫未遇到問題,修改ansible配置如下:
pipelining = True
配置前執行過程:
$ ansible test -a 'hostname' -vvv
Using /etc/ansible/ansible.cfg as config file
<BJCER11-18.opi.com> ESTABLISH SSH CONNECTION FOR USER: None
<BJCER11-18.opi.com> SSH: EXEC ssh -C -q -o ControlMaster=auto -o ControlPersist=1d -o KbdInteractiveAuthentication=no -o PreferredAuthentications=gssapi-with-mic,gssapi-keyex,hostbased,publickey -o PasswordAuthentication=no -o ConnectTimeout=10 -o ControlPath=/data/web/.ansible/cp/ansible-ssh-%h-%p-%r BJCER11-18.opi.com '/bin/sh -c '"'"'( umask 77 && mkdir -p "` echo $HOME/.ansible/tmp/ansible-tmp-1467023977.89-116243253485818 `" && echo ansible-tmp-1467023977.89-116243253485818="` echo $HOME/.ansible/tmp/ansible-tmp-1467023977.89-116243253485818 `" ) && sleep 0'"'"''
<BJCER11-18.opi.com> PUT /tmp/tmpY2uNkb TO /data/web/.ansible/tmp/ansible-tmp-1467023977.89-116243253485818/command
<BJCER11-18.opi.com> SSH: EXEC sftp -b - -C -o ControlMaster=auto -o ControlPersist=1d -o KbdInteractiveAuthentication=no -o PreferredAuthentications=gssapi-with-mic,gssapi-keyex,hostbased,publickey -o PasswordAuthentication=no -o ConnectTimeout=10 -o ControlPath=/data/web/.ansible/cp/ansible-ssh-%h-%p-%r '[BJCER11-18.opi.com]'
<BJCER11-18.opi.com> ESTABLISH SSH CONNECTION FOR USER: None
<BJCER11-18.opi.com> SSH: EXEC ssh -C -q -o ControlMaster=auto -o ControlPersist=1d -o KbdInteractiveAuthentication=no -o PreferredAuthentications=gssapi-with-mic,gssapi-keyex,hostbased,publickey -o PasswordAuthentication=no -o ConnectTimeout=10 -o ControlPath=/data/web/.ansible/cp/ansible-ssh-%h-%p-%r -tt BJCER11-18.opi.com '/bin/sh -c '"'"'LANG=en_US.utf-8 LC_ALL=en_US.utf-8 LC_MESSAGES=en_US.utf-8 /usr/bin/python /data/web/.ansible/tmp/ansible-tmp-1467023977.89-116243253485818/command; rm -rf "/data/web/.ansible/tmp/ansible-tmp-1467023977.89-116243253485818/" > /dev/null 2>&1 && sleep 0'"'"''
BJCER11-18.opi.com | SUCCESS | rc=0 >>
BJCER11-18.opi.com
配置后執行過程:
$ ansible test -a 'hostname' -vvv
Using /etc/ansible/ansible.cfg as config file
<BJCER11-18.opi.com> ESTABLISH SSH CONNECTION FOR USER: None
<BJCER11-18.opi.com> SSH: EXEC ssh -C -q -o ControlMaster=auto -o ControlPersist=1d -o KbdInteractiveAuthentication=no -o PreferredAuthentications=gssapi-with-mic,gssapi-keyex,hostbased,publickey -o PasswordAuthentication=no -o ConnectTimeout=10 -o ControlPath=/data/web/.ansible/cp/ansible-ssh-%h-%p-%r BJCER11-18.opi.com '/bin/sh -c '"'"'LANG=en_US.utf-8 LC_ALL=en_US.utf-8 LC_MESSAGES=en_US.utf-8 /usr/bin/python && sleep 0'"'"''
BJCER11-18.opi.com | SUCCESS | rc=0 >>
BJCER11-18.opi.com
可發現,確實是精簡了操作次數(意味著操作時間的縮短,所以:如沒特殊需求,建議開啟pipelining)!
3.?accelerate模式(1.3版本后):
? ? ansible有一個accelerate(加速)模式,類似于ssh的multiplexing(a中描述),都依賴于ansible控制機和被控制機直接的長連接,區別在于accelerate是使用python在被控制機上運行一個守護進程,通過監聽的端口進行通信,需要在控制主機和被控制主機上安裝python-keyczar工具,開啟ansible的accelerate模式,只需要在playbook中配置:
accelerate: true
還需要在ansible.cfg中定義相關參數,如:
[accelerate]
accelerate_port = 5099
accelerate_timeout = 30
accelerate_connect_timeout = 5.0
4.?配置facts信息緩存:
? ?在使用playbook時,默認會采集每臺被操作主機的facts信息,但不需要采集的信息時,可通過一下參數關閉:
gather_facts: False
但如果需要時,并且對數據的實時性要求不高時,可配置facts信息緩存機制,ansible支持使用json文件存儲facts信息,使用緩存需修改以下配置(ansibe.cfg):
gathering = smart
fact_caching_timeout = 86400 #cache過期時間
fact_caching = jsonfile
fact_caching_connection=/tmp/ansible_fact_cache #cache存放路徑
具體執行區別:
? a). 先不配置cache,執行如下:
# time ansible-playbook bbb.yamlPLAY [test2] *******************************************************************TASK [setup] *******************************************************************
ok: [10.5.11.11]TASK [req value] ***************************************************************
changed: [10.5.11.11]TASK [copy nginx.conf] *********************************************************
ok: [10.5.11.11] => {
......................................real 0m4.345s
user 0m1.363s
sys 0m0.281s
b). 開啟后執行(第2次):
# time ansible-playbook bbb.yamlPLAY [test2] *******************************************************************TASK [req value] ***************************************************************
changed: [10.5.11.11]TASK [copy nginx.conf] *********************************************************
ok: [10.5.11.11] => {
.........................................real 0m1.019s
user 0m0.618s
sys 0m0.149s
可發現時間大量縮短(過程中沒有TASK [setup]這一步)
?----------------------------------------------------------------------------------------------
深耕運維行業多年,擅長linux、容器云原生、運維自動化等方面。
承接各類運維環境部署、方案設計/實施、服務代運維工作,歡迎溝通交流 !