1. 程式人生 > >Ansible的應用場景分析

Ansible的應用場景分析

配置管理 ansible

Ansible的應用場景分析

最近對devops很感興趣,從而也開始接觸自動化運維工具,在網上查閱了很多關於ansible的資料,對ansiblesaltstack等工具的爭論也很激烈,各說各的優勢,但是爭論了半天我總感覺這些工具和持續交付並不是一個目的。

首先來講,無論是ansible還是saltstack都是被稱為是“配置管理”的工具,那麽究竟什麽是“配置管理”呢?我的理解就是把對計算機進行的配置集中管理起來。

而且Ansible是一個聲明式的管理工具,在編寫腳本時使用的是聲明式語言,如:“我希望這臺機器的apache服務是啟動的”,那麽在執行時如果發現服務是啟動的則返回“ok”,如果服務沒有啟動則啟動它並返回“

changed”。那麽相比shell這種“命令式”語言,聲明式語言更智能,因為如果用shell啟動apache,如果發現服務已經啟動,則會返回“端口被占用”的錯誤,並異常退出,返回碼非0,這樣就會導致後面的腳本中斷執行,是很煩人的一種情況。

舉個例子(如下表所示):比如我希望在主機ABC上部署JDK1.7的環境,主機DEF上部署JDK1.8的環境,而又想在AB上安裝NginxCD上部署TomcatEF上部署MySQL,這時候使用Ansible工具是最佳的。對於這種情況需要新建5roles,分別是:JDK1.7JDK1.8NginxTomcatMySQL。對於AB主機,安裝

JDK1.7NginxrolesC主機安裝JDK1.7TomcatrolesD主機安裝JDK1.8Tomcat的角色,EF主機安裝JDK1.8MySQL的角色。換句話講,Ansible就是對於各種環境的搭積木式組合,你需要什麽環境,我就給你裝上什麽環境,對於系統管理員來講,不必再去每一臺機器上根據開發給的需求名單一個一個安裝,不僅效率低、勞動成本高、而且容易出錯,造成環境的不一致。而Ansible具有冪等性的特點,無論執行多少次,只要你的操作系統是同一個版本,那麽安裝出來的環境絕對是一樣的,這樣也就保證了應用所處的底層環境的一致性,而不會造成同一個版本的應用在不同的機器上運行出現不同的效果的問題。

環境需求表

Hosts

所需環境

服務名稱

A

JDK1.7

Nginx

LVS

B

JDK1.7

Nginx

C

JDK1.7

Tomcat

WEB-1

D

JDK1.8

Tomcat

WEB-2

E

JDK1.8

MySQL

MySQL

F

JDK1.8

MySQL

對於以上案例的playbook執行入口應該如下表所示:

技術分享圖片

其次來講,網上也有人非要用Ansible做持續部署,如下圖代碼截圖。這個並沒有不可以,但是在啟停服務的時候往往使用的是CentOS 6service httpd start/stop這種方式,因為Ansible內置了服務管理模塊service,用法為service name=httpd status=stopped/started。但對於使用二進制或者源碼安裝的服務則無能為力,依舊需要使用shell /PATH/resin.sh start方式啟動,而這樣也就起不到冪等性的效果,對於已經開啟的服務再次執行啟動同樣會報錯。其中可以明顯看出,roles字段就像搭積木,你需要什麽就網上加一個什麽。而對於這個角色的執行腳本都是寫好的,在入口引用就好了。

技術分享圖片

所以綜上所述,我認為Ansible更適合基礎設施運維/機房運維,而Jenkins更適合應用運維。

最後再來補充一句題外話,下圖是我在DevOps學院上摘抄的圖片(鳴謝趙班長及其主辦的運維社區:www.unixhot.com),這個體系是目前來講比較實用的架構,首先使用cobbler對裸機進行操作系統的自動化安裝,然後就會使用剛才說到的Ansible或者saltstack進行基礎軟件的安裝以及配置,然後就要對服務進行監控,做完這一切之後就是日常的部署上線工作了,在整個服務的生命周期中還會不斷的產生日誌,需要ELK日誌平臺進行收集和分析加工。而對於底層的硬件無論是物理機、還是虛擬機都無需關心,只需要做好CMDB的資源登記管理工作即可。這就是互聯網行業的一個基本的思路。

技術分享圖片



Ansible的應用場景分析