Kekuatan Bash dan Cloud-Init
Dalam lingkungan hypervisor seperti Proxmox Virtual Environment (VE), kebutuhan untuk dengan cepat menyediakan (provision) dan menghapus lingkungan pengujian (testing environments) atau server produksi sementara sering muncul. Melakukan langkah-langkah ini secara manual melalui antarmuka web (GUI) Proxmox akan memakan waktu dan rentan terhadap kesalahan (human error).
Solusinya adalah mengintegrasikan dua alat kuat:
Bash Scripting: Memberikan logika otomatisasi dan eksekusi berurutan dari perintah command-line Proxmox (
qm).Cloud-Init: Memungkinkan kustomisasi VM pada boot pertama (pengaturan hostname, IP, SSH Key, dll.) tanpa interaksi pengguna.
Script yang akan kita buat ini tidak hanya akan membuat VM, tetapi juga akan memperluas disk secara otomatis, mengatur IP Statis, dan mengimpor SSH Key—semua hanya dengan menjalankan satu baris perintah.
Pilar 1: Prasyarat dan Persiapan Template Cloud-Init
Script ini mengasumsikan Anda telah melakukan langkah-langkah dasar pembuatan template yang dijelaskan dalam panduan sebelumnya.
1.1 Prasyarat Utama
Pastikan hal-hal berikut sudah tersedia di Proxmox VE Anda:
Template VM Cloud-Init (Wajib): Anda harus sudah memiliki Template VM yang sudah dikonversi (misalnya, ID:
9000) dan dibuat dari Ubuntu 24.04 Cloud Image.VM ID yang Tersedia: Rentang ID VM yang akan digunakan (misalnya,
101hingga199).Storage Name: Nama Storage tempat template dan disk baru akan disimpan (misalnya,
local-lvm).
1.2 Struktur Script Utama
Kita akan membuat script yang fleksibel, yang dapat dipanggil dengan argumen (misalnya, create atau delete).
Nama File: vm-manager.sh
#!/bin/bash
# --- VARIBEL GLOBAL ---
TEMPLATE_ID=9000
BASE_IMAGE_STORAGE="local-lvm"
NETWORK_BRIDGE="vmbr0"
BASE_IP="192.168.1.100" # IP awal untuk VM yang akan dibuat
GATEWAY_IP="192.168.1.1" # Gateway jaringan Anda
SSH_KEY_FILE="/root/.ssh/id_rsa.pub" # Pastikan file ini ada
DEFAULT_USER="ubuntu"
# --- Fungsi Bantuan UI/UX ---
log_info() {
echo -e "\n\033[36m[INFO]\033[0m $1"
}
log_success() {
echo -e "\n\033[32m[SUCCESS]\033[0m $1"
}
log_error() {
echo -e "\n\033[31m[ERROR]\033[0m $1"
exit 1
}
log_warning() {
echo -e "\n\033[33m[WARNING]\033[0m $1"
}
Pilar 3: Fungsi CREATE VM (Pembuatan VM Baru)
Fungsi create_vm akan menerima tiga argumen penting: VM ID, Hostname, dan IP Address (di luar Base IP).
3.1 Sintaks Fungsi create_vm
# Sintaks: create_vm <VM_ID> <HOSTNAME> <IP_OCTET_TERAKHIR> <DISK_SIZE_GB>
create_vm() {
local VM_ID=$1
local HOSTNAME=$2
local IP_OCTET=$3
local DISK_SIZE_GB=$4
local IP_ADDRESS="$BASE_IP$IP_OCTET/24"
# --- Validasi Input ---
if [ -z "$VM_ID" ] || [ -z "$HOSTNAME" ] || [ -z "$IP_OCTET" ] || [ -z "$DISK_SIZE_GB" ]; then
log_error "Argumen tidak lengkap. Sintaks: create <ID> <HOSTNAME> <IP_OCTET> <DISK_SIZE_GB>"
fi
if qm status $VM_ID &>/dev/null; then
log_error "VM ID $VM_ID sudah ada atau sedang berjalan. Hapus atau gunakan ID lain."
fi
# --- 1. Cloning Template ---
log_info "Memulai cloning VM ID $VM_ID ($HOSTNAME) dari template $TEMPLATE_ID..."
qm clone $TEMPLATE_ID $VM_ID --name $HOSTNAME
if [ $? -ne 0 ]; then
log_error "Gagal melakukan cloning VM ID $VM_ID."
fi
# --- 2. Resize Disk ---
log_info "Mengubah ukuran disk (scsi0) menjadi ${DISK_SIZE_GB}G..."
# Asumsi disk boot adalah scsi0 (default Cloud-Init)
qm resize $VM_ID scsi0 ${DISK_SIZE_GB}G
if [ $? -ne 0 ]; then
log_error "Gagal mengubah ukuran disk VM ID $VM_ID."
fi
# --- 3. Konfigurasi Cloud-Init ---
log_info "Mengatur konfigurasi Cloud-Init (User, SSH, IP Statis)..."
# Baca Public Key dari file
SSH_KEY=$(cat $SSH_KEY_FILE)
# Konfigurasi Cloud-Init: User, Key, IP, Gateway
qm set $VM_ID --ide2 ${BASE_IMAGE_STORAGE}:cloudinit
qm set $VM_ID --boot c --bootdisk scsi0
qm set $VM_ID --serial0 socket --vga serial0
qm set $VM_ID --ciuser $DEFAULT_USER
qm set $VM_ID --sshkeys "$SSH_KEY"
qm set $VM_ID --ipconfig0 ip=$IP_ADDRESS,gw=$GATEWAY_IP
# --- 4. Start VM ---
log_info "Memulai VM $VM_ID. Cloud-Init akan berjalan pada boot pertama..."
qm start $VM_ID
# --- 5. Konfirmasi ---
log_success "VM $VM_ID ($HOSTNAME) berhasil dibuat!"
log_info "Akses SSH: ssh $DEFAULT_USER@$BASE_IP$IP_OCTET"
# Optional: Tunggu 60 detik untuk memastikan VM booting dan Cloud-Init selesai
log_warning "Menunggu 60 detik agar Cloud-Init selesai memprovisioning..."
sleep 60
}
Pilar 4: Fungsi DELETE VM (Penghapusan VM)
Fungsi delete_vm akan memastikan VM dimatikan (shutdown) dengan benar sebelum dihapus secara permanen dari Proxmox.
4.1 Sintaks Fungsi delete_vm
# Sintaks: delete_vm <VM_ID>
delete_vm() {
local VM_ID=$1
if [ -z "$VM_ID" ]; then
log_error "Argumen tidak lengkap. Sintaks: delete <ID>"
fi
if ! qm status $VM_ID &>/dev/null; then
log_error "VM ID $VM_ID tidak ditemukan atau tidak valid."
fi
# --- 1. Cek Status dan Shutdown ---
VM_STATUS=$(qm status $VM_ID)
if [ "$VM_STATUS" == "status: running" ]; then
log_warning "VM $VM_ID sedang berjalan. Mematikan (shutdown) secara halus..."
qm shutdown $VM_ID --timeout 60
# Periksa ulang status setelah shutdown
if [ $? -ne 0 ]; then
log_warning "Shutdown gagal. Melakukan penghentian paksa (stop)..."
qm stop $VM_ID
fi
fi
# --- 2. Hapus VM Permanen ---
log_info "Menghapus VM $VM_ID secara permanen..."
qm destroy $VM_ID
if [ $? -ne 0 ]; then
log_error "Gagal menghapus VM ID $VM_ID."
fi
log_success "VM ID $VM_ID berhasil dihapus sepenuhnya."
}
Pilar 5: Struktur Utama dan Implementasi
Bagian utama dari script ini mengelola logika penerimaan argumen dari user dan memanggil fungsi yang sesuai.
5.1 Struktur Logic Script
# --- LOGIC UTAMA SCRIPT ---
case "$1" in
create)
# Shift 1, agar argumen $2, $3, $4 menjadi $1, $2, $3
shift
create_vm "$@"
;;
delete)
shift
delete_vm "$@"
;;
list)
log_info "Daftar VM yang sedang berjalan (tidak termasuk Template $TEMPLATE_ID):"
qm list | awk '{if ($1 != 9000 && $1 != "VMID") print $0}'
log_info "Status Nya: qm list"
;;
help)
echo "=========================================================================="
echo " PROXMOX VM MANAGER BASH SCRIPT"
echo "=========================================================================="
echo "Penggunaan:"
echo " ./vm-manager.sh create <ID> <HOSTNAME> <IP_OCTET> <DISK_SIZE_GB>"
echo " Contoh: ./vm-manager.sh create 102 web-prod-01 15 50"
echo ""
echo " ./vm-manager.sh delete <ID>"
echo " Contoh: ./vm-manager.sh delete 102"
echo ""
echo " ./vm-manager.sh list"
echo " ./vm-manager.sh help"
echo "=========================================================================="
;;
*)
log_error "Perintah tidak valid. Gunakan 'help' untuk melihat penggunaan."
;;
esac
5.2 Implementasi dan Izin Eksekusi
Gabungkan semua bagian kode (Pilar 2, 3, 4, 5) ke dalam satu file bernama
vm-manager.sh.Unggah file ini ke server Proxmox Anda (misalnya, di direktori
/root/).Berikan izin eksekusi:
Bashchmod +x vm-manager.sh
Pilar 6: Contoh Penggunaan Script
Sekarang, Anda dapat menggunakan script ini langsung dari shell Proxmox.
6.1 Membuat VM Baru (Create)
Perintah ini akan membuat VM dengan ID 102, hostname db-staging, IP Address 192.168.1.103 (karena IP octet terakhirnya adalah 103), dan ukuran disk 30 GB.
# Sintaks: ./vm-manager.sh create <ID> <HOSTNAME> <IP_OCTET> <DISK_SIZE_GB>
./vm-manager.sh create 102 db-staging 103 30
Verifikasi Kinerja Otomatisasi:
Cloning VM (
qm clone).Resize disk menjadi 30G (
qm resize).Set IP Statis (
qm set --ipconfig0).Set SSH Key dan user (
qm set --sshkeys).Start VM (
qm start).
6.2 Menghapus VM (Delete)
Perintah ini akan mematikan VM ID 102 (jika berjalan) dan menghapusnya secara permanen dari sistem.
# Sintaks: ./vm-manager.sh delete <ID>
./vm-manager.sh delete 102
6.3 Melihat Daftar VM (List)
./vm-manager.sh list
Kesimpulan: Otomasi Cepat, Konsisten, dan Aman
Anda telah berhasil membuat script Bash yang kuat, vm-manager.sh, yang mengintegrasikan kemampuan Cloud-Init ke dalam alur kerja Proxmox VE.
Dengan mengotomatisasi proses pembuatan (cloning, resize, pengaturan IP, dan SSH Key) dan penghapusan, Anda kini dapat provisioning server Ubuntu baru dalam hitungan detik. Pendekatan ini adalah praktik terbaik untuk lingkungan DevOps dan self-hosted yang mengutamakan konsistensi dan efisiensi resource. Pastikan untuk selalu menjaga keamanan file vm-manager.sh dan file SSH Key publik Anda.
Perintah Kunci Bash Script
Gunakan perintah-perintah ini sebagai referensi cepat untuk script Anda:
# Perintah Kunci: Melihat cara penggunaan
./vm-manager.sh help
# Perintah Kunci: Membuat VM baru
./vm-manager.sh create 105 dev-test-server 105 15
# Perintah Kunci: Menghapus VM yang sudah ada
./vm-manager.sh delete 105
# Perintah Kunci: Melihat list VM
./vm-manager.sh list

