Ansible自動化部署可搭配使用的Collection

毛石磊 Leslie Mao

  • 精誠資訊/恆逸教育訓練中心-資深講師
  • 技術分類:網路管理與通訊應用

 

 

系統管理人員在Linux系統上進行管理工作或部署相關服務時,若有需要進行大量系統的自動化部署,同時降低錯誤的發生機率,Ansible自動化部署平台就是一個非常好的解決方案:其中一個原因是Ansible開源專案受益於數千名貢獻者的經驗和智慧,製作成Ansible Content Collection,提供給系統管理人員或開發人員免費使用。

其中Red Hat的原廠課程中有介紹到並實作了以下三個Collection的部分內容:ansible.builtin、ansible.posix和redhat.rhel_system_roles。課程中有介紹到community.general這個Collection,而這個Collection中有部分Module在實務工作上的實用性還蠻高的,以下文章內容將實際運用這些Module並展現執行的結果。

執行環境有二台虛擬機,workstation.lab.example.com虛擬機扮演Control node的角色,servera.lab.example.com虛擬機扮演Managed host的角色。


一、community.general.timezone (可進行時區的設定)


playbook的內容:

---
- name: play1
  hosts: servera.lab.example.com
  tasks:
  - name: Set timezone to Asia/Taipei
    community.general.timezone:
      name: Asia/Taipei

執行狀況:

[student@workstation test]$ ansible-playbook p1.yml 
PLAY [play1] *******************************************************

TASK [Gathering Facts] ***********************************************
ok: [servera.lab.example.com]

TASK [Set timezone to Asia/Taipei] *************************************
changed: [servera.lab.example.com]

PLAY RECAP******************************************************
servera.lab.example.com    : ok=2    changed=1

執行結果的檢查:

[student@servera ~]$ timedatectl 
           Local time: Thu 2025-09-18 02:15:20 CST
           Universal time: Wed 2025-09-17 18:15:20 UTC
           RTC time: Wed 2025-09-17 18:15:20
           Time zone: Asia/Taipei (CST, +0800)
           System clock synchronized: yes
           NTP service: active
           RTC in local TZ: no


二、community.general.nmcli (可進行網路組態的設定)


playbook的內容:

---
- name: play1
  hosts: servera.lab.example.com
  tasks:
    - name: Try nmcli add Ethernet conn_name only ip4
     community.general.nmcli:
       type: ethernet
       conn_name: 'Wired connection 1'
       ip4:
         - '172.25.250.10/24'
         - '1.2.3.4/24'
       state: up

執行狀況:

[student@workstation test]$ ansible-playbook p1.yml
PLAY [play1] *******************************************************

TASK [Gathering Facts] ***********************************************
ok:[servera.lab.example.com]

TASK [Try nmcli add Ethernet conn_name only ip4]************************
changed:[servera.lab.example.com]

PLAY RECAP******************************************************
servera.lab.example.com    : ok=2    changed=1

執行結果的檢查:

[student@servera ~]$ ip addr show eth0 
2: eth0:<BROADCAST,MULTICAST,UP,LOWER_UP>mtu 1500 qdisc fq_codel state UP group default qlen 1000
    link/ether 52:54:00:00:fa:0a brd ff:ff:ff:ff:ff:ff
    altname enp1s0
    inet 172.25.250.10/24 brd 172.25.250.255 scope global noprefixroute eth0
       valid_lft forever preferred_lft forever
    inet 1.2.3.4/24 brd 1.2.3.255 scope global noprefixroute eth0
       valid_lft forever preferred_lft forever
    inet6 fe80::a973:f7b3:7b00:e503/64 scope link noprefixroute 
       valid_lft forever preferred_lft forever


三、community.general.parted (可在儲存裝置上進行Partition的管理)


playbook的內容:

---
- name: play1
  hosts: servera.lab.example.com
  tasks:
    - name: Create a new partition 128MiB for swap
     community.general.parted:
       device: /dev/vdb
       number: 1
       fs_type: linux-swap
       state: present
       part_end: 129MiB

    - name: Create a new partition 256MiB for xfs
     community.general.parted:
       device: /dev/vdb
       number: 2
       fs_type: xfs
       state: present
       part_start: 129MiB
       part_end: 385MiB

    - name: Create a new partition 512MiB for lvm
     community.general.parted:
       device: /dev/vdb
       number: 3
       flags: [lvm]
       state: present
       part_start: 385MiB
       part_end: 897MiB

執行狀況:

[student@workstation test]$ ansible-playbook p1.yml 
PLAY [play1] *******************************************************

TASK [Gathering Facts] ***********************************************
ok:[servera.lab.example.com]

TASK [Create a new partition 128MiB for swap]************************
changed:[servera.lab.example.com]

TASK [Create a new partition 256MiB for xfs]************************
changed:[servera.lab.example.com]

TASK [Create a new partition 512MiB for lvm]************************
changed:[servera.lab.example.com]

PLAY RECAP******************************************************
servera.lab.example.com    : ok=4    changed=3

執行結果的檢查:

[root@servera ~]$ parted /dev/vdb unit MiB print 
Model: Virtio Block Device (virtblk)
Disk /dev/vdb: 1024MiB
Sector size (logical/physical): 512B/512B
Partition Table: msdos
Disk Flags: 

Number    Start    End     Size     Type     File   system    Flags
 1       1.00MiB  129MiB  128MiB  primary
 2       129MiB   385MiB  256MiB  primary 
 3       385MiB   897MiB  512MiB  primary                      lvm 


四、community.general.filesystem (可進行file system與swap space的建立)


playbook的內容:

---
- name: play1
  hosts: servera.lab.example.com
  tasks:
    - name: Create swap space
     community.general.filesystem:
       fstype: swap
       dev: /dev/vdb1

    - name: Create xfs filesystem
     community.general.filesystem:
       fstype: xfs
       dev: /dev/vdb2

執行狀況:

[student@workstation test]$ ansible-playbook p1.yml 
PLAY [play1] *******************************************************

TASK [Gathering Facts] ***********************************************
ok:[servera.lab.example.com]

TASK [Create swap space]************************
changed:[servera.lab.example.com]

TASK [Create xfs filesystem]************************
changed:[servera.lab.example.com]

PLAY RECAP******************************************************
servera.lab.example.com    : ok=3    changed=2

執行結果的檢查:

[root@servera ~]$ lsblk -f /dev/vdb 
NAME   FSTYPE FSVER LABEL UUID FSAVAIL FSUSE% MOUNTPOINTS
vdb                                                                           
├─vdb1 swap   1      79366601-b760-4d90-a6da-7f34b6a16a37
├─vdb2 xfs           bdb69e87-4009-44c3-818f-772b104436e6                
└─vdb3


五、community.general.lvg (可進行volume group的管理)


playbook的內容:

---
- name: play1
  hosts: servera.lab.example.com
  tasks:
    - name: Create a volume group on /dev/vdb3
      community.general.lvg:
       vg: vgTest
       pvs: /dev/vdb3

執行狀況:

[student@workstation test]$ ansible-playbook p1.yml 
PLAY [play1] *******************************************************

TASK [Gathering Facts] ***********************************************
ok:[servera.lab.example.com]

TASK [Create a volume group on /dev/vdb3]************************
changed:[servera.lab.example.com]

PLAY RECAP******************************************************
servera.lab.example.com    : ok=2    changed=1

執行結果的檢查:

[root@servera ~]$ vgs 
  VG     #PV #LV #SN Attr   VSize    VFree  
 vgTest   1   0  0 wz--n-  508.00m  508.00m


六、community.general.lvol (可進行logical volume的管理)


playbook的內容:

---
- name: play1
  hosts: servera.lab.example.com
  tasks:
    - name: Create a logical volume on vgTest
     community.general.lvol:
       vg: vgTest
       lv: lvTest
       size: 256

    - name: Create xfs filesystem on lv
     community.general.filesystem:
       fstype: xfs
       dev: /dev/vgTest/lvTest

執行狀況:

[student@workstation test]$ ansible-playbook p1.yml 
PLAY [play1] *******************************************************

TASK [Gathering Facts] ***********************************************
ok:[servera.lab.example.com]

TASK [Create a logical volume on vgTest]************************
changed:[servera.lab.example.com]

TASK [Create xfs filesystem on lv]************************
changed:[servera.lab.example.com]

PLAY RECAP******************************************************
servera.lab.example.com    : ok=3    changed=2

執行結果的檢查:

[root@servera ~]$ vgs 
  VG      #PV #LV #SN Attr   VSize    VFree  
  vgTest   1   1  0 wz--n-  508.00m  252.00m

[root@servera ~]# lvs
  LV       VG       Attr        LSize   Pool Origin Data%  Meta%  Move Log 
  lvTest vgTest   -wi-a-----   256.00m                                                    

[root@servera ~]# lsblk -f /dev/vgTest/lvTest
NAME        FSTYPE FSVER LABEL UUID FSAVAIL FSUSE% MOUNTPOINTS
vgTest-lvTest xfs                8e1425e4-f94c-43d2-b9dc-de1a04bca19d 


以上的使用範例提供大家參考,這些Module的完整使用說明可進一步閱讀Ansible的協助文件。



您可在下列課程中了解更多技巧喔!