前言
最近看了一下ansible,挺火的一個配置管理工具,對比老大哥puppet,使用起來要簡單一些,並且可以批量執行命令,對比同是python語言編寫的saltstack,不需要安裝客戶端(基於paramiko),也更靈活一些,尤其我們現有的登錄方式,通過跳板機加密鑰,改造成ansible成本很低,准備學習一下以后在生產上使用。
ansible已被紅帽收購,目前出到2.0了,和紅帽的朋友聊了一下,這個配合現在大火的openstack(紅帽是其代碼最大貢獻者之一),看來以后會成為自動化運維的一個趨勢。
官網地址http://docs.ansible.com/
安裝
最簡單的epel之后,yum install ansible
也可以用pip的方式
pip install ansible即可
如果像我們一樣服務器不能連接公網,需要手動下載一下python模塊ecdsa, pycrypto, paramiko, MarkupSafe, jinja2, PyYAML, ansible
目前安裝的版本是1.9.4
ansible --version
ansible 1.9.4
入門使用
首先把ssh密鑰搞好,這里就不說了,保證master和minion之間不通過密碼
定義主機和組:
vim /etc/ansible/hosts #默認的文件位置,也可執行ansible時手動指定hosts文件,通過-i參數
[test]
10.199.2.45
10.199.2.46 [web] 10.199.2.[42:47] #=10.199.2.42\43\44\45\46\47 test.case.com #主機名定義
使用第一個模塊:
ansible test -m ping -u sre -s #-m接模塊名,因為我們使用的是sre賬戶登錄后通過sudo的方式,-u接用戶,-s表示sudo方式執行
ansible test:\!10.199.2.46 -m ping -u sre -s #:\!排除某個主機
ansible 10.199.2.46 -m ping -u sre -s #當然也可以直接接ip而不使用組進行
ansible自帶了很多模塊
可以通過ansible-doc -l 查看總共有哪些模塊,ansible-doc ping 顯示某個模塊的用法,ansible-doc -s ping 顯示某個模塊在playbooks中的代碼片段
遠程執行命令模塊:
遠程執行命令可能是ansible最常用也是最方便的一個功能,這里舉幾個例子
1.執行minion操作系統命令
ansible test -a 'w' -u sre -s #默認模塊command,實現執行遠程命令,-a接模塊參數
2.minion上執行master上腳本
master先創建腳本1.sh
#!/bin/bash
ls /tmp/
ansible test -m script -a '1.sh' -u sre -s #script模塊相當於scp+shell,將本地腳本在遠端minion進行執行
3.minion執行minion上腳本,2.45遠端存在minion.sh,2.46不存在
ansible test -m shell -a '/tmp/minion.sh' -u sre -s
shell和command模塊很類似,看幫助信息了解到command和shell功能基本一致,但shell可以使用環境變量、管道等,功能更強大
copy模塊
ansible test -m copy -a 'src=1.sh dest=/tmp/ owner=root group=root mode=0755' -u sre -s
#將本地1.sh文件傳到遠端,如第二次執行此命令,如無更新,則遠端無更新,有更新,則遠端更新
yum模塊
ansible test -m yum -a "name=nc state=latest" -u sre -s
cron模塊
ansible test -m cron -a "name='test' job='ls /tmp' minute=*/2 hour=3,4,5" -u sre -s
#對端服務器crontab -l
#Ansible: test
*/2 3,4,5 * * * ls /tmp
ansible test -m cron -a "name='test' state=absent" -u sre -s #刪除該條cron
service模塊
ansible test -m service -a "name=ntpd state=started" -u sre -s
ansible test -m service -a "name=ntpd state=stopped" -u sre -s
user模塊
ansible test -m user -a "name=test123" -u sre -s #創建用戶 ansible test -m user -a "name=test123 state=absent remove=yes" -u sre -s #刪除用戶並刪除家目錄
lineinfile模塊
#用於文件內的內容處理 ansible ctx-lf -m lineinfile -a "dest=/tmp/sudoers line='appuser ALL=(ALL) NOPASSWD:ALL' insertafter=^sre" -u sre -s -i host #在sudo文件中sre開頭之后加入line=的內容,insertafter可以寫正則或EOF(結尾),同理還有insertbefore也可以寫正則或BOF(開頭) ansible ctx-lf -m lineinfile -a "dest=/tmp/sudoers state=absent regexp=^appuser" -u sre -s -i hosts #去掉正則匹配的所有行 ansible ctx-lf -m lineinfile -a "dest=/tmp/sudoers regexp=^sre line='#sre ALL=(ALL) NOPASSWD:ALL'" -u sre -s -i hosts #將sre開頭的最后匹配的一行前邊加上# #也可以用()形式做替代變更,類似sed ansible ctx-lf -m lineinfile -a "dest=/tmp/sudoers regexp=^(sre.*)$ line='#\1' backrefs=yes" -u sre -s -i hosts #\1表示第一個()里的內容,注意這種用法需要backrefs為yes,開啟擴展正則匹配 ansible ctx-lf -m lineinfile -a "dest=/tmp/sudoers regexp=^(sre.*)$ line='123123' validate='visudo -cf %s'" -u sre -s -i hosts #加入validate的驗證,比如sudo文件如果改錯了,可能影響整個系統的管理,加入驗證之后,如果修改的sudo文件格式錯誤,將不會保存
進階一下,請看下一篇ansible playbook的基本介紹 http://www.cnblogs.com/caseast/p/5181910.html