拿什么拯救你,我的Ansible
在自動(dòng)化運(yùn)維方面,我用過(guò)Chef,Puppet,Salt還有Ansible。
其中Chef和Puppet之前在線上用了很長(zhǎng)一段時(shí)間,效果也都不錯(cuò)。后來(lái),我們希望嘗試一些新的工具,而Salt和Ansible都是通過(guò)Python實(shí)現(xiàn)的,加上我們的團(tuán)隊(duì)也很喜歡用Python,所以就對(duì)二者進(jìn)行了一些比較和試用。
就我個(gè)人而言,當(dāng)時(shí)是比較推崇Salt的,因?yàn)榭雌饋?lái)Salt更輕量級(jí),跟Puppet在配置管理方面也非常相似,而且Salt的源碼看起來(lái)很舒服,結(jié)構(gòu)很簡(jiǎn)單,很適合學(xué)習(xí)和做二次開(kāi)發(fā)。
但Ansible看起來(lái)則似乎更獨(dú)特一些,通過(guò)SSH通道實(shí)現(xiàn)免Agent,同時(shí)在配置方面顯得更干練,也有豐富的模塊,能通過(guò)tags對(duì)每個(gè)配置項(xiàng)來(lái)進(jìn)行靈活的分組。這些特點(diǎn),得到了另外一些同事的大力肯定和推薦,在經(jīng)歷過(guò)幾次爭(zhēng)論之后,領(lǐng)導(dǎo)決定將線上所有的Puppet配置都遷移到Ansible上去。
在初期,使用Ansible感覺(jué)是比較新鮮的,還略微有點(diǎn)嗨,因?yàn)椴辉傩枰惭bAgent了,新服務(wù)器上線之后,把主機(jī)名加入hosts inventory,利用初始的root用戶(hù)密碼Push一次,整個(gè)配置任務(wù)就算完成了。
但在運(yùn)行了半年多之后,在我們將所有的Puppet配置都遷移過(guò)來(lái)后,在不停的增加新的配置的情況下,我感到了痛苦,是真真正正的痛苦。
因?yàn)椋覀兡壳昂茈y確保線上的配置是完整的,上下邏輯是沒(méi)有問(wèn)題的,是能夠適用于所有環(huán)境的。
而這些,不是Ansible的問(wèn)題,是人的問(wèn)題。
由于Ansible免Agent,所以每一次配置的更改,都需要主動(dòng)的Push一次。在之前配置內(nèi)容不多,服務(wù)器較少的情況下,我們每次都直接把整個(gè)配置 Push一次。但隨著配置的增多,服務(wù)器數(shù)量增加到了一個(gè)相對(duì)飽和的程度時(shí),我們絕大部分情況下都只需要對(duì)現(xiàn)有的服務(wù)器配置進(jìn)行一些調(diào)整,例如增加或更新某個(gè)軟件,修改某個(gè)參數(shù)等。
在這種情況下,我們每一次的Push基本上都是通過(guò)tags來(lái)完成的,沒(méi)有人愿意在每次都將所有的配置都主動(dòng)Push一次,沒(méi)有人會(huì)有這個(gè)耐心,因?yàn)槭褂胻ags來(lái)執(zhí)行我想要修改的部分,可能只需要10秒,而將整個(gè)配置都跑一次,則需要3分鐘甚至更長(zhǎng)的時(shí)間。因此,日積月累,整個(gè)配置的完整性沒(méi)有了保障,大家更新過(guò)的地方,通過(guò)tags跑都沒(méi)有問(wèn)題,但是拋開(kāi)tags將整個(gè)配置Push一次的時(shí)候,就會(huì)發(fā)現(xiàn),各種沖突和錯(cuò)誤都出現(xiàn)了。
我曾經(jīng)寫(xiě)過(guò)一個(gè)CDH5的role,在最開(kāi)始部署集群時(shí)沒(méi)有一點(diǎn)錯(cuò)誤,但是在維護(hù)了1個(gè)月之后,需要新上線一個(gè)新的CDH5集群時(shí),這個(gè)role根本無(wú)法完成一個(gè)新集群的部署,我花費(fèi)了足足2天來(lái)修復(fù)所有的報(bào)錯(cuò),我發(fā)現(xiàn),在這1個(gè)月里,大家更新了很多的地方,通過(guò)那些綁定的tags在現(xiàn)有的環(huán)境中 Push,都不會(huì)報(bào)錯(cuò)。
但其實(shí)有很多地方,是有沖突和邏輯問(wèn)題的,很多僅需要在初始化的時(shí)候執(zhí)行的配置之后再也沒(méi)有執(zhí)行過(guò),因?yàn)楦潞蟮呐渲么蠹叶际峭ㄟ^(guò)tags進(jìn)行Push的,而Ansible在任何一個(gè)配置項(xiàng)報(bào)錯(cuò)時(shí)都會(huì)中止。
這的確是人的問(wèn)題,但這也是符合人性的。我們嘗試過(guò)不使用tags來(lái)Push,但之后所有的人都覺(jué)得這樣太過(guò)愚蠢,因?yàn)榻^大部分時(shí)間都不會(huì)發(fā)現(xiàn)錯(cuò)誤,只會(huì)浪費(fèi)時(shí)間。而經(jīng)過(guò)一段時(shí)間之后,誰(shuí)都不敢保證整個(gè)配置Push一次是沒(méi)有問(wèn)題的,并且,殘酷的現(xiàn)實(shí)告訴我們,每次都會(huì)有錯(cuò)誤出現(xiàn)。
為何之前在使用Puppet的時(shí)候,沒(méi)有遇到過(guò)這樣的困擾呢?因?yàn)椋珹gent的方式,每次都需要Pull所有關(guān)聯(lián)的配置,需要耗費(fèi)一些時(shí)間,但由于不需要手動(dòng)去Push,所以感受會(huì)不同,我們沒(méi)有覺(jué)得浪費(fèi)了多少時(shí)間,也不用擔(dān)心更新之后其它的配置項(xiàng)會(huì)有問(wèn)題。
這或許不是工具的問(wèn)題,是我們沒(méi)有找到一個(gè)合適的方法來(lái)使用它。
但是,真的很難找到解決的辦法,強(qiáng)制所有人Push整個(gè)配置,或周期性的檢查整個(gè)配置,都難以實(shí)施下去。
該拿什么拯救你,我的Ansible。
原文鏈接:http://heylinux.com/archives/3245.html?utm_source=tuicool&utm_medium=referral