天天看點

自動化運維工具ansible詳細介紹

在學習批量管理軟體時,首先要明确的知道自己需要什麼,網上大神很多,他們都研究到源碼上了,寫了很多介紹絢麗功能的文檔,但其實那些功能基本上我們都用不到,經常被各種文檔弄得頭腦發暈,此文就是為了簡單直白的告訴大家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,如需轉載請自行聯系原作者