本節書摘來自華章出版社《ansible權威指南 》一書中的第3章,第3.2節,李松濤 魏 巍 甘 捷 著更多章節内容可以通路雲栖社群“華章計算機”公衆号檢視。
本節介紹通過ad-hoc指令集檢視系統設定,通過ad-hoc研究ansible的并發特性,通過ad-hoc研究ansible的子產品使用。俗話說,磨刀不誤砍柴工。開始之前做一些簡單的初始化檢查,如系統時間正确與否、磁盤容量是否充足等,是很有必要的。
在實際工作中,很多“詭異”問題迫使我們花費大量時間排查,最終卻發現是非常簡單的基礎環境問題導緻的。這其實還是挺常見的,不論對新手還是老鳥均如此,謹記!
我們前面做的系統時間正确與否、磁盤容量是否充足等工作,其實linux下是有開源工具可以幫助我們自動監控的。這裡也為大家推薦幾款linux下耳熟能詳的監控工具,如zabbix、nagios、cacti、falcon、cat等。
本節我們介紹ad-hoc指令集用法。ad-hoc指令集由/usr/bin/ansible實作,其指令用法如下:
可用選項如下。
--list-hosts:列出符合條件的主機清單,不執行任何指令。
下面的示例有助于加深對上述内容的了解。
情景1:檢查proxy組所有主機是否存活。
執行指令:
192.168.37.159 | success >> {
}
ansible proxy -s -m command -a 'hostname' -vvv
<192.168.37.159> establish connection for user: root on port 22 to 192.168.37.159 # 遠端主機192.168.37.159監聽root使用者的22号端口
<192.168.37.159> remote_module command hostname # 遠端執行指令hostname
<192.168.37.159> exec /bin/sh -c 'mkdir -p $home/.ansible/tmp/ansible-tmp-1455684626.83-94958346638443 && echo $home/.ansible/tmp/ansible-tmp-1455684626.83-94958346638443' # 生成臨時目錄用于存放ansible遠端執行腳本
<192.168.37.159> put /tmp/tmp5sawsq to /root/.ansible/tmp/ansible-tmp-1455684626.83-94958346638443/command # 改名臨時腳本并存放至臨時目錄
<192.168.37.159> exec /bin/sh -c 'sudo -k && sudo -h -s -p "[sudo via ansible, key=urvzacjxvaagwvlrywymxpxfhjkirkqb] password: " -u root /bin/sh -c '"'"'echo become-success-urvzacjxvaagwvlrywymxpxfhjkirkqb; lang=c lc_ctype=c /usr/bin/python /root/.ansible/tmp/ansible-tmp-1455684626.83-94958346638443/command; rm -rf /root/.ansible/tmp/ansible-tmp-1455684626.83-94958346638443/ >/dev/null 2>&1'"'"'' # 使用sudo方式并以python腳本方式執行指令
192.168.37.159 | success | rc=0 >> # 傳回結果為success,coderesult為0
ansible web --list
10.3.33.21
10.3.33.23
--list選項列出web組所有主機清單資訊,web組中包括 10.3.33.21 和 10.3.3
// time指令可省,為友善觀察結果,這裡使用time指令檢視執行時長
time ansible 10.21.40.61 -b 5 -p 2 -t 2 -m command -a 'sleep 20' -u root
第1行:[warning]不用理會,需更新gmp,該提醒不影響指令傳回結果
第2行:background launch...表示使用-b使該指令背景運作
下面每隔2s輸出一次執行進度
polling on 10.21.40.61, 3s remaining表示執行時長剩餘3s
polling on 10.21.40.61, 1s remaining表示執行時長剩餘1s
real 0m10.268s程式執行總時長
user 0m1.898s系統使用者層執行時長
sys 0m0.163s系統核心層執行時長
細心的朋友會發現,我們sleep 20表示暫停 20s,即該指令最少執行時長為20s,但為什麼real程式實際運作時長隻有10s呢?這就是-b選項的意義了,如果超過其指定時間則終止正在執行的任務(但real為什麼是10.268s而不是5.268s,經筆者實測,-b功能生效但時間不精确,正式使用前請多測試)。
ansible apps -a "df -lh"
192.168.37.130 | success | rc=0 >>
filesystem size used avail use% mounted on
/dev/mapper/vg_linuxlst-lv_root
tmpfs 123m 0 123m 0% /dev/shm
/dev/sda1 485m 29m 431m 7% /boot
192.168.37.155 | success | rc=0 >>
filesystem size used avail use% mounted on
/dev/mapper/vg_linuxlst-lv_root 18g 4.9g 12g 30% /
tmpfs 144m 0 144m 0% /dev/shm
/dev/sda1 485m 33m 427m 8% /boot
192.168.37.142 | success | rc=0 >>
/dev/mapper/vg_linuxlst-lv_root 18g 5.4g 12g 33% /
192.168.37.156 | success | rc=0 >>
/dev/mapper/vg_linuxlst-lv_root 8.4g 6.4g 1.6g 81% /
tmpfs 140m 0 140m 0% /dev/shm
/dev/sda1 485m 35m 426m 8% /boot
/dev/sdb5 20g 3.0g 16g 16% /data2
以192.168.37.130的傳回為例,success表示指令執行成功,rc=0表示resultcode=0,即指令傳回結果,傳回碼為0,表示指令執行成功,>>後面跟的内容相當于在主機本地執行df –lh後的結果傳回。
情景2:批量檢視遠端主機記憶體使用情況(shell子產品)。
ansible apps -m shell -a "free -m"
mem: 286 282 4 0 34 119
-/+ buffers/cache: 128 158
swap: 2015 668 1347
mem: 244 188 56 0 30 101
-/+ buffers/cache: 56 187
swap: 1023 0 1023
mem: 286 217 69 0 84 63
-/+ buffers/cache: 68 218
swap: 2015 0 2015
mem: 279 251 28 0 29 33
-/+ buffers/cache: 188 91
swap: 1023 22 1001
以192.168.37.142的傳回為例,success表示指令執行成功,rc=0表示resultcode=0,即指令傳回結果,傳回碼為0,表示指令執行成功,>>後面跟的内容相當于在主機本地執行free-m後的結果傳回。
[apps]
192.168.37.130
192.168.37.155
192.168.37.142
192.168.37.156
``
步驟2:多次執行ansible指令,執行指令如下:
步驟3:對比傳回結果,如表3-1所示。

表3-1 傳回結果對比
第1次傳回結果 第2次傳回結果
傳回結果分析如下:
1)同樣的指令多次執行,但每次的輸出結果都不一定一樣。
2)輸出結果不是按照/etc/ansible/hosts中[apps]定義的主機順序輸出。
3)結果輸出基本上遵循每次輸出3條記錄(線程池始終保持3個線程,是以這裡如果每次輸出小于等于3都是正常的)。
通過上面的實驗我們對ansible的并發性有了概念性的了解。回到前面的問題,企業實際應用中,如主機數量很多,我們需調大線程數,該如何操作呢?這裡ansible為我們提供了便捷的選項,-f指定線程數,如-f 1表示并發啟動一個線程,-f 10則表示同時啟動10個線程并發執行指令。其實檢視源碼可知,ansible使用multiprocessing管理多線程。
單台主機的性能始終有限,大家根據自己機器實際的硬體配置做調整,建議并發數配置的cpu核數偶數倍就好。如4cores 8gb的伺服器,建議最多并發20個線程。關于ansible的性能,後面章節會為大家介紹ansible的加速模式。
前面的章節為大家詳細介紹了ad-hoc的指令集使用方法及其并發特性等,那麼,ansible究竟有多少現成功能可供大家使用呢?本節來為大家介紹ad-hoc的子產品使用。
截至本篇編寫時(2016-2-11),官方呈現的所有可用子產品為468個(2016-8-19所有可用子產品為622個,短短6個月增加了154個,可見ansible的發展速度),所有子產品官方也做了詳盡的功能分類。明細可參考官方連結。另外,ansible也提供了類似于man功能的help說明工具ansible-doc,直接按Enter鍵或輸入-h顯示功能用法。它和linux系統下的man指令一樣重要,正式學習ansible子產品使用前,有必要先了解ansible-doc用法。
指令用法:
下面我們看些簡單的示例。
情景1:顯示所有可用子產品。
傳回結果如下:
情景2:以yum子產品為例,我們希望擷取yum子產品的help說明。
其他子產品help說明以此類推即可。下面通過ansible内置子產品來完成一些具體工作。
【示例1】安裝redhat-lsb并檢視伺服器系統版本号。
步驟1:安裝redhat-lsb。
其中:
步驟2:檢視系統版本号。
部分執行結果诠釋:
ansible apps -s -m yum -a "name=ntp state=present"
ansible apps -m service -a "name=ntpd state=started enabled=yes"