自動化運維工具ansible再探
nginx
-------------------------------------------------------------------------------------------------------------------------------------
shell
ansible常見工具vim
(1)ansible-pull:推送命令至遠程,效率無線提高,能夠管理上千臺主機,對運維要求較高,不過目前爲止此命令還未有實施,ansible的管理臺數仍是在三四百臺設備centos
(2)ansible-playbook * .yml:運行劇本併發
(3)ansible-valult:劇本加密解密指令,ansible-vault encrypt chen.yml,加密chen.yml,ansible-vault decrypt chen.yml,解密chen.yml,加密後的劇本沒法用ansible -playbook直接執行,必須先解密,另有指令app
ansible-vault encrypt * .yml 加密運維
decrypt 解密ide
edit 編輯工具
rekey 修改口令測試
create 建立新yml文件
(4)ansible-console:交互式臨時執行命令工具
圖中5臺主機數量,最多5個併發進程
執行用戶@當前操做的主機組 (當前組的主機數量)[f:併發數]$
設置併發數: forks n 例如: forks 10
切換組: cd 主機組 例如: cd centos6,切換到centos6,
列出當前組主機列表: list
列出全部的內置命令: ?或help
playbook
基本說明
(1)playbook是由一個或多個劇本組成的列表
(2)playbook的主要功能在於將hosts清單中的主機分配任務tasks,tasks就是各類ansible模塊的調用,將分配的任務組織在一個playbook中,隨後各任務循序漸進的運行
(3)playbook採用YAML語言編寫
YAML語言
(1)YAML是一個可讀性高的、用來表達資料序列的格式
(2)特性
YAML可讀性好
YAML和腳本語言的交互性好
YAML使用實現語言的數據模型
YAML有一個一致的信息模型
YAML易於實現
YAML能夠基於流來處理
YAML表達能力強,擴展性好
YAML格式
(1)單一檔案中用三個連字號---區分多個檔案,還有選擇性的連續三個點表示檔案結尾
(2)次行開始正常寫playbook的內容,通常建議寫明該playbook的功能
(3)使用#註釋代碼
(4)縮進必須統一,不能空格和tab混用,一樣的縮進表明一樣的級別
(5)文件內容大小寫敏感
(6)key/value的值能夠同行寫也能夠換行寫,同行使用:分隔
(7)k/v的v能夠是個字符串,也能夠是個列表
(8)一個完整的代碼塊功能需最少元素包括name、task
(9)一個name只能包括一個task
(10)YAML文件擴展名一般爲yml或者yaml
List:列表,全部元素-開頭
Dictionary:字典,由多個key與value構成,兩種寫法
playbook核心元素
hosts:執行的遠程主機列表
tasks:任務集
varniables:內置變量或者自定義變量
templates:模板,可替換模板文件中的變量並實現一些簡單邏輯的文件
handlers:和notity結合使用,由特定條件觸發的操做,知足條件執行,不然不執行,在某個task的最後一行添加notity,整個task任務集結束,編寫handler
tags:標籤執行某條任務執行,用於選擇運行playbook中的部分代碼,好比說ansible-playbook -t TAGNAME FILE.yml
hosts:能夠是以下形式
one.example.com
one.example.com:two.example.com
192.168.1.50
192.168.1.*
GROUP1:GROUP2 兩個組的並集
GROUP1:&GROUP2 兩個組的交集
GROUP1:!GROUP2 在GROUP1組,但不在GROUP2組,好比說:
- hosts: GROUP1:GROUP2 -->務必注意空格,行首-與元素有空格,鍵:和值之間有空格
remoute_user:可用於host和task中,也能夠經過指定其經過sudo的方式在遠程主機上執行任務,其可用於play全局或某任務;此外,甚至能夠在sudo時使用sudo_user指定sudo時切換的用戶
handler、notify:條件觸發執行,舉例說明
tags:標籤,舉例說明
變量:
變量名:僅能由字母、數字和下劃線組成,且只能以字母開頭
變量來源
(1)ansible CLASS -m setup,輸入指令後能夠看到不少代碼,現只抓取一小部分作個說明
(2)/etc/ansible/hosts中定義變量
(3)經過命令行指定變量,ansible-playbook -e varname=value
(4)在playbook中定義
(5)在獨立的變量YAML文件中定義
(6)在role中定義,原理和(5)同樣,也是將變量存放在一個文件裏
模板templates
文本文件,嵌套有腳本,只能ansible-playbook用,不能夠ansible直接使用
jinja2語言
字符串:使用單引號或雙引號
數字:整數,浮點數
列表:[item1, item2, ...]
元組:(item1, item2, ...)
字典:{key1:value1, key2:value2, ...}
布爾型:true/false
算術運算:+, -, *, /, //, %, **
比較操做:==, !=, >, >=, <, <=
邏輯運算:and, or, not
流表達式:For If When
功能:根據模塊文件動態生成相應的配置文件,意思就是某個服務配置文件有變更了,能夠放到模板裏,把模板這個文件向目標羣體發送
templates文件必須存放於templates目錄下,且命名爲.j2結尾
yml文件須要和temlpates目錄評級,結構爲
|————temnginx.yml
|————templates
|———nginx.conf.j2
爲說明template做用,附一個小型實驗
(1)控制機和被控制機192.168.239.129都安裝了nginx,根據目錄創建mkdir -pv /app/templatetest/templates
(2)cp /etc/nginx/nginx.conf /app/templatetest/templates/nginx.conf.j2
(3)vim /app/templatetest/temnginx.yml,此時保證了yml文件和templates目錄同級
(4)修改nginx.conf.j2文件,保證和被控制機的配置文件有變化
(5)ansible 192.168.239.129 -C檢查下,沒問題就執行
(6)查看結果
when條件判斷
在task後添加when子句便可使用條件測試;when語句支持Jinja2表達式語法,舉例
迭代:with_items
相似於shell腳本中的for循環
Playbook中template for if
roles:用於層次性、結構化地組織playbook,經過分別將變量、文件、任務、模板及處理器放置於單獨的目錄中,並能夠便捷地include它們的一種機制。
每一個角色,以特定的層級目錄結構進行組織
roles目錄結構:
playbook.yml
roles/
project/
tasks/
files/
vars/
templates/
handlers/
default/ 不經常使用
meta/ 不經常使用
解釋說明
roles/project/ :項目名稱,有如下子目錄
files/ :存放由copy或script模塊等調用的文件
templates/:template模塊查找所須要模板文件的目錄
tasks/:定義task,role的基本元素,至少應該包含一個名爲main.yml的文件;其它的文件須要在此文件中經過include進行包含
handlers/:至少應該包含一個名爲main.yml的文件;其它的文件須要在此文件中經過include進行包含
vars/:定義變量,至少應該包含一個名爲main.yml的文件;其它的文件須要在此文件中經過include進行包含
meta/:定義當前角色的特殊設定及其依賴關係,至少應該包含一個名爲main.yml的文件,其它文件需在此文件中經過include進行包含
default/:設定默認變量時使用此目錄中的main.yml文件
roles具體實現將以一個實驗來進行解釋:點擊此處轉至roles實驗