Hai semuanya, apa kabar? Kita akan coba implementasikan Ansible untuk urusan per-server-an. Kondisinya adalah di kantor ada beberapa server PVE yang digunakan untuk fasilitas training Proxmox VE. Sebenarnya sudah dibuat snapshot, jadi kalau ingin siapkan buat sesi training selanjutya bisa tinggal rollback ke checkpoint tersebut. Tapi karena server-nya ada enam buah, lebih gampang kalau kita pakai Ansible untuk proses rollback-nya.
Saya gak langsung pakai Ansible untuk reset semuanya. Saya coba rollback manual terlebih dahulu. Kita sebut pve1 adalah server percobaan rollback pertamanya. Ada beberapa kendala yang dihadapi:
- Dataset busy. Hal ini bisa terjadi karena konfigurasi VM dan ZFS kadang locked by system atau oleh service
pvestatd. Sehingga terkadang ada pesan error seperti “dataset is busy” saat kita coba rollback. - Kondisi server berbeda. Misalnya keenam server tersebut nama snapshot atau ada konfigurasi yang tidak sama.
Solusi: Ansible Playbook
Skrip Ansible yang akan digunakan perlu mengatasi poin-poin yang jadi masalah yang bisa saja muncul saat proses rollback. Misalnya mematikan proses yang mengunci storage, menghapus file sampah/unused files, melakukan rollback dari snapshot yang ada, melakukan update pada server, dan membuat snapshot baru yang ter-update. di seluruh server tujuan. Pastikan Ansible sudah diinstal di komputer lokal (skrip Ansible-nya akan dijalankan di lokal).
Konfigurasi SSH Key
Sebelum kita utak-atik Ansible-nya, kita perlu lakukan konfigurasi agar komputer lokal/Ansible kita tidak perlu memasukkan password untuk akses ke PVE. Berikut ini adalah contoh perintah yang digunakan (case 6 buah server, IP berurutan):
for i in {01..06}; do ssh-copy-id root@<IP_SERVER_$i>; done
File Inventory/Hosts
File ini fungsinya adalah mendeskripsikan server mana saja yang jadi “tujuan” pekerjaan. Nama file yang digunakan misalnya hosts. Berikut ini contoh isi dari filenya:
[lab_servers]
pve-node01 ansible_host=<IP_SERVER_01>
pve-node02 ansible_host=<IP_SERVER_02>
pve-node03 ansible_host=<IP_SERVER_03>
pve-node04 ansible_host=<IP_SERVER_04>
pve-node05 ansible_host=<IP_SERVER_05>
pve-node06 ansible_host=<IP_SERVER_06>
[lab_servers:vars]
ansible_user=root
File Utama (Playbook)
Ini adalah file inti dari proses otomatisasi. Misalnya kita beri nama filenya refresh_lab.yml.
---
- name: Otomatisasi Reset Lab Master Proxmox VE
hosts: lab_servers
gather_facts: no
tasks:
- name: 1. Matikan Semua VM dan Container Aktif Milik Peserta
ansible.builtin.shell: |
for vmid in $(qm list | awk 'NR>1 {print $1}'); do qm stop $vmid --skiplock || true; done
for ctid in $(pct list | awk 'NR>1 {print $1}'); do pct stop $ctid || true; done
- name: 2. Hapus File Konfigurasi VM Sisa Peserta
ansible.builtin.shell: |
rm -f /etc/pve/qemu-server/*.conf
rm -f /etc/pve/lxc/*.conf
- name: 3. Hapus Disk VM Peserta Menggunakan Trik Fuser Paksa
ansible.builtin.shell: |
systemctl stop pvestatd
vgchange -an 2>/dev/null || true
for ds in $(zfs list -H -o name -r <NAMA_POOL_VM> | grep -v -E "<NAMA_POOL_VM>$|<ID_TEMPLATE_MASTER>"); do
fuser -k -9 /dev/zvol/$ds 2>/dev/null || true
zfs destroy -rf $ds
done
systemctl start pvestatd
- name: 4. Rollback Storage Secara Dinamis Sesuai Snapshot yang Ada
ansible.builtin.shell: |
# Dinamis Rollback Dataset Sistem 01
if zfs list -t snapshot <POOL_OS>/data@<SNAPSHOT_LAMA_A> >/dev/null 2>&1; then
zfs rollback -r <POOL_OS>/data@<SNAPSHOT_LAMA_A>
elif zfs list -t snapshot <POOL_OS>/data@<SNAPSHOT_LAMA_B> >/dev/null 2>&1; then
zfs rollback -r <POOL_OS>/data@<SNAPSHOT_LAMA_B>
fi
# Dinamis Rollback Dataset Storage VM
if zfs list -t snapshot <NAMA_POOL_VM>@<SNAPSHOT_LAMA_B> >/dev/null 2>&1; then
zfs rollback -r <NAMA_POOL_VM>@<SNAPSHOT_LAMA_B>
fi
- name: 5. Jalankan Pembaruan Sistem Terbaru (Abaikan Jika Server Offline)
ansible.builtin.apt:
update_cache: yes
upgrade: dist
force_apt_get: yes
ignore_errors: yes
- name: 6. Standardisasi Snapshot Baru di Semua Server Lab
ansible.builtin.shell: |
# Bersihkan sisa snapshot tanggal yang sama jika ada eksekusi ulang
zfs destroy -r <POOL_OS>/data@<SNAPSHOT_BARU> 2>/dev/null || true
zfs destroy -r <NAMA_POOL_VM>@<SNAPSHOT_BARU> 2>/dev/null || true
# Buat snapshot baru yang seragam di seluruh server
zfs snapshot <POOL_OS>/data@<SNAPSHOT_BARU>
zfs snapshot <NAMA_POOL_VM>@<SNAPSHOT_BARU>
Berikut ini penjelasan dari tiap tahapnya:
- Inisialisasi. Skrip akan merujuk ke file
hostssebagai target server-nya. - Matikan VM/CT. Menggunakan perintah
qm&pct stopuntuk mematikan VM/CT yang masih menyala pada server. - Hapus disk & matikan layanan. Skrip mematikan layanan pemantau
pvestatd, lalu menggunakan perintahfuser -k -9untuk membunuh proses liar yang mengunci disk. Setelah kuncian lepas, skrip menghapus seluruh disk VM peserta di dalam storage ZFS, tetapi otomatis mengabaikan template master agar tidak ikut terhapus. - Proses rollback. Menggunakan fungsi logika (
if-else). Sistem akan mengecek ketersediaan snapshot lama. - Update sistem. Menjalankan perintah
apt updatedanapt dist-upgradeuntuk memperbarui sistem operasi host PVE. - Standardisasi Snapshot Baru): Menghapus snapshot lama yang memiliki nama sama (jika ada), lalu membuat snapshot fresh baru yang seragam di seluruh pool penyimpanan server.
Eksekusi Skrip
Apabila skrip sudah siap, jalankan perintah berikut:
ansible-playbook -i hosts refresh_lab.yml
Ansible akan masuk ke setiap server via SSH dan mengeksekusi seluruh instruksi secara paralel. Gambar berikut menampilkan skrip yang berhasil dieksekusi.

Penutup
Penerapan otomatisasi ini tidak hanya meningkatkan efisiensi waktu kerja tim Sysadmin, tetapi juga membantu menjamin kenyamanan para peserta training karena mereka selalu mendapatkan lingkungan praktik yang siap pakai di setiap sesi baru.
Tulisan kali ini sampai di sini dulu ya. Sampai jumpa. Bye.