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的協助文件。