Kita akan gunakan Packer pada pengujian kali ini. Packer adalah alat otomatisasi open-source buatan HashiCorp untuk membuat machine images identik dari satu berkas konfigurasi tunggal. Kita akan jalankan Packer langsung di Proxmox VE (server) karena pas coba via laptop (lokal + VPN) ada kendala. Tapi untuk persiapan filenya bisa lewat lokal terlebih dahulu.
Persiapan Folder Lokal
Buat folder kerja bernama Packer dan folder http di dalamnya melalui terminal lokal:
mkdir -p ~/Packer/http
cd ~/Packer
Buat folder http dan buat file kosong baru.
touch http/meta-data
Siapkan juga password yang akan digunakan untuk template/OS yang akan dibuat. Kita bisa pakai hash. Contohnya seperti ini:
openssl passwd -6 password_pilihan_anda
Salin string output $6$... yang muncul.
Buat juga file dengan nama user-data (di folder http) dan isikan bagian password dengan hasil generate hash tadi. Ini isi file user-data-nya:
#cloud-config
autoinstall:
version: 1
identity:
hostname: ubuntu-template
password: "$6$HasilEnkripsiHashOpenSSLAndaDisini"
username: ubuntu
ssh:
allow-pw: true
install-server: true
storage:
layout:
name: direct
user-data:
package_upgrade: false
timezone: Asia/Jakarta
users:
- name: ubuntu
passwd: "$6$HasilEnkripsiHashOpenSSLAndaDisini"
groups: [adm, sudo]
lock-passwd: false
sudo: ALL=(ALL) NOPASSWD:ALL
shell: /bin/bash
Salin file konfigurasi yang dibuat di lokal ke server PVE.
ssh root@[IP-server-PVE] "mkdir -p /root/Packer/http"
scp ~/Packer/http/user-data ~/Packer/http/meta-data root@[IP-server-PVE] :/root/Packer/http/
Instalasi Packer di PVE
wget https://releases.hashicorp.com/packer/1.11.2/packer_1.11.2_linux_amd64.zip
apt install unzip -y
unzip packer_1.11.2_linux_amd64.zip -d /usr/local/bin/
Persiapan File Konfigurasi
Kita akan instal Ubuntu 26 dengan Packer. Siapkan juga file konfigurasi utamanya. Kita beri nama ubuntu-26.04.pkr.hcl (lokasi direktori di PVE: /root/Packer/). Karena ini dilakukan di nested environment, maka ada beberapa penyesuaian untuk mengurangi risiko kernel panic:
packer {
required_plugins {
proxmox = {
version = ">= 1.1.2"
source = "github.com/hashicorp/proxmox"
}
}
}
source "proxmox-iso" "ubuntu-server-resolute-raccoon" {
proxmox_url = "https://127.0.0.1:8006/api2/json"
username = "root@pam"
password = "PasswordProxmoxAnda"
insecure_skip_tls_verify = true
node = "pve-nested-8"
vm_id = "901"
vm_name = "ubuntu-2604-template"
template_description = "Ubuntu Server 26.04 LTS Resolute Raccoon via Packer"
boot_iso {
iso_file = "local:iso/ubuntu-2604.iso"
iso_storage_pool = "local"
}
# Hardware Tweaks untuk Kestabilan Nested Virtualization
qemu_agent = true
cores = "2" # Minimal 2 Cores untuk menghindari crash ekstraksi kernel
memory = "2048"
scsi_controller = "virtio-scsi-pci"
disks {
disk_size = "20G"
format = "raw"
storage_pool = "local-lvm"
type = "scsi"
}
network_adapters {
model = "virtio"
bridge = "vmbr0"
firewall = "false"
}
http_directory = "http"
http_bind_address = "[alamat-IP-PVE]"
boot_command = [
"<esc><wait>",
"e<wait>",
"<down><down><down><end>",
"<bs><bs><bs><bs><wait>",
"autoinstall ds=nocloud-net\\;s=http://{{ .HTTPIP }}:{{ .HTTPPort }}/ ---<wait>",
"<f10><wait>"
]
boot_wait = "5s"
ssh_username = "ubuntu"
ssh_password = "ubuntu"
ssh_timeout = "20m"
}
build {
name = "ubuntu-server-resolute-raccoon"
sources = ["source.proxmox-iso.ubuntu-server-resolute-raccoon"]
provisioner "shell" {
inline = [
"while [ ! -f /var/lib/cloud/instance/boot-finished ]; do echo 'Waiting for cloud-init...'; sleep 1; done",
"sudo rm /etc/ssh/ssh_host_*",
"sudo truncate -s 0 /etc/machine-id",
"sudo apt -y autoremove --purge",
"sudo apt -y clean",
"sudo apt -y autoclean",
"sudo cloud-init clean --logs --seed",
"sudo sync"
]
}
}
Selanjutnya, build dari file yang tadi dibuat.
cd /root/Packer
packer init ubuntu-26.04.pkr.hcl
packer build ubuntu-26.04.pkr.hcl
Packer akan membuat VM secara otomatis, mengetikkan instruksi instalasi secara mandiri lewat konsol VNC, melakukan pembersihan, mematikan VM, dan mengubahnya menjadi sebuah Master Template dengan ID 901 di Proxmox.

Jalankan VM
Karena hasilnya menjadi template, kita bisa langsung clone saja menjadi VM dan isikan keterangan nama VM yang akan dibuat dari hasil template.

Kendala Tidak Bisa Login

Kita coba gunakan cloud-init untuk regenerate image tapi pada pengujian kali ini belum berhasil (tetap tidak bisa pakai kredensial baru untuk masuk). Sehingga perlu kita akalin dengan langsung masuk ke root via GRUB.
Reboot VM, lalu untuk masuk ke GRUB, saat layar hitam pertama kali muncul sewaktu VM menyala, tekan tombol e pada keyboard berulang kali dengan cepat (sebelum masuk ke Ubuntu-nya).
Cari baris teks yang diawali dengan kata linux. Temukan parameter ro pada potongan baris bawahnya, hapus teks ro tersebut, lalu ganti menjadi:
rw init=/bin/bash
Lanjut boot via root dengan menekan tombol F10. Lalu kita reset password dari akun ubuntu.
passwd ubuntu
Masukkan password baru Anda, lalu tekan Enter. Lalu reboot VM-nya. Gambar di bawah menampilkan kita berhasil masuk ke Ubuntu via akun biasa (non root).
Tulisan kali ini sampai di sini dulu ya. Sampai jumpa. Bye.

