ansible來了

番一、OP醬的自白

     自從入了貴圈,每天需要強大的內心來維護混亂的線上,每天都是用漿糊一樣的shell /python在糊牆補窟窿啊,感覺每天都是在和if else打交道啊,每次花牛鼻子勁寫的腳本,下次來點新需求,能重用的部分居然少到不想再重用,很絕望啊,有木有?批量運行工具還是在lhck lhcp,每次一長串命令,各種轉義各種煩躁啊,有木有?轉義也就罷了,還時不時被信任關係之類的bulabula,爺是root?這是啥root啊!

番二、 ansible vs puppet vs saltstack

你一定不會屈服的,實際上很多人已經揭竿而起投筆從戎寫出各種IT Automation Management Tool/System(ITAMS),甚至有人還遍嘗百草,把經驗寫成了書(佩服!),我們要搞一個進來也是大勢所趨,你真的不想擴容擴到睡着了。
你也一定聽過很多ITAMS,那麼你看好哪一個呢?所謂蘿蔔青菜各有所愛,吶,我來放一下我的選擇理由:
首先,沒有一個工具是能滿足大家所有需求的,所以開發是more or less的事了,在選擇的時候,我們的標準是:
     1. 可作爲批量執行工具
     2. 可支持playbook,模塊化
     3. 容易上手,開發擴展容易
     4. 在權限控制方面能很好的與目前的登陸授權管理系統結合
     5. 社區活躍,有問題能查到解決辦法
就playbook和模塊化來說,puppet,saltstack和ansible半斤八兩,就不細比了。
puppet有產品線已經在用,優點是歷史悠久,比較成熟,在可遠程可本地,功能強勁,不過這廝批量執行功能沒得,爲了批量執行個命令寫個配置文件,好像有點大刀砍蚊子腿的感覺了,而且有客戶端在,和授權系統結合比較麻煩。
saltstack和ansible都是python流的,而且就功能上來講,兩者也極爲相似,不同之處是salt stack是有客戶端的,並且execution模塊還用0MQ實現了pub-sub,命令和執行結果因此可以高效並行傳輸,不過成也蕭何敗也蕭何,第一個sub階段(將querystring下發到所有機器,然後收集機器響應的階段)太依賴與客戶端返回了,如果客戶端未能及時返回或未響應的話,playbook執行階段可能會直接漏掉這部分機器而沒有任何提示,這對於運維來說是不可接受的,要改造這個就得推掉saltstack的現有架構…算了吧。
與前兩者比起來,ansible在特性上似乎並不搶眼,配置管理方面(playbook)絕對比不過老大哥puppet,批量執行方面也只是多線程,不像saltstack那麼高大上,不過ansible搜索熱度高出saltstack三倍多,顯然靠的不是吹牛,至少,ansible至少不會悄悄的丟機器,這給了我們一個定心丸,而且僅依賴ssh,與登錄授權管理系統天然集成,簡單即有效,沒有比這更美妙的事情了。
So, 讓我們來嚐嚐Ansible吧!

番三、Ansible的說明書

三番一話 ansible

ansible是一個python package,是個完全的unpack and play軟件,對客戶端唯一的要求是有ssh有python,並且裝了python-simplejson包,部署上簡單到髮指。
安裝完成後,ansible套裝裏會有幾個可執行命令,我們重點講兩個
ansible 是一個批量執行工具,可以理解爲一個已經插件化的lh工具。
     一個最簡單的運行實例如下:
     
     ansible 從hosts.txt中讀取機器列表,並匹配其中機器名符合正則xcache06的機器,在其上執行date命令
     再看一個:
     
     和上一個相比,有一些變化。
     · 首先,這個例子中,機器列表是從系統配置裏自動得到的;
     · 然後還多了個-m,指明瞭我們是在調用yum模塊,實際上第一個例子中,module也是有的,只不過是默認的shell,我們可以不寫而已;
     · 最後 -a參數也有些特別,需要理解這些參數不難,執行ansible-doc yum就可以獲得幫助:
     

三番二話 host-pattern

     在上面的示例中,大家可能注意到了第一個參數,這個參數被稱爲host-pattern,主要用來從全量機器/分組列表中篩選出符合要求的機器列表。
     之所以單獨放出來講,是因爲在ansible命令中,host-pattern參數算是比較需要耗費記憶力的地方,並且我們也做了一點修改,大體介紹下:
     ”plain-example”              機器名或組名等於plain-example的機器
     ”~regex-excmple”           機器名或組名正則匹配regex-excmple的機器
     ”~regex-array[1-3]”        機器名或組名正則匹配regex-array[1-3]的機器【與官方版本有差異,官方版本有bug,查看網絡文檔時請關注】
     ”~regex-array[2]”           機器名或組名正則匹配regex-array的機器list中的第3個【爲啥是[2]?程序員從零開始數….依賴hosts腳本返回,不要使用!!】
     ”~regex-array[1:2]”        機器名或組名正則匹配regex-array的機器list中的第2個【爲啥是第2個?左閉右開+程序員從0開始….依賴hosts腳本返回,不要使用!!】
     ”pdl.relation;pdl.bmw”     獲取pdl.relation和pdl.bmw的並集,邏輯”或“
     ”pdl.relation;&pdl.bmw”   獲取pdl.relation和pdl.bmw的交集,邏輯”與“
     ”pdl.relation;!pdl.bmw”    獲取屬於pdl.relation但不屬於pdl.bmw的機器集合,邏輯”非”
     邏輯”或與非“可以與普通或正則規則一起使用,比如:
     
     但是,需要注意的是,ansible的“邏輯操作”並不遵守典型的邏輯運算法則,處理的過程是:按分號切分 — 所有“非”組成排除集 — 所有“與”組成交集, — 所有“或”組成最終結果
     官方程序支持從腳本獲取機器和分組信息,我們利用此特性與公司內的運維管理系統進行了集成,小米的機器用一組tag來維護,對於每一個tag,我們都在cache中建立了對應的組,查詢時請按照上述規則組裝即可
     比如,tagstr pdl.bmw_sbs.fe_srv.nginx 可以寫成pdl.bmw;&sbs.fe;&srv.nginx ,關於這個腳本的書寫方法和小米機器管理系統的相關介紹,可以參見“如何寫出自己的host腳本”一文。
     更多ansible相關命令,請查看ansible -h

三番三話  ansible-shell

每次敲ansible xxx ,敲得多了,是不是也有些煩躁了?來試試ansible-shell吧!這個shell來自github,我們對他做了一些修改完善,美化輸出,增加了後臺日誌,機器數實時顯示,step by等實用功能,所有更改目前已merge進主幹,來看看吧:
支持cd 確定操作集,支持內置模塊命令和參數補全,是不是方便多了?
CentOS 默認沒有裝pip,運行自然失敗,裝一個吧:
等等,權限?沒問題,加參數!
下載失敗這事吧。。,算了,下一個話題!
吶,能不能切換到其它賬號?
這個沒解決是不好意思給大家用的。
作爲一名SRE,手中自有千鈞之力,一回車reboot一票機器,豈不是成千古恨?加個-p參數吧,每次run之前都確認下,是不是安全感多了好多?
敢不看清楚就回車的,都是真勇士,大家在y前還是先確認下參數好一些。
有人就煩了,說你截圖太多了,到現在我還沒明白基礎使用呢。先系統講講唄!
行!
ansible-shell內置的命令主要有四個:
cd :     切換到指定的組/表達式篩選的機器集合上
list:    顯示目前的機器集合,list groups 可以列出所有的組(對我們可能沒啥用)
serial:運行時的併發度,默認是20
help:  顧名思義,他能生成簡單的模塊幫助信息,方便即時查詢
不過上面大家顯然看到了更多的命令,這些命令是怎麼個用法呢,我打了一行參數進去,到底是誰去執行了 ?
是這樣的:ansible-shell在啓動時將所有的內置命令/ansible模塊和參數列表等都加入自動補全中,在你敲完每個命令回車後,它會拿第一個參數判斷你輸入的是不是一個內置命令(cd/list/serial),是則執行;否則看他是不是一個ansible模塊,是則運行ansible模塊;否則,認爲他是一個shell命令,舉例來說,當你輸入hostname -i的時候,你會發現他會報錯,原因是有個ansible模塊就叫hostname,如果你一定想運行shell的那個hostname,在前面加個!就可以了
那,我就想運行shell怎麼辦? 前面加個!就好

進可攻退可守啊,會用了沒?

麻麻再也不用擔心我的批量操作了
收隊!下面我們迅速帶過剩下的部分吧!

三番末

ansible套件中的其他工具:
ansible-doc                模塊文檔查看器,很有用,使用ansible -l 顯示所有module列表,使用 ansible-doc  <module_x>來查看module_x的詳細文檔,這裏不做太多介紹
ansible-playbook    傳說中的配置管理工具,如果你用過puppet或者saltstack,這個可以不用介紹了,如果你沒用過,也沒關係,花費20分鐘看下官方的Video。 掌握一件事情最好的辦法就是使用它,你可以下載官方的example來學習
ansible-galaxy         和三星沒關係,你可以把他理解成ansible的pip,可以從galaxy.ansible.com下載官方收錄的playbooks
ansible-pull               支持直接從git下載playbook執行,需要遵循其規定的目錄格式,用處不是特別大,可以不關注
ansible-vault            如果你的配置文件中含有敏感信息,你可能並不希望他能被人看到,vault可以幫你加密/解密這個配置文件,高級用法,請參照http://blog.ansibleworks.com/2014/02/19/ansible-vault/
如果希望瞭解更多,請訪問官方wiki主頁和博客:

我想開發!

歡迎!
本人github上的地址爲htps://github.com/iambocai,歡迎您共享和交流
爲了方便大家快速瞭解代碼結構,我以執行流程作爲切入點給大家講下代碼結構。
ansible執行過程大體過程如下圖,其中暖色調的代表已經模塊化。
代碼結構就是這個樣子,對哪一塊不滿意,一起來改造吧!
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章