前言
最近看了一下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作業系統指令
1 | |
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不存在
|
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
ansible test -m service -a "name=ntpd state=started" -u sre -s
ansible test -m service -a "name=ntpd state=stopped" -u sre -s
ansible test -m user -a "name=test123" -u sre -s #建立使用者
ansible test -m user -a "name=test123 state=absent remove=yes" -u sre -s #删除使用者并删除家目錄

#用于檔案内的内容處理
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檔案格式錯誤,将不會儲存
