上次給你們介紹了ansible的基礎命令,一些基本的經常使用模塊,今天就給你們帶來ansible的進階版本,playbook,以及roles的使用。
首先咱們要知道咱們的ansible的playbook是什麼?playbook就是劇本的意思,用於配置,部署,和管理被控節點,劇本怎麼寫,操做怎麼執行,很容易理解。
經過playbook的詳細描述,執行其中的一系列tasks,可讓遠端主機達到預期的狀態。playbook就像Ansible控制器給被控節點列出的的一系列to-do-list,而被控節點
必需要完成。
首先咱們先介紹一下ansible playbook的格式。
1 YMAL格式是相似於JSON的文件格式,
2 文件的第一行應該以 "---" (三個連字符)開始代表YMAL文件的開始;
3 在同一行中,#以後的內容表示註釋,相似於shell,python和ruby;
4 YMAL中的列表元素以」-」開頭而後緊跟着一個空格,後面爲元素內容;
5 同一個列表中的元素應該保持相同的縮進。不然會被當作錯誤處理。python
既然是YMAL格式的文件,後綴就理所固然的爲yml,因此在yml文件中,主要有三個部分組成:hosts、remote_user、tasks。linux
hosts:使用hosts指示使用哪一個主機或主機組來運行下面的tasksnginx
remote_user:指定遠端主機中的哪一個用戶來登陸遠端系統web
tasks:指定遠端主機將要執行的一系列動做,tasks的核心爲ansible的模塊,前面已經提到模塊的用法。tasks包含name和要執行的模塊,name是可選的,只是爲了便於用戶閱讀,不過仍是建議加上去,模塊是必須的,同時也要給予模塊相應的參數
除上面一些主要以外,還有tags和notify、handlers,tags是打標籤,然後可在ansible-playbook命令上使用-t指定進行調用,tags在哪,劇本從哪裏開始;某任務的狀態在運行後爲changed時,可經過「notify」通知給相應的handlers。shell
這樣以介紹是否是感受對playbook的格式有了大體的瞭解了呢?vim
下面咱們來介紹一下,關於playbook執行後獲得的輸出信息,能夠用來幫咱們判斷成功與否。ruby
通常而言
l 綠色表明執行成功,系統保持原樣
l ×××表明系統表明系統狀態發生改變
l 紅色表明執行失敗,顯示錯誤輸出。
執行有三個步驟:一、收集facts 二、執行tasks 三、報告結果
以後是關於變量的一些定義和使用,和shell同樣,有系統變量和自定義變量,但當咱們使用變量是可使用{{ VAR }},記得要在兩邊有空格,定義的方式有4中。服務器
(1) facts:可直接調用;注意:可以使用setup模塊直接獲取目標主機的facters;
(2) 用戶自定義變量:
(a) ansible-playbook命令的命令行中的
-e VARS, --extra-vars=VARS
(b) 在playbook中定義變量的方法:
vars:
- var1: value1
(3) 經過roles傳遞變量;
(4) Host Inventory
(i) 向不一樣的主機傳遞不一樣的變量;
IP/HOSTNAME varaiable=value var2=value2
(ii) 向組中的主機傳遞相同的變量;
[groupname:vars]
variable=value
運行playbook的方式:
(1) 測試
ansible-playbook --check 只檢測可能會發生的改變,但不真正執行操做;
ansible-playbook --list-hosts 列出運行任務的主機;
(2) 直接運行運維
下面咱們作一下playbook的小實驗,給兩臺下屬主機,安裝nginx,而且,當檢測到nginx配置文件更改後,重啓服務,此實驗共三臺主機,只須要一臺安裝ansible便可。
首先要定義兩個主機爲一個web組內,vim /etc/ansible/hostside
[web]
172.17.254.112
172.17.254.113
其次,生成密鑰,發送給其餘兩個主機,實現無密登陸(具體操做能夠瞅瞅個人ansible的基本知識詳解。
而後咱們就要作一個yml的劇本了,內容以下:
新版博客的縮進不是很方便,我就直接放了一張圖,這是從安裝,到啓動,到拷貝本機的修改文件到其餘機器,而後根據notify觸發handlers,重啓nginx服務。
而後聽過ansible-playbook test.yml執行,結果應該以下:
至此咱們的playbook的編輯到結束已經完成,只要咱們制定好hosts,而後定義一下,方便咱們之後看的name,再以後就是咱們的動做,利用各個模塊,來作好一件大任務!
playbook雖然看起來挺方便的,可是有個弊端就是沒法實現複用假設在同時
部署Web、db、ha 時或不一樣服務器組合不一樣的應用就須要寫多個yml文件。很難實現靈活的調用。
roles應運而生,roles 用於層次性、結構化地組織playbook。roles 可以根據層次型結構自動裝載變量文件、tasks以及handlers等。
與其說playbook把全部的模塊功能,集合一塊兒作事情,對於相同的事件,或者不復雜任務,能夠勝任,roles就是把模塊又拆了出來,哪一塊均可以隨時替換,應對各類複雜狀況。
文件目錄結構:
roles/nginx/
├── default
├── files
├── handlers
│ └── main.yml
├── meta
├── tasks
│ └── main.yml
├── templates
└── vars
└── main.yml
這是我把剛纔那個實驗用roles來作的目錄結構圖,vars明顯是變量,咱們定義了一個變量,tasks是任務,handlers,是當notify觸發時的一些任務,固然咱們還要有yml劇本,這個劇本里能夠寫入咱們的角色。
nginx.yml
roles/nginx/handlers/main.yml
roles/nginx/tasks/main.yml
roles/nginx/vars/main.yml
上面就是咱們的定義的文件,當咱們使用nginx.yml啓動時,發現和剛纔同樣的效果,不過當咱們的變量須要改變,或者tasks改變時,咱們就直接找到對應的文件,直接修改,而不是一行行的去找整個劇本,還要通讀一遍。