Beralih dari installer ISO ke cloud images resmi, provisioning otomatis dengan user-data cloud-init dan ISO NoCloud seed, menyesuaikan image dengan virt-customize, hingga memunculkan VM dalam hitungan detik

Sampai episode 13, setiap VM baru berarti instalasi OS dari ISO — memakan waktu dan tidak konsisten. Di episode 14 kita mengubah cara kerja itu selamanya: cloud images + cloud-init. Ini teknik yang sama dengan yang dipakai cloud provider: image OS generik + data konfigurasi sekali boot = VM siap pakai dalam hitungan detik.
Konsep intinya: pisahkan image (OS baku) dari instance (konfigurasi spesifik). cloud-init adalah "penduduk sementara" yang membaca user-data saat boot pertama, lalu menerapkan user, SSH keys, paket, dan hostname. Hasilnya provisioning yang cepat, konsisten, dan bisa diulang.
Cloud image adalah image qcow2 minimal yang dioptimalkan untuk boot cepat, siap di-provisioning oleh cloud-init. Unduh dari distribusi masing-masing:
wget https://cloud-images.ubuntu.com/noble/current/noble-server-cloudimg-amd64.imgUntuk Debian dan Rocky Cloud, paket serupa tersedia di situs resmi masing-masing. Periksa image yang diunduh:
qemu-img info noble-server-cloudimg-amd64.imgPerhatikan: image ini umumnya berformat qcow2, dan karena cloud images dirancang blank, login default sering dinonaktifkan — akses hanya lewat SSH key yang disuntikkan cloud-init.
Jangan pernah menjalankan langsung dari image master — boot VM dari duplikat tipis agar image master tetap bersih:
qemu-img create -f qcow2 -b noble-server-cloudimg-amd64.img -F qcow2 web1.qcow2Konfigurasi cloud-init ditulis dalam user-data, biasanya #cloud-config:
#cloud-config
users:
- name: devnull
sudo: ALL=(ALL) NOPASSWD:ALL
shell: /bin/bash
ssh_authorized_keys:
- ssh-ed25519 AAAAC3NzaC1lZDI1NTE5AAAA...
chpasswd:
expire: false
package_update: true
packages:
- nginx
- htopBlok penting:
#cloud-config — penanda format; wajib di baris pertama.users — membuat user + menaruh SSH public key kalian.chpasswd — mengatur password (dan memastikan tidak expire).packages — paket yang diinstall saat boot pertama.cloud-init mendukung banyak modul lain: write_files (tulis file), runcmd (jalankan perintah), ssh_keys (host keys), dan hostname.
Cara paling umum di libvirt adalah NoCloud: buat ISO berisi metadata & user-data, tempel sebagai CD-ROM kedua:
mkdir -p seed
cat > seed/user-data <<'EOF'
#cloud-config
...
EOF
cat > seed/meta-data <<'EOF'
instance-id: web1
local-hostname: web1
EOFgenisoimage -output seed.iso -volid cidata -joliet -rock seed/Lalu buat VM yang memakai image cloud + seed:
virt-install \
--name web1 \
--memory 2048 --vcpus 2 \
--disk path=web1.qcow2,format=qcow2 \
--disk path=seed.iso,device=cdrom \
--os-variant ubuntu24.04 \
--network network=default \
--importTip
Untuk lab cepat tanpa genisoimage, gunakan --cloud-init bawaan virt-install: virt-install --cloud-init user-data=user-data --import .... libvirt mengelola pembuatan seed ISO secara otomatis.
Setelah boot pertama, cloud-init membaca seed, menerapkan konfigurasi, dan — sesuai instance-id — tidak akan menjalankan ulang modul yang sudah dieksekusi (per-boot & per-instance).
Kadang image perlu diubah sebelum boot — bukan pada saat boot. virt-customize (dari paket libguestfs-tools) mengedit image dalam mode offline:
virt-customize -a web1.qcow2 \
--root-password password:rahasia \
--install nginx \
--run-command 'systemctl enable nginx'Operasi berguna lainnya: --hostname, --ssh-inject, --firstboot-command. Bedanya dengan cloud-init: virt-customize mengubah image itu sendiri sebelum boot; cloud-init mengonfigurasi saat boot. Kombinasi keduanya sangat umum — customize image master, lalu provision tiap instance dengan user-data.
1. Unduh cloud image resmi (image master)
2. qemu-img create -b → disk tipis per instance
3. Tulis user-data (user, SSH key, paket)
4. Boot VM dengan seed NoCloud / --cloud-init
5. Verifikasi: ssh user@ip — langsung masuk, tanpa passwordIni pola yang sama yang kita kembangkan ke Terraform di episode 21.
instance-id unik: dua VM dengan instance-id sama menganggap dirinya instance yang sama — perilaku cloud-init jadi tidak konsisten.cidata agar NoCloud terdeteksi.ssh_authorized_keys benar; debug dengan cloud-init status --wait di guest.Pada episode 14 ini, kalian telah menguasai provisioning VM modern.
Inti yang harus dibawa pulang:
#cloud-config user-data mengatur user, SSH keys, paket, hostname.-volid cidata) menyuntikkan user-data; --cloud-init virt-install membuatnya otomatis.virt-customize mengubah image secara offline sebelum boot.Di episode 15 selanjutnya, kita akan membahas live migration — memindahkan VM antar host tanpa downtime dengan virsh migrate --live, persyaratan shared storage, tuning downtime, post-copy, dan migrasi tanpa shared storage. Sampai jumpa di episode 15!