回到:Ansible系列文章
1.學習不迷茫:Ansible要如何學至精通
1.1 三分鐘內我要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是基於模塊工作的,它只是提供了一種運行框架,它本身沒有完成任務的能力,真正執行操作的是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去執行任務,重複執行某個任務絕大多數時候不會產生任何副作用。
1.2 如何學習並學好Ansible
Ansible作爲一個自動化管理工具,它的用法可以非常簡單,只需學幾個基本的模塊,就像ssh命令一樣去使用,就能完成一些簡單的批量配置管理功能。
它的用法也可以非常難,需要學習大量Ansible自身的知識,而且還需要學習Ansible中涉及到的額外知識。比較悲催的是Ansible的知識體系比較龐大,它的知識板塊也比較零散,想要構建一個比較完善的Ansible知識體系確實稍有難度,這也往往會讓我們對深入Ansible無處下手甚至產生迷茫感,相信不少學習過Ansible的人對此應該都有所體會。
其實,Ansible的知識雖多,但這些知識點本身是死的,需要什麼功能學什麼功能就可以,總有一天可以吞下絕大多數的知識點。但這並不夠,實際的環境是非常靈活且複雜的,使用Ansible去管理配置時,需要關注很多任務流程和邏輯,如果編寫的任務沒有邏輯,使用Ansible很可能會讓你知道一口大鍋從天而降是一種什麼樣的體驗,所以需要去協調Ansible中的各個任務,協調各個任務是Ansible的另一難點。
最後一個難點,我個人認爲是寫出適合自己公司環境的可複用(即一次編寫多次使用)的playbook或role。這要求熟悉如何應對各種需求和邏輯,對知識點也瞭然於心,這需要很強的綜合能力。
所以要掌握Ansible,需要:
- 系統性地學習Ansible,從而構建自己的Ansible知識體系
- (1).學基本用法和常用模塊
- (2).學Ansible涉及到的額外知識,如YAML和JinJa2
- (3).學習零散但卻重要的邊角知識點,比如
delegate_to
、run_once
- (4).瞭解一些高級玩法或很少用的上的功能
- 真實應用Ansible去配置管理各類服務並協調好任務邏輯,保證Ansible的執行邏輯不會影響業務
總結起來,就是一句在座的各位聽了估計會很想打人的廢話:理論和實踐相結合。
雖然確實是廢話,但卻是真理,學習總是離不開理論和實踐的,缺了任何一環,都會遇到難點和瓶頸。對Ansible的學習也如此,想要通過Ansible來釋放自己,並讓Ansible完美地執行各個任務,不僅要求Ansible的功力要達到一定層次,還需要實際的經驗來理解任務邏輯。
爲了達到理論和實踐相結合的目標,需要你我雙方共同的努力。
對於我而言,爲了讓各位不打我,我會盡最大的努力,安排好知識點的出場順序(正如人生的出場順序,知識點的出場順序也很重要),同時輔以一些我精心挑選的經典案例來解釋用法、適用場景併爲大家詳細解說任務之間的邏輯,從而循序漸進地逐步掌握Ansible的知識點,最終系統性地掌握Ansible,並熟悉Ansible的正確使用姿勢。
對於各位讀者而言,要深入掌握Ansible,需要自己去練習、測試、並記下屬於自己的筆記(杜絕完全拷貝粘貼),我能提供給各位的是知識的展現和引導,缺少了各位自己的練習和自己的筆記,這一切都是空話。