ansible的優化

YatHo發表於2017-12-15

Ansible企業實戰環境中,如果管理的伺服器越來越多,Ansibe執行效率會變得比較慢,可以通過優化Ansible提供工作效率,由於Ansible基於SSH協議通訊,SSH連線慢會導致整個基於Ansible執行變得緩慢,也需要對Openssh進行優化,具體優化的方法如下:

1 開啟SSH長連線

ansible是通過使用ssh和遠端主機進行通訊,所以對ssh有這很強的依賴。在OpenSSH 5.6以後支援Multiplexing這個特性,可以通過在ansible配置中設定以支援該特性。

如下是配置引數,設定長連線保持時間為5天;control_path指定socket檔案所儲存的位置。

ssh_args = -o ControlMaster=auto -o ControlPersist=5d
control_path = /etc/ansible/ssh-socket/%%h-%%p-%%r

通過上面配置後,ansible中控機上執行一次與遠端主機的連線之後,這個連線會持久保持設定時間之久。可以通過netstat命令檢視到ESTABLISHED狀態的連線資訊。

注意1:OpenSSH需要5.6以上版本,低版本需要升級才能使用。 
Centos7系統上安裝的OpenSSH版本是較新的,可以直接支援;對於Centos6的系統,自帶的OpenSSH版本較低,可以用下面這個yum源進行升級yum update openssh-clients:

# /etc/yum.repos.d/openssh.repo 
[CentALT]
name=CentALT Packages for Enterprise Linux 6
baseurl=http://mirror.neu.edu.cn/CentALT/6/$basearch/
enabled=1
gpgcheck=0

注意2:control_path指定的目錄不存在,或執行ansible命令的使用者沒有寫許可權的話是會報錯的。

2 開啟pipelining

預設情況下,ansible的執行流程是把生成好的本地python指令碼PUT到遠端伺服器然後執行。如果開啟了pipelining,整個流程少了一個PUT指令碼到遠端伺服器的步驟,直接在SSH的會話中進行,可以提高整個執行效率。

# 在ansible.cfg配置檔案中設定pipelining為True
pipelining = True

需要注意的是:如果開啟pipelining,需要被控的遠端伺服器將/etc/sudoers中的”Defaults requiretty”註釋掉,否則會出現類似如:you must have a tty to run sudo 的報錯。

3 開啟accelerate模式

accelerate模式類似於SSH的Multiplexing功能,都是使ansible控制伺服器和遠端伺服器之間保持長連線。accelerate模式是使用python程式在遠端伺服器上執行一個守護程式,ansible通過這個守護程式監聽的埠進行通訊。

accelerate模式的開啟方法很簡單,只要在playbook中配置accelerate: true即可。ansible.cfg配置檔案中需要配置一些accelerate引數,如:

[accelerate]
accelerate_port = 5099
accelerate_timeout = 30
accelerate_connect_timeout = 5.0

注意:使用accelerate模式,需要控制伺服器和遠端伺服器都安裝python-keyczar包

4 對facts設定優化

ansible playbook預設第一個task是Gathering Facts收集各主機的facts資訊,以方便我們在paybook中直接引用facts裡的資訊。

如果不需要用到facts資訊的話,可以設定gather_facts: false,來省去facts採集這一步以提高playbook效率。

如果既想用facts資訊,有希望能提高playbook的效率的話,可以採用facts快取來實現。 
facts快取支援多種方式:json檔案方式,redis方式,memcache方式等。各種方式的配置都是在ansible.cfg中配置。

1)json檔案方式

gathering=smart
fact_caching_timeout=86400
fact_caching=jsonfile
fact_caching_connection=/path/to/ansible_fact_cache

這裡的86400單位為秒,表示快取的過期時間。儲存facts資訊的json檔案儲存在/path/to/ansible_fact_cache下面,檔名是按照inventory hostname來命名的。

2)redis方式

gathering=smart
fact_caching_timeout=86400
fact_caching=redis

需要注意的是,facts儲存不支援遠端的redis,需要在ansible的控制伺服器上安裝redis;同時,還需要安裝python的redis模組。

3)memcache方式

gathering=smart
fact_caching_timeout=86400
fact_caching=memcached

與redis方式類似,需要執行memcached服務,同時,安裝python的memcached依賴包。

相關文章