Otomatisasi Reset Lab Proxmox VE Menggunakan Ansible

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 hosts sebagai target server-nya.
  • Matikan VM/CT. Menggunakan perintah qm & pct stop untuk mematikan VM/CT yang masih menyala pada server.
  • Hapus disk & matikan layanan. Skrip mematikan layanan pemantau pvestatd, lalu menggunakan perintah fuser -k -9 untuk 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 update dan apt dist-upgrade untuk 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.
image host

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.

By Zaidan

Leave a Reply

Your email address will not be published. Required fields are marked *