ansible作為今年來越來越火的一款開源運維自動化工具,通過ansible可以實作運維自動化,提高運維工程師的工作效率,減少人為失誤。ansible通過本身內建的非常豐富的子產品可以實作各種管理任務,其自帶子產品超過上千個。更為重要的是,它操作簡單,但提供的功能又非常豐富,在運維領域,幾乎可以做任何事。
.
ansible自2012年釋出以來,很快在全球流行,其特點如下:
1、ansible基于python開發,運維工程師對其二次開發相對比較容易 2、ansible豐富的内置子產品,幾乎可以滿足一切要求 3、管理模式非常簡單,一條指令可以影響上千台主機 4、無用戶端模式,底層通過ssh通信
我們可以通過四種方式和ansible互動,我這裡隻研究了其中兩種方式,應付日常工作足夠了。分别如下:
1、ad-hoc指令集:user直接通過ad-hoc指令集調用ansible工具集來完成任務。 2、playbooks:user預先編寫好ansible playbooks,通過執行playbooks中預先編排好的任務集,按序執行任務。
1、ansible工作集:
ansible工作集包含inventory、modules、plugins和api,其中,inventory(清單)用來管理裝置清單,可以通過分組實作,對組的調用直接影響組内的所有主機;modules是各種執行子產品,幾乎所有的管理任務都是通過子產品執行的;plugins提供了各種附加功能;api為程式設計人員提供一個接口,可以基于此做ansible的二次開發。
ansible可以通過單條指令或者配置檔案來對多台主機進行控制及更改,下面将從安裝及配置依次寫出來。
2、playbook配置檔案
playbook配置檔案使用yaml文法,具有簡潔明了、結構清晰等特點。playbook配置檔案類似于shell腳本,是一個yaml格式的檔案,用于儲存針對特定需求的任務清單。上面介紹的ansible指令雖然可以完成各種任務,但是當配置一些複雜任務時,逐條輸入就顯得效率非常低下了。更有效的方案是在playbook配置檔案中放置所有的任務代碼,利用ansible-playbook指令執行該檔案,可以實作自動化運維。yaml檔案的擴充名通常為.yaml或.yml。
ansible的安裝及配置
環境如下:
一、準備工作:
1、本地yum倉庫:https://pan.baidu.com/s/1-ercvm6qaua4xqd_x5kwow 提取碼: exnp 版本為:ansible 2.3.1.0
2、若本機聯網,可指向網際網路yum倉庫
3、預設采用tcp 22進行與客戶機進行通信,若有更改,需自行設定防火牆放行
二、安裝ansible:
我這裡采用了網際網路yum倉庫進行安裝,即ansible 2.4.2.0。
安裝已經完成,但是若要正常的使用ansible,還需要解決一個問題,就是在控制多台主機時,若要每執行一次指令或腳本都要輸入一次對端密碼的話,顯得就很雞肋,是以還需要建立ssh免互動登入,如下:
以下操作都在ansible伺服器進行:
三、ansible配置:
inventory是ansible管理主機資訊的配置檔案,相當于系統的hosts檔案功能,預設存放在/etc/ansible/hosts,在hosts檔案中,通過分組來組織裝置,ansible通過inventory來定義主機和分組,若不使用預設的/etc/ansible/hosts,可以通過<code>ansible -i 新的inventory路徑</code> 來指定inventory,我這裡直接采用預設的路徑。
1、以分組的方式添加需要管理的主機:
正是管理之前,首先要編寫hosts檔案,因為ansible通過将裝置清單以分組的方式添加hosts檔案來實作對裝置的管理。hosts檔案中,[ ]包含的是組名,裝置清單支援域名及ip位址,預設情況下,通過通路22端口(ssh)來管理裝置,若目标主機使用了非預設的ssh端口,還可以在主機名稱之後使用冒号加端口号标明,以行為分隔機關,也支援通配符。
配置完成後,可以針對hosts定義的組進行遠端操作,也可以針對組中所指定的某一個或者多個主機操作,如下:
四、ansible指令:
指令1、ansible:
ansible是生産環境中使用非常頻繁的指令之一,主要應用在以下場景:
臨時性的維護,沒有規律,臨時需要做的任務,也稱為非固化需求。
臨時一次性操作。
二次開發接口調用。
ansible可用的選項如下: -v:輸出詳細的執行過程資訊,可以得到執行過程所有的資訊。 -i path:指定inventory資訊,預設為/etc/ansible/hosts。 -f:并發線程數,預設為5個線程。 --private-key=private_key_file:指定密鑰檔案。 -m:指定執行使用的子產品。 -m:指定子產品的存放路徑,預設為/usr/share/ansible,也可以通過ansible_library來設定預設路徑。 -a:指定子產品參數。 -u:指定遠端主機以哪個使用者運作指令。 -l:限制運作主機,等同于“--limit”。 --list-hosts:列出符合條件的主機清單,不執行任何指令。
用法示例1(需要提前在/etc/ansible/hosts檔案中定義web組):
用法示例2:
用法示例3:
ansible的傳回結果非常友好,一般會用三種顔色來表示執行結果:紅色、綠色和橘yellow(那個顔色被和諧了)。其中紅色代表執行過程中有異常;橘yellow表示指令執行後目标有狀态變化;綠色表示執行成功且沒有對目标主機做修改。
指令2、ansible-doc:
ansible-doc用來查詢ansible子產品文檔的說明,類似于man指令,針對每個子產品都有詳細的用法說明及應用案例介紹。
指令3、ansible-playbook:
ansible-playbook是日常應用中使用率最高的指令,類似于linux中的sh或source指令,用來執行系列任務。其工作機制是:通過讀取預先編寫好的playbook檔案實作集中處理任務。ansible-playbook指令後跟yml格式的playbook檔案,playbook檔案存放了要執行的任務代碼,指令使用方式如下(playbook.yml檔案需要提前編寫好,最好指定playbook.yml的絕對路徑):
指令4、ansible-console:
ansible-console是ansible為我們提供的一款互動式工具,類似于windows中的cmd及linux中的shell。可以在ansible-console虛拟出來的終端上像shell一樣使用ansible内置的各種指令,這為習慣于shell互動方式的使用者提供了良好的使用體驗,所有的操作與shell類似,而且支援tab鍵補全。具體操作如下:
五、ansible中自帶的子產品介紹:
1、command子產品:
command子產品在遠端主機執行指令,不支援管道,重定向等shell特性,其餘和shell類似,常用參數如下: chdir:在遠端主機上運作指令前需要提前進入的目錄。 creates:在指令運作時建立一個檔案,如果檔案已經存在,則不會執行建立任務。 removes:在指令運作時移除一個檔案,如果檔案不存在,則不會執行移除任務。 executeble:指明運作指令的shell程式。
2、shell子產品(相當于萬能子產品,可以執行大多數指令):
shell子產品在遠端主機執行指令,相當于調用遠端主機的shell程序,然後在shell下打開一個子shell運作指令。和command子產品的差別是它支援shell特性,如管道符、重定向等。
3、copy子產品:
copy子產品用于複制指定主機檔案到遠端主機的位置,常見參數如下: src:指出源檔案路徑,可以使用相對路徑和絕對路徑。支援直接指定目錄,如果源是目錄,則目标也要是目錄。 dest:指出複制檔案的目标目錄位置,使用絕對路徑,支援直接指定目錄。如果源是目錄,則目标也要是目錄,如果目标已經存在,則會覆寫原有内容。 mode:指出複制時,目标檔案的權限,可選。 owner:指出複制時,目标檔案的屬主,可選。 group:指出複制時,目标檔案的屬組,可選。 content:指出複制到目标主機上的内容,不能與src一起使用,相當于複制content指明的資料到目标檔案中。
4、hostname子產品:
hostname子產品用于管理主機名,常用參數如下: name:指明主機名。
5、yum子產品:
yum子產品基于yum機制,對遠端主機管理程式包,常用參數如下: name:程式包的名稱,可以帶上版本号。若不指明版本,則預設安裝最新版本。 state=present | latest | absent:指明對程式包執行的操作,present表示安裝程式包,latest表示安裝最新版本的程式包,absent表示解除安裝程式包。 disablerepo:在用yum安裝時,臨時禁用某個倉庫的id。 enablerepo:在用yum安裝時,臨時啟用某個倉庫的id。 conf_file:yum運作時的配置檔案,而不是使用預設的配置檔案。 diable_gpg_check=yes | no:是否啟用完整性校驗功能。
6、service子產品:
service子產品用來管理遠端主機上的服務的子產品,常見參數如下: name:被管理的服務名稱。 state=started | stopped | restarted | reloaded:動作包含啟動、關閉、重新開機及重新加載配置檔案。 enabled=yes | no:表示是否設定該服務開機自啟動。 runlevel:如果設定了enabled開機自啟動,則要定義在那些運作目标下自動啟動,如2/3/4/5。
7、user子產品:
user子產品用于管理遠端主機上的使用者賬号,常見參數如下: name:必須參數,賬号名稱。 state=present | absent:建立或删除賬号,present表示建立,absent表示删除。 system=yes | no:是否為系統賬戶。 uid:使用者uid。 group:使用者的基本組。 groups:使用者的附加組。 shell:預設使用的shell。 home:使用者的家目錄。 move_home=yes | no:如果設定的家目錄已經存在,是否将已存在的家目錄進行移動。 password:使用者的密碼。 comment:使用者的注釋資訊。 remove=yes | no:當state=absent時,是否要删除使用者的家目錄。
8、group子產品:
group子產品用于管理組,用于建立或删除組,常用參數如下: gid:指定組的gid name:指定組的name state=present | absent:建立或删除 system=yes | no:是否為系統組
9、mount子產品:
mount子產品用于挂載檔案系統,常用參數如下: src:要挂載的裝置或檔案系統 name:指定挂載點 fstype:指定檔案系統類型 ots=w | r | o :設定檔案讀寫類型,可組合使用。 state=present | absent | mounted | unmounted:present表示隻修改fstab檔案中的配置,不自動建立挂載點,而且不挂載;absent表示删除挂載點,修改fstab檔案;mounted:自動建立挂載點并挂載,添加自動挂載(fstab);unmounted:隻解除安裝,不删除挂載點,不修改fstab檔案。
10、cron子產品:
cron子產品用來管理計劃任務,常用參數如下: name:指定計劃任務描述,必填 job:要執行的任務 user:運作計劃任務的使用者 執行時間: minute:0-59,預設為 * hour:0-23,預設為 * day:1-31,預設為 * month:1-12,預設為 * weekday:1-7,預設為 * state=present | absent:present表示添加計劃任務;absent表示删除計劃任務。
11、 script子產品:
功能:在遠端主機上執行主要端的腳本,相當于scp+shell組合。
用法如下:
關于playbook配置檔案的使用請參考:https://blog.51cto.com/14227204/2442514