Playbook 由多個 task 任務組合起來的一本 yaml 格式文件,告訴 Ansible 依據裡面內容一一執行的方式,也是 Ansible 三大要素的核心之一。
1. 編寫第一個 Playbook
Playbook 為 yaml 格式,容易閱讀及撰寫,可以定義多的任務讓 Ansible 執行。
1.1 Playbook Example
我們以前一章 Ad-Hoc 學習來的內容來進行 playbook 的轉換,並使用 user 模組來練習
user 模組的使用範例
1
2
3
4
5
|
- name: Add the user 'johnd' with a specific uid and a primary group of 'admin'
user:
name: johnd
comment: John Doe
uid: 1040
|
Ad-Hoc 執行方式,指定執行在 servera 機器,並創建一個 test001 帳號及賦予 uid -> 1234
1
|
ansible servera.lab.example.com -m user -a "name=test001 uid=1234"
|
轉換成 playbook.yaml 檔案
1
2
3
4
5
6
7
8
9
|
---
- name: A Simple Playbook
hosts:
- servera.lab.example.com
tasks:
- name: Create an user
user:
name: test001
uid: 1234
|
IMPORTANT
使用 vi 編輯器的小技巧,Yaml 格式非常要求縮排對齊,一旦 playbook 過常就不容易靠肉眼對齊,且縮排通常都以兩個空格為主,將下列設定檔添加至 ~/.vimrc
內可以方便以 tab 取代縮排及增加對齊線。
1
|
autocmd FileType yaml setlocal ts=2 sw=2 ai et cursorcolumn
|
1.2 Playbook 欄位說明
上述 Playbook 範例,有三個主要的欄位 ( key ),name、 hosts、 tasks,這三個主要 Key。
- name : 表示這一個 Playbook 的專案名稱
- hosts : 表示要執行在哪一個機器上,如果是多個機器以 list 添加 ( 機器必須在 inventory 有定義才能執行 )
- tasks : 要執行的任務,可以有一個或是多個小任務組成。
2. 實際執行一個啟動 httpd 的 playbook
此環境使用的是 Rocky_Linux 8.5 ,並配置好 ansible.cfg 及 inventory ,如需要已經配置好的 Lab 練習環境可以至最上面連結查看練習環境啟用方式。
2.1 定義要執行的步驟:
- 檢查 yum 的倉庫清單,如果沒有則添加
- 安裝 httpd 服務
- 輸出 “Hello Ansible” 至 httpd 服務
- 啟動 httpd 服務
- 開放 tcp/80 防火牆規則
2.2 使用到的模組:
- yum_repository
- yum
- copy
- service
- firewalld
Note
上述不熟悉不要緊,先跟著執行,多查看 ansible-doc 各模組的使用範例, ansible 就跟積木一樣,把所需要的積木組合起來就是一個項目。
2.3 撰寫 Playbook:
輸出一個檔案名為 playbook.yml 檔案並添加下方內容
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
|
---
- name: play to set up web server
hosts: servera.lab.example.com
tasks:
- name: add BaseOS repo
yum_repository:
name: BaseOS
description: BaseOS
baseurl: http://mirror01.idc.hinet.net/rockylinux/8.5/BaseOS/x86_64/os/
- name: add AppStream repo
yum_repository:
name: AppStream
description: AppStream
baseurl: http://mirror01.idc.hinet.net/rockylinux/8.5/AppStream/x86_64/os/
- name: httpd installed
yum:
name: httpd
state: present
- name: create a content
copy:
content: 'Hello Ansible'
dest: /var/www/html/index.html
- name: service
service:
name: httpd
state: started
enabled: yes
- name:
firewalld:
port: 80/tcp
permanent: yes
state: enabled
immediate: yes
|
2.4 驗證編寫的 Playbook 語法是否正確:
使用 –syntax-check 查驗語法,只會驗證 yaml 格式是否正確,並不會檢查模組使用有沒有問題。
1
|
ansible-playbook --syntax-check <playbook file>
|
1
2
3
|
[student@workstation example]$ ansible-playbook --syntax-check playbook.yml
playbook: playbook.yml
|
2.5 Play Dry Run:
測試模組使用沒有沒問題,可以用 Dry Run,模擬執行 playbook ,並不會真正的發生變化
1
|
ansible-playbook <playbook file> -C
|
1
2
3
4
5
6
7
8
9
10
11
|
[student@workstation example]$ ansible-playbook playbook.yml -C
PLAY [play to set up web server] ********************************************************************************************************************************************************************************
TASK [Gathering Facts] *******************************************************************************************************************************************************************************************
ok: [servera.lab.example.com]
TASK [add BaseOS repo] *******************************************************************************************************************************************************************************************
changed: [servera.lab.example.com]
...
|
2.6 執行 playbook:
執行 playbook ,並驗證 servera web server 結果是否正常啟用。
1
|
ansible-playbook <playbook file>
|
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
|
[student@workstation example]$ ansible-playbook playbook.yml
PLAY [play to set up web server] ********************************************************************************************************************************************************************************
TASK [Gathering Facts] *******************************************************************************************************************************************************************************************
ok: [servera.lab.example.com]
TASK [add BaseOS repo] *******************************************************************************************************************************************************************************************
changed: [servera.lab.example.com]
TASK [add AppStream repo] ****************************************************************************************************************************************************************************************
changed: [servera.lab.example.com]
TASK [httpd installed] *******************************************************************************************************************************************************************************************
ok: [servera.lab.example.com]
TASK [create a content] ******************************************************************************************************************************************************************************************
changed: [servera.lab.example.com]
TASK [service] ***************************************************************************************************************************************************************************************************
changed: [servera.lab.example.com]
TASK [firewalld] *************************************************************************************************************************************************************************************************
changed: [servera.lab.example.com]
PLAY RECAP *******************************************************************************************************************************************************************************************************
servera.lab.example.com : ok=7 changed=5 unreachable=0 failed=0 skipped=0 rescued=0 ignored=0
[student@workstation example]$ curl servera.lab.example.com
Hello Ansible
|
Note
執行playbook 如果發現有錯誤,可以加上 -v 參數可以查看詳細內容。
總共有 -v, -vv, -vvv, -vvvv ,越多 v 訊息越詳細。
3. LAB 練習
如果使用 HowHow 的 Lab 環境在 server[a-c] 設計上均移除預設倉庫來源,如果機器重置了,可以透過 ad-hoc.sh 加上,也可以透過 wget 下載該腳本並存放於 /home/student/example 目錄下執行,下載連結請點我。
3.1 LAB
- 下載 Lab 檔案,如果已經下載可以忽略此步驟。
1
|
git clone https://github.com/JeffWen0105/ansible-lab.git
|
- 使用 playbook-basic 專案,並在 servera 及 serverb 安裝 httpd 及 php 套件及創建一個 user 為 lab01 (已經配置好 ansible.cfg 及 inventory)。
Quote
如果使用 HowHow 的 Lab 環境,可以再練習前或是練習後,於 bastion 機器上輸入 rht-vmctl reset <server name>
重置機器,恢復原始環境。
3.2 LAB 解答
參考解答在 playbook-basic/solution 資料夾內。
Playbook :
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
|
---
- name: play to set up web server
hosts:
- servera.lab.example.com
- serverb.lab.example.com
tasks:
- name: httpd & php installed
yum:
name:
- httpd
- php
state: present
- name: create an user
user:
name: lab01
|
4. 小結
撰寫 PlayBook 並不難,要如何正確的使用 Module 才是重要的課題, 時常查閱 ansible-doc 及多撰寫測試的 playbook 來練習才是增加熟悉度的不二法門。