Playbook應用案例
1.1 問題
沿用練習二漓库,編寫Ansible Playbook劇本恃慧,使用Playbook完成自動化操作,具體要求如下:
- 熟悉Playbook語法格式
- 編寫Playbook管理系統(tǒng)賬戶
- 編寫Playbook管理邏輯卷
- 編寫Playbook管理軟件包
1.2 方案
Ansible ad-hoc可以通過命令行形式遠程管理其他主機渺蒿,適合執(zhí)行一些臨時性簡單任務(wù)痢士。另外還有一種遠程管理的方式叫Playbook,Ansible Playbook中文名稱叫劇本,它將經(jīng)常需要執(zhí)行的任務(wù)寫入一個文件茂装,這個文件就叫劇本怠蹂。
- 劇本中可以包含多個任務(wù)
- 劇本寫后,我們隨時根據(jù)劇本少态,執(zhí)行相關(guān)的任務(wù)命令
- Playbook劇本要求按照YAML格式編寫
- 適合執(zhí)行周期性經(jīng)常執(zhí)行的復雜任務(wù)
YAML是什么城侧?
- YAML是一個可讀性高、用來表達數(shù)據(jù)序列的格式語言
- YAML:YAML Ain't a Markup Language
- YAML以數(shù)據(jù)為中心彼妻,重點描述數(shù)據(jù)的關(guān)系和結(jié)構(gòu)
YAML的格式要求如下:
- "#"代表注釋嫌佑,一般第一行為三個橫杠(---)
- 鍵值(key/value)對使用":"表示,數(shù)組使用"-"表示侨歉,"-"后面有空格
- key和value之間使用":"分隔屋摇,":"后面必須有空格
- 一般縮進由兩個或以上空格組成
- 相同層級的縮進必須對齊,縮進代表層級關(guān)系
- 全文不可以使用tab鍵
- 區(qū)分大小寫
- 擴展名為yml或者yaml
- 跨行數(shù)據(jù)需要使用>或者|幽邓,其中|會保留換行符
YAML示例展示:
1)demo1
---
"詩仙": "李白"
或者
"詩仙":
"李白"
2)demo2
數(shù)組的例子
---
- "李白"
- "杜甫"
- "白居易"
- "唐僧"
3)demo3
使用一行表示數(shù)組的例子
---
"詩人": ["李白","杜甫","白居易"]
4)demo4
鍵值對和數(shù)組符合例子:
---
"詩人":
- "李白"
- "杜甫"
- "白居易"
5)demo5
#復雜案例
---
- "詩人":
- 唐代:
- "李白"
- "杜甫"
- 宋代:
- "蘇軾"
- "李清照"
6)demo6
喜歡的電影
---
- 芳華
- 戰(zhàn)狼
- 霸王別姬
7)demo7
人物描述
---
- 姓名: 李白
年齡: 61
作品: 蜀道難
好友: 汪倫
8)demo8
#跨行文本(計算機理解為一行)
---
自我介紹: >
字太白,號青蓮居士,
唐代詩人,祖籍隴西郡,
今甘肅省平?jīng)鍪?
9)demo9
跨行文本(計算機理解為多行)
---
自我介紹: |
字太白,號青蓮居士,
唐代詩人,祖籍隴西郡,
今甘肅省平?jīng)鍪?
10)demo10
注意-和:后面必須有空格炮温。
一張發(fā)票
---
發(fā)票編號: 34843
日期: 2028-12-12
商品:
- 商品編號: BL394D
描述: 足球
價格: 100
- 商品編號: BL4438H
描述: 棒球
價格: 200
稅費: 10.00
總價: 310.00
備注: >
本次采購商品均
屬于球類運動商品.
11)demo11
錯誤日志
---
時間: 2028-10-01 15:01:42
用戶: ed
錯誤信息:
- 文件: nginx.conf
行號: 23
錯誤編碼: "0x3D5FF1"
- 文件: test.php
行號: 12
錯誤代碼: "0xA4C51E"
警告信息: |
你有兩個錯誤信息需要查看,
一條是配置文件錯誤,
一條是腳本語法錯誤,
具體內(nèi)容參考錯誤信息.
Playbook語法格式要求如下:
- playbook采用YAML格式編寫
- playbook文件中由一個或多個play組成
- 每個play中可以包含:
- hosts(主機)、tasks(任務(wù))牵舵、vars(變量)等元素組成
- 使用ansible-playbook命令運行playbook劇本
步驟一:測試Playbook語法格式
1)編寫第一個Playbook(劇本)
hosts柒啤、tasks、name是關(guān)鍵詞(不可修改)棋枕,ping是模塊,調(diào)用不同模塊完成不同任務(wù)妒峦。
[root@control ansible]# vim ~/ansible/test.yml
---
- hosts: all #hosts定義要遠程誰重斑?
tasks: #tasks定義遠程后要執(zhí)行的任務(wù)有哪些?
- name: This is my first playbook #name后面的具體內(nèi)容可以任意
ping:
[root@control ansible]# ansible-playbook ~/ansible/test.yml
執(zhí)行效果如圖-1所示肯骇。
圖-1
2)定義多個主機和任務(wù)的劇本
hosts由一個或多個組或主機組成窥浪,逗號分隔祖很,tasks由一個或多個任務(wù)組成,多個任務(wù)按順序執(zhí)行漾脂,執(zhí)行ansible-playbook命令可以使用-f選項自定義并發(fā)量假颇。
[root@control ansible]# vim ~/ansible/test.yml
- hosts: test,webserver
tasks:
- name: This is my first playbook #name后面的內(nèi)容可以任意
ping:
- name: Run a shell command
shell: touch ~/shell.txt
#hosts定義需要遠程哪些被管理主機,hosts是關(guān)鍵詞
#tasks定義需要執(zhí)行哪些任務(wù)骨稿,tasks是關(guān)鍵詞
#第一個任務(wù)調(diào)用ping模塊,該模塊沒有參數(shù)
#第二個任務(wù)調(diào)用shell模塊在被管理主機創(chuàng)建一個空文件~/shell.txt
[root@control ansible]# ansible-playbook ~/ansible/test.yml -f 5
## 驗證:到node1笨鸡、node3、node4主機分別執(zhí)行命令ls /root/shell.txt查看是否有該文件
3)多個play的Playbook文件
[root@control ansible]# vim ~/ansible/test.yml
#第一個play劇目
---
- hosts: test
tasks:
- name: This is first play
ping:
#第二個play劇目
- hosts: webserver
tasks:
- name: This is second play
ping:
步驟二:Playbook應用案例
1)用戶管理坦冠,創(chuàng)建系統(tǒng)賬戶形耗、賬戶屬性、設(shè)置密碼(ansible-doc user)辙浑。
[root@control ansible]# vim ~/ansible/test_john.yml
---
- hosts: webserver
tasks:
- name: Add the user 'johnd'
user:
name: johnd
uid: 1040
group: daemon
password: "{{ '123' | password_hash('sha512') }}"
#hosts定義需要遠程的對象是webserver組激涤,hosts是關(guān)鍵詞
#tasks定義需要執(zhí)行的任務(wù),tasks是關(guān)鍵詞
# name是第一個任務(wù)的描述信息判呕,描述信息可以任意
# user是第一個任務(wù)需要調(diào)用的模塊倦踢,user下面的縮進內(nèi)容是給user模塊的參數(shù)
# name是需要創(chuàng)建的用戶名,uid是用戶ID號
# group是用戶屬于哪個基本組
# password是用戶的密碼侠草,密碼是123辱挥,密碼經(jīng)過sha512算法加密
[root@control ansible]# vim ~/ansible/user_james.yml
---
- hosts: webserver
tasks:
- name: Add 'james' with a bash shell
user:
name: james
shell: /bin/bash
groups: bin,adm
password: "{{ '123' | password_hash('sha512') }}"
#與上一個案例類似,groups指定用戶屬于哪些附加組.
[root@control ansible]# vim ~/ansible/user_johnd.yml
---
- hosts: webserver
tasks:
- name: Remove the user 'johnd'
user:
name: johnd
state: absent
#刪除系統(tǒng)賬戶johnd梦抢,state的值設(shè)置為absent是刪除用戶
2)使用playbook管理邏輯卷
準備工作:給node2主機再添加一塊磁盤(以下實驗磁盤名稱僅為參考般贼,不要照抄)。
注意:請確保node2主機提前安裝了lvm2軟件包奥吩。
(ansible-doc parted哼蛆,ansible-doc lvg,ansible-doc lvol)
[root@control ansible]# vim ~/ansible/lvm.yml
---
- hosts: node2 #遠程node2主機
tasks:
- name: Create a new primary partition with a size of 1GiB #任務(wù)的描述信息
parted: #調(diào)用parted模塊進行分區(qū)
device: /dev/vdb #對/dev/vdb磁盤進行分區(qū)(磁盤名稱不要照抄)
label: gpt #分區(qū)表類型為gpt霞赫,或msdos
number: 1 #分區(qū)編號(創(chuàng)建第幾個分區(qū))
state: present #present是創(chuàng)建分區(qū),absent是刪除分區(qū)
part_start: 1MiB #分區(qū)的開始位置(默認從最開始位置分區(qū))
part_end: 1GiB #分區(qū)的結(jié)束位置(不寫就分到磁盤最后位置)
- name: Create a volume group on top of /dev/vdb1 #第二個任務(wù)的描述信息
lvg: #調(diào)用lvg模塊,創(chuàng)建VG卷組
vg: my_vg #要創(chuàng)建的卷組名稱
pvs: /dev/vdb1 #使用哪個分區(qū)創(chuàng)建PV
- name: Create a logical volume of 512m #第三個任務(wù)的描述信息
lvol: #調(diào)用lvol模塊創(chuàng)建LV
vg: my_vg #使用哪個VG創(chuàng)建LV
lv: my_lv #需要創(chuàng)建的LV名稱
size: 512m #要創(chuàng)建的LV大小,可以不指定單位腮介,默認單位m
3)使用playbook管理軟件(ansible-doc yum)
RHEL或CentOS系統(tǒng)中的軟件有組包的概念,使用yum grouplist或者dnf grouplist可以查看組包的名稱端衰。
[root@control ansible]# vim ~/ansible/package.yml
---
- hosts: webserver #需要遠程的主機是誰
tasks: #定義劇本需要執(zhí)行的任務(wù)
- name: Install a list of packages #第一個任務(wù)的描述信息
yum: #調(diào)用yum模塊安裝軟件
name: #安裝軟件的名字叠洗,它的值有多個,使用數(shù)組-
- httpd #安裝httpd軟件
- mariadb #安裝mariadb軟件
- mariadb-server #安裝mariadb-server
- name: install the 'RPM Development Tools' package group #第二個任務(wù)的描述信息
yum: #調(diào)用yum模塊安裝軟件組包
name: "@RPM Development Tools" #安裝哪個組包旅东,@是關(guān)鍵詞
- name: update software #第三個任務(wù)的描述信息
yum: #調(diào)用yum模塊升級軟件
name: '*' #需要升級哪些軟件
state: latest #latest代表升級軟件
#備注:state的值可以是(present|absent|latest)
#present代表安裝軟件(默認是present)灭抑;absent代表卸載軟件
#latest代表升級軟件
Ansible變量應用案例
2.1 問題
沿用前面課程環(huán)境,繼續(xù)練習Ansible 特殊模塊并掌握自定義變量的方式抵代,具體要求如下:
- 熟悉setup與debug模塊
- 熟悉各種常見的變量定義方式
步驟一:Ansible特殊模塊
1)setup模塊
ansible_facts用于采集被管理設(shè)備的系統(tǒng)信息腾节,所有收集的信息都被保存在變量中,每次執(zhí)行playbook默認第一個任務(wù)就是Gathering Facts,使用setup模塊可以查看收集到的facts信息案腺。
[root@control ansible]# ansible test -m setup
192.168.4.10 | SUCCESS => {
"ansible_facts": {
"ansible_all_ipv4_addresses": [
… 省略部分內(nèi)容…
試試自己找出下列變量:
- ansible_all_ipv4_addresses #IP地址
- ansible_bios_version #主板BIOS版本
- ansible_memtotal_mb #總內(nèi)存
- ansible_hostname #主機名
- ansible_fqdn #主機的域名
- ansible_devices.vda.partitions.vda1.size #某個磁盤分區(qū)的大小
2)debug模塊
debug模塊可以顯示變量的值庆冕,可以輔助排錯,通過msg可以顯示變量的值劈榨,變量需要使用{{}}擴起來访递。
[root@control ansible]# vim ~/ansible/debug.yml
---
- hosts: test
tasks:
- debug:
msg: "主機名是:{{ ansible_hostname }}"
- debug:
msg: "總內(nèi)存大小:{{ ansible_memtotal_mb }}"
#備注調(diào)用debug模塊顯示某些具體的變量值
#debug模塊可以顯示變量的值,可以輔助排錯
步驟二:定義變量的方法
Ansible支持十幾種定義變量的方式同辣,這里我們僅介紹其中一部分變量拷姿。
下面是根據(jù)優(yōu)先級排序的定義方式:
- Inventory變量
- Host Facts變量
- Playbook變量
- 變量文件
1)Inventory變量(在主機清單配置文件中定義變量)。
[root@control ansible]# vim ~/ansible/inventory
[test]
node1 iname="nb"
[proxy]
node2
[webserver]
node[3:4]
[webserver:vars]
iname="dachui"
#備注邑闺,在node1主機后面給該主機添加變量iname,值為nb.
#給webserver組定義變量,vars是關(guān)鍵詞不可以改變,webserver是上面定義的組
#給這個組定義變量iname="dachui"
... ...<部分后面的內(nèi)容省略>... ...
下面編寫劇本調(diào)用剛才的變量:(在劇本中需要調(diào)用變量是要使用{{}})
[root@control ansible]# vim ~/ansible/inventory_var.yml
---
- hosts: node1,webserver #定義需要遠程管理的主機是誰
tasks: #劇目要完成哪些任務(wù)
- name: create a user with var. #劇目中的第一個任務(wù)描述信息
user: #調(diào)用user模塊創(chuàng)建用戶
name: "{{ iname }}" #需要創(chuàng)建的用戶名是iname這個變量
#注意事項:
#在ansible劇本中當調(diào)用變量時跌前,開始位置就調(diào)用變量,就需要在{{}}外面加雙引號
#如果是在后面或者中間位置調(diào)用變量{{}}外面可以不加雙引號,也可以加雙引號
#如:
# "{{ iname }}"
# nihao {{ iname }}
2)Host Facts變量(可以直接調(diào)用ansible收集的系統(tǒng)信息)
[root@control ansible]# vim ~/ansible/facts_var.yml
---
- hosts: test
tasks:
- name: create user.
user:
name: "{{ansible_hostname}}"
#定義劇本,遠程所有被管理主機陡舅,調(diào)用user模塊抵乓,創(chuàng)建用戶
#需要創(chuàng)建的用戶名ansible_hostname是一個ansible_facts變量
#驗證: 到node1主機查看是否有一個與主機名同名的用戶
3)Playbook變量(使用vars關(guān)鍵詞可以在playbook內(nèi)定義變量)。
[root@control ansible]# vim ~/ansible/playbook_var.yml
---
- hosts: test
vars: #vars是關(guān)鍵詞靶衍,用來定義變量用的
iname: heal #具體變量名是iname灾炭,值是heal
ipass: '123456' #再定義一個變量名是ipass,值是123456
#注意密碼必須是字符串颅眶,需要引號
tasks: #tasks定義需要執(zhí)行的任務(wù)
- name: Use variables create user. #給任務(wù)寫個描述信息
user: #調(diào)用user模塊創(chuàng)建用戶
name: "{{ iname }}" #用戶名的是前面定義的變量
password: "{{ ipass | password_hash('sha512') }}"
#密碼是前面定義好的ipass,管道給password_hash把密碼加密.
4)單獨定義個變量文件蜈出,在playbook中用vars_files調(diào)用該文件。
[root@control ansible]# vim ~/ansible/file_var.yml
---
- hosts: test
vars_files: variables.yml #當變量比較多時涛酗,專門定義一個文件用來存變量
tasks:
- name: create user.
user:
name: "{{ iname }}"
password: "{{ ipass | password_hash('sha512') }}"
#調(diào)用user模塊創(chuàng)建用戶
#用戶名是變量文件variables.yml中定義的變量iname铡原,密碼也是變量文件中定義的變量
[root@control ansible]# vim ~/ansible/variables.yml
---
iname: cloud
ipass: '123456'
附加思維導圖,如圖-2所示:
圖-2