Contents

Ansible - 翻轉你的 Playbook

Playbook 由多個 task 任務組合起來的一本 yaml 格式文件,告訴 Ansible 依據裡面內容一一執行的方式,也是 Ansible 三大要素的核心之一。

練習環境
可以使用 HowHow 的創建 Lab 練習環境,來操作多台機器練習 Ansible,使用方式請參閱 HowHow 網站

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 定義要執行的步驟:

  1. 檢查 yum 的倉庫清單,如果沒有則添加
  2. 安裝 httpd 服務
  3. 輸出 “Hello Ansible” 至 httpd 服務
  4. 啟動 httpd 服務
  5. 開放 tcp/80 防火牆規則

2.2 使用到的模組:

  1. yum_repository
  2. yum
  3. copy
  4. service
  5. 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

  1. 下載 Lab 檔案,如果已經下載可以忽略此步驟。
1
git clone https://github.com/JeffWen0105/ansible-lab.git
  1. 使用 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 來練習才是增加熟悉度的不二法門。



如果你還沒有註冊 Like Coin,你可以在文章最下方看到 Like 的按鈕,點下去後即可申請帳號,透過申請帳號後可以幫我的文章按下 Like,而 Like 最多可以點五次,而你不用付出任何一塊錢,就能給我寫這篇文章的最大的回饋!