在學習批量管理軟體時,首先要明确的知道自己需要什麼,網上大神很多,他們都研究到源碼上了,寫了很多介紹絢麗功能的文檔,但其實那些功能基本上我們都用不到,經常被各種文檔弄得頭腦發暈,此文就是為了簡單直白的告訴大家ansible的功能,滿足大家的基本需要。
首先确認批量管理我們需要什麼:無外乎主機分組管理、實時批量執行指令或腳本、實時批量分發檔案或目錄、定時同步檔案等。
前一段時間用了saltstack,免不得要談一下他們的優缺點。兩者都是安裝和使用都非常友善的批量管理軟體。
1、salt要安裝agent;ansible不需要,通過ssh連接配接,省掉裝agent的事。
2、salt在server端要啟程序;ansible不需要,但這都無所謂差不多。
3、salt與ansible都有子產品,可使用任意語言開發子產品。
4、salt與ansible都使用yaml語言格式編寫劇本。
ansible由于走的是ssh,是以它有認證的過程,以及加密碼的過程,這使得ansible非常慢,不适用于大規模環境(指上千台)。
為什麼我放棄salt呢,首先伺服器不多(百台左右),其次,salt的master端與minion端TCP連接配接經常斷開,導緻有時執行指令時會漏機器,這簡直讓我忍無可忍。聽說最新版的salt好了很多,但由于公司系統是定制的,安裝軟體特别麻煩(15M的系統,解決依賴就是個大問題),我還是選擇了ansible。
yum install paramiko PyYAMLjinja2 httplib2 #ansible所需依賴包
git clone https://github.com/ansible/ansible.git
cd ansible
python setup.py install
cp ansible/examples/ansible.cfg/etc/ansible/ #拷貝ansible預設的配置檔案,也可不拷貝。
另一個安裝方法:
pip install ansible
在開始ansible操作受控機器前,需要配置好ssh免密碼登陸
Ansible中的臨時指令的執行是通過Ad-Hoc來完成,能夠快速執行,而且不需要儲存執行的指令,例如:
ansible -i ~/hosts all -m command -a ‘who’ -u root
主要參數如下:
-u username 指定ssh連接配接的使用者名,即執行後面指令的使用者
-i inventory_file 指定所使用的inventory檔案的位置,預設為/etc/ansible/hosts
-m module 指定使用的子產品,預設為command
-f 10 指定并發數,并發量大的時候,提高該值
--sudo [-k] 當需要root權限執行的化,-k參數用來輸入root密碼
配置好ssh免密碼登陸後,就該把那些機器加入到hosts檔案中,hosts不限路徑,可用-i參數指定路徑。
[root@yang ~]# cat /etc/ansible/hosts
[KD1] #組名
1.1.1.1:62222 #主機,此處對于端口進行指定,畢竟有些伺服器ssh端口打開的不一樣。
1.1.1.2:62222
[KD2]
1.1.1.3:62222
1.1.1.4:62222
分組執行效果:
[root@yang ~]#ansible -i /etc/ansible/hosts KD1 -m shell -a 'uptime'
1.1.1.1 | success |rc=0 >>
11:56:31 up 2 days, 17:42, load average: 0.41,0.34, 0.32
1.1.1.2 | success |rc=0 >>
11:57:03 up 2 days, 17:44, load average: 0.34,0.28, 0.25
連續的主機名使用";"号分隔,如:ansible -i /etc/ansible/hosts 'KD1;1.1.1.3' -m shell -a 'uptime'
更多的分組格式參考:
<a href="http://www.ibm.com/developerworks/cn/linux/1407_liheng_ansible/" target="_blank">http://www.ibm.com/developerworks/cn/linux/1407_liheng_ansible/</a>
還可以使用腳本動态擷取主機的方式:
批量執行指令:
ansible -i/etc/ansible/hosts all -m shell -a 'uptime'
ansible -i/etc/ansible/hosts all -m command -a 'uptime'
#shell子產品可以使用管道,而command則不可以。
批量執行腳本:
ansible all -m script -a "/root/123.sh" #此指令是在遠端伺服器上執行本地的腳本
網上文檔說,複雜的指令用playbook管理,我實在不認同,作為運維人員,我寫一個腳本多簡單,幹嘛去花太多時間研究playbook的格式與用法呢?
再說,ansible對于一些安裝包的管理,我可以事先做好rpm包,然後使用copy子產品分發過去就是,為什麼去研究太多的用法?
從ansible-doc copy中的幫助資訊得知,ansible的copy子產品是圍繞rsync的包裝,是以它是增量而不是全量的拷貝。
ansible MachineName -m copy -a 'src=/etc/fstab dest=/tmp/fstab mode=644 owner=root' #拷貝檔案
ansible MachineName -m copy -a 'src=/etc/test dest=/root/test mode=755 owner=root ' #此處test為目錄
既然ansible的copy子產品是rsync的包裝,那我定期執行copy目錄的指令,就能完成檔案的定時同步了。如果檔案變化,就會同步過去,如果沒變化,就不會拷貝。以後隻要把要同步的檔案放到該目錄下即可。
執行指令用到的那些子產品是幹嘛的?使用ansible-doc檢視幫助吧。
ansible-doc -l #檢視子產品清單
ansible-doc copy #檢視copy子產品的詳細資訊
ansible-doc script #檢視script子產品的詳細資訊
常用的子產品有ping,copy,shell,command,script等。更多子產品的使用請自行探索吧,我比較懶,滿足我的需求後就不想動腦了。
其實playbook就是把上述在指令行的操作,以yml格式寫在檔案中來執行而已。複雜的playbook隻是更多的指令行操作的集合。
此例:當某個檔案變化後,移走該檔案。
#cat playbook.yml
---
- hosts: local # hosts中指定
remote_user: yang # 如果和目前使用者一樣,則無需指定
tasks:
- name: whoami
copy: src=~/hosts dest=~/hosts.dest # 本地拷貝到遠端
notify: # 如果copy執行完之後~/hosts.dest檔案發送了變化,則執行
- clear copy # 調用handler中的clear copy定義的動作
handlers:
- name: clear copy
shell: 'mv ~/hosts.dest hosts.del' # 假裝删除
注解:
tasks定義了playbook中要執行的任務,包括任務名name以及具體的任務内容
notify:類似于Salt的require,表示目前面的任務完成後且有相應的變化時調用後面定義的handler
handlers:與notify結合使用,被調用的handler的具體定義
playbook執行方法:
ansible-playbook playbook.yml #主機名、執行指令都已在yml中指定了。
本文轉自楊雲1028 51CTO部落格,原文連結http://blog.51cto.com/yangrong/1559020,如需轉載請自行聯系原作者