天天看點

學習不迷茫:Ansible要如何學至精通曾經有個Linux運維,後來他累了三分鐘内我要Ansible的所有資料如何學習并學好Ansible

曾經有個Linux運維,後來他累了

在真正開始聊Ansible之前,我想先給各位講個假故事。

小安很早以前就是一名Linux運維工程師,他的基礎很紮實,常用工具和公司涉及的服務以及公司的運維流程都比較熟悉,比如他能熟練地使用Shell腳本去做一些日常的運維管理,Shell腳本不友善的時候也能寫寫PHP和Perl腳本來給自己的工作添一點色彩。由于這時公司環境比較小,小安管理的資源也比較少,是以那時候的運維工作對于小安來說,絕大多數時候就是打開遠端連接配接工具(比如Xshell),點開他需要維護的幾台主機的ssh連接配接,在這幾個視窗上敲敲指令就可以了,工作還是蠻順利的。

後來公司擴張了,小安要管理的主機逐漸變多,小安仍然用着老方法去運維,期間倒也沒有出什麼問題,公司的業務仍然是正常的。但是,現在的小安已經累覺不愛了,每次拿到新主機,無論是測試機還是生産機都要上去初始化配置一番,每次版本釋出時也要點點點、敲敲敲,此外還有很多很簡單但卻沒法省略的操作。如果隻是幾台主機,并不會有什麼枯燥的感覺,但是小安面對的是多批主機,每批主機上執行同一類操作,他經常需要在大量主機之間切換,這種日子他看不到盡頭,而且小安已經意識到公司擴張之後再也抽不出時間來學習新技能,他不想将有限的時間花在這些無謂的操作上,他不想收到HR的辭退消息,他不想......

小安覺得很累,累的原因并不是運維工作的内容有多難、背鍋的次數是不是在增加等等,真正打敗他的是單調和枯燥。單調和枯燥不僅打敗了小安,還打敗了小明、小白、小難過、小傷心等大批大批的優秀運維同胞們。這些簡單但卻無聊的部署和維護,小安和各位同胞們都隻想做一次,對此他們有共同的呼聲:"曾經體驗好過終生陪伴,否則就珍愛生命遠離運維"。

後來,配置管理工具出現了,小安看到了未來,終于不用每次都切換到各個主機上去做這些無聊、簡單又不可省略的重複配置和管理操作了。

小安比較了幾個比較出名的配置管理工具,他決定選擇Ansible,他覺得Ansible是一個集大成者,使用友善又簡單——他又愛了。

三分鐘内我要Ansible的所有資料

我趕緊去百度上Google了一下Ansible的資料,對它做個簡介。

Ansible是一個基于Python開發的配置管理和應用部署工具,現在也在自動化管理領域大放異彩。它融合了衆多老牌運維工具的優點,Pubbet和Saltstack能實作的功能,Ansible基本上都可以實作。

Ansible能批量配置、部署、管理一大堆的主機。比如以前需要切換到每個主機上執行的一或多個操作,使用Ansible隻需在固定的一台Ansible控制節點上去完成所有主機的操作。

例如,下面的操作(看不懂沒關系)表示将Ansible所在主機上的/etc/my.cnf檔案拷貝到mysql主機組内的所有主機的/etc/目錄下,mysql主機組可以是單台主機,也可以是很多台主機,這可以由使用者自己來定義。

$ ansible mysql -m copy -a "src=/etc/my.cnf dest=/etc/"           

其實,固定在一台主機上去控制其它主機,通過ssh工具或一些基于ssh二次開發的簡單工具也能實作,但Ansible吸引人的地方在于它提供的playbook能批量整合不同主機上執行的不同任務,同時還提供一些額外的機制讓使用者可以去協調這些任務的執行政策。

學習不迷茫:Ansible要如何學至精通曾經有個Linux運維,後來他累了三分鐘内我要Ansible的所有資料如何學習并學好Ansible

Ansible是基于子產品工作的,它隻是提供了一種運作架構,它本身沒有完成任務的能力,真正執行操作的是Ansible的子產品,比如copy子產品用于拷貝檔案到遠端主機上,service子產品用于管理服務的啟動、停止、重新開機等。這有點像Shell,Shell自身提供的操作是很有限的,但是它提供了一個很友好的平台讓實作各種功能的指令得以執行。Ansible自身可以類比于Shell自身,Ansible的各種子產品可以類比于Shell下各種指令。

Ansible其中一個比較鮮明的特性是Agentless,即無Agent的存在,它就像普通指令一樣,并非C/S軟體,也隻需在某個作為控制節點的主機上安裝一次Ansible即可,通常它基于ssh連接配接來控制遠端主機,遠端主機上不需要安裝Ansible或其它額外的服務。

Ansible的另一個比較鮮明的特性是它的絕大多數子產品都具備幂等性(idempotence)。所謂幂等性,指的是多次操作或多次執行不影響結果。比如算術運算時數值加0是幂等的,無論加多少次結果都不會改變,而數值加1是非幂等的,每次加1結果都會改變。再比如執行

systemctl stop xxx

指令來停止服務,當發現要停止的目标服務已經處于停止狀态,它什麼也不會做,是以多次停止的結果仍然是停止,不會改變結果,它是幂等的,而

systemctl restart xxx

是非幂等的。Ansible的很多子產品在執行時都會先判斷目标節點是否要執行任務,是以,可以放心大膽地讓Ansible去執行任務,重複執行某個任務絕大多數時候不會産生任何副作用。

如何學習并學好Ansible

Ansible作為一個自動化管理工具,它的用法可以非常簡單,隻需學幾個基本的子產品,就像ssh指令一樣去使用,就能完成一些簡單的批量配置管理功能。

它的用法也可以非常難,需要學習大量Ansible自身的知識,而且還需要學習Ansible中涉及到的額外知識。比較悲催的是Ansible的知識體系比較龐大,它的知識闆塊也比較零散,想要建構一個比較完善的Ansible知識體系确實稍有難度,這也往往會讓我們對深入Ansible無處下手甚至産生迷茫感,相信不少學習過Ansible的人對此應該都有所體會。

其實,Ansible的知識雖多,但這些知識點本身是死的,需要什麼功能學什麼功能就可以,總有一天可以吞下絕大多數的知識點。但這并不夠,實際的環境是非常靈活且複雜的,使用Ansible去管理配置時,需要關注很多任務流程和邏輯,如果編寫的任務沒有邏輯,使用Ansible很可能會讓你知道一口大鍋從天而降是一種什麼樣的體驗,是以需要去協調Ansible中的各個任務,協調各個任務是Ansible的另一難點。

最後一個難點,我個人認為是寫出适合自己公司環境的可複用(即一次編寫多次使用)的playbook或role。這要求熟悉如何應對各種需求和邏輯,對知識點也了然于心,這需要很強的綜合能力。

是以要掌握Ansible,需要:

1. 系統性地學習Ansible,進而建構自己的Ansible知識體系
- (1).學基本用法和常用子產品  
- (2).學Ansible涉及到的額外知識,如YAML和JinJa2  
- (3).學習零散但卻重要的邊角知識點,比如`delegate_to`、`run_once`  
- (4).了解一些進階玩法或很少用的上的功能             
2. 真實應用Ansible去配置管理各類服務并協調好任務邏輯,保證Ansible的執行邏輯不會影響業務

總結起來,就是一句在座的各位聽了估計會很想打人的廢話:理論和實踐相結合。

雖然确實是廢話,但卻是真理,學習總是離不開理論和實踐的,缺了任何一環,都會遇到難點和瓶頸。對Ansible的學習也如此,想要通過Ansible來釋放自己,并讓Ansible完美地執行各個任務,不僅要求Ansible的功力要達到一定層次,還需要實際的經驗來了解任務邏輯。

為了達到理論和實踐相結合的目标,需要你我雙方共同的努力。

繼續閱讀