LXD: Cloud-Init
Apa itu Cloud-Init?
Cloud-init adalah tool standar industri untuk melakukan konfigurasi otomatis pada instance/VM/container saat pertama kali boot (first boot). Tool ini banyak dipakai di platform virtualisasi dan cloud seperti Incus, LXD, Proxmox, AWS, OpenStack, dll.
Dengan cloud-init, kita tidak perlu login manual ke setiap instance untuk:
- Membuat user & set SSH key
- Install package
- Konfigurasi jaringan
- Menjalankan command tertentu saat boot
Semua bisa disiapkan sebelum instance dinyalakan.
3 Komponen Utama
Cloud-init bekerja dengan 3 jenis konfigurasi:
| Komponen | Fungsi | Diawali |
|---|---|---|
| User Data | Konfigurasi spesifik per-instance (user, SSH key, sudo, hostname, package, command) | #cloud-config |
| Vendor Data | Konfigurasi umum/default yang berlaku untuk semua instance (timezone, package standar) | #cloud-config |
| Network Config | Konfigurasi jaringan (IP, DNS, routing) | Tidak pakai #cloud-config |
Ketiganya ditulis dalam format YAML.
Setelah boot, ketiga file ini disimpan di dalam instance pada:
/var/lib/cloud/seed/nocloud-net/
meta-datauser-datavendor-datanetwork-config
Catatan: File-file ini otomatis digenerate oleh platform (Incus/LXD/dll), jangan diedit manual.
1. User Data
Bagian ini paling sering dipakai untuk konfigurasi awal sebuah instance.
Contoh: Buat User + SSH Key
#cloud-config users: - name: ilyasa groups: sudo shell: /bin/bash sudo: ALL=(ALL) NOPASSWD:ALL ssh_authorized_keys: - ssh-ed25519 AAAAC3NzaC1lZDI1NTE5AAAA... ilyasa@laptop
Penjelasan singkat:
groups: sudo→ user masuk ke grup sudosudo: ALL=(ALL) NOPASSWD:ALL→ bisa sudo tanpa passwordssh_authorized_keys→ public key untuk login SSH tanpa password
Tambahan: Matikan Login Password
Supaya server hanya bisa diakses lewat SSH key (lebih aman), tambahkan:
ssh_pwauth: false
2. Vendor Data
Dipakai untuk hal-hal yang sifatnya umum dan berlaku ke banyak instance, misalnya timezone dan package dasar.
#cloud-config timezone: Asia/Jakarta package_update: true packages: - openssh-server - curl - wget - vim - htop
3. Network Config
Penting: bagian ini format-nya berbeda, tidak pakai #cloud-config.
DHCP (paling simple)
version: 2 ethernets: eth0: dhcp4: true
Static IP
Contoh kebutuhan:
- IP: 10.14.3.50/24
- Gateway: 10.14.3.1
- DNS: 10.14.3.53, 1.1.1.1
version: 2 ethernets: eth0: addresses: - 10.14.3.50/24 routes: - to: default via: 10.14.3.1 nameservers: addresses: - 10.14.3.53 - 1.1.1.1
Static IP + IPv6
version: 2 ethernets: eth0: addresses: - 10.14.3.50/24 - 2001:db8:10:14::50/64 routes: - to: default via: 10.14.3.1 - to: default via: 2001:db8:10:14::1 nameservers: addresses: - 10.14.3.53 - 1.1.1.1
Multiple IP di 1 Interface
version: 2 ethernets: eth0: addresses: - 10.14.3.50/24 - 10.14.3.51/24 - 10.14.3.52/24 routes: - to: default via: 10.14.3.1 nameservers: addresses: - 10.14.3.53
Tambah Route Khusus
Kalau butuh route tambahan selain default gateway:
version: 2 ethernets: eth0: addresses: - 10.14.3.50/24 routes: - to: default via: 10.14.3.1 - to: 10.20.0.0/24 via: 10.14.3.254 nameservers: addresses: - 10.14.3.53
Parameter Tambahan yang Berguna
Selain contoh dasar di atas, berikut parameter lain yang sering dipakai.
User Data — Parameter Lain
Konfigurasi user lebih lanjut:
#cloud-config users: - name: ilyasa groups: sudo shell: /bin/bash sudo: ALL=(ALL) NOPASSWD:ALL lock_passwd: false # izinkan login password (default: true = dikunci) passwd: $6$rounds=4096$... # hash password (bukan plaintext) primary_group: ilyasa expiredate: '2026-12-31' # akun expired otomatis
Set password tanpa hash manual (auto-generate/plaintext):
chpasswd: list: | ilyasa:password123 expire: false
Hostname & FQDN:
hostname: server-001 fqdn: server-001.ilyasa.id manage_etc_hosts: true
Tulis file langsung ke instance:
write_files: - path: /etc/motd content: | Selamat datang di server saya. owner: root:root permissions: '0644'
Jalankan command saat boot:
bootcmd: - echo "jalan paling awal, bahkan sebelum network up" >> /var/log/boot-note.log runcmd: - systemctl enable --now nginx - ufw allow 22/tcp
Matikan/reboot otomatis setelah cloud-init selesai:
power_state: mode: reboot # pilihan: poweroff, reboot, halt timeout: 30 message: Rebooting setelah provisioning
Lain-lain yang sering dipakai:
disable_root: true→ nonaktifkan login root langsungfinal_message: “Provisioning selesai dalam $UPTIME detik”→ pesan di akhir proses
Vendor Data — Parameter Lain
Vendor Data pada dasarnya bisa memakai modul yang sama dengan User Data, tapi biasanya diisi hal-hal default/umum untuk semua instance.
Locale & NTP:
locale: en_US.UTF-8 ntp: enabled: true servers: - 0.id.pool.ntp.org - 1.id.pool.ntp.org
Resize disk otomatis (berguna kalau disk image lebih kecil dari alokasi):
growpart: mode: auto devices: ['/']
Mount tambahan (misal swap):
mounts: - [ /dev/sdb1, /mnt/data, ext4, "defaults,nofail", "0", "2" ] swap: filename: /swapfile size: 1073741824 # 1GB dalam byte
Upgrade & reboot otomatis kalau perlu:
package_upgrade: true package_reboot_if_required: true
Network Config — Parameter Lain
Network Config v2 mengikuti sintaks Netplan, jadi parameter-parameter Netplan berikut ini berlaku juga.
MTU custom:
version: 2 ethernets: eth0: dhcp4: true mtu: 1400
Match interface berdasarkan MAC address (berguna kalau nama interface tidak konsisten):
version: 2 ethernets: nic0: match: macaddress: "00:16:3e:xx:xx:xx" set-name: eth0 dhcp4: true
DNS search domain:
nameservers: addresses: [10.14.3.53] search: [fopens.example, lab.local]
Kontrol DHCP lebih detail (dhcp4-overrides):
version: 2 ethernets: eth0: dhcp4: true dhcp4-overrides: use-dns: false # abaikan DNS dari DHCP, pakai nameservers manual route-metric: 100
Interface opsional (boot tidak nunggu link up, cocok untuk lab/testing):
version: 2 ethernets: eth0: dhcp4: true optional: true
VLAN tagging:
version: 2 ethernets: eth0: dhcp4: false vlans: vlan100: id: 100 link: eth0 addresses: - 10.100.0.10/24
Bridge (berguna untuk lab virtualisasi/container):
version: 2 ethernets: eth0: dhcp4: false bridges: br0: interfaces: [eth0] addresses: - 10.14.3.50/24 routes: - to: default via: 10.14.3.1
Cara Verifikasi
Setelah instance boot, cek apakah cloud-init berjalan dengan baik:
cloud-init status --long
Cek file konfigurasi yang diterima instance:
cd /var/lib/cloud/seed/nocloud-net ls cat user-data cat vendor-data cat network-config
Cek hasil konfigurasi jaringan:
ip addr show eth0 # cek IP ip route # cek routing resolvectl status # cek DNS
Hal yang Perlu Diingat
- User Data & Vendor Data wajib diawali
#cloud-config. - Network Config tidak pakai
#cloud-config. - Gunakan image yang sudah mendukung cloud-init (biasanya varian
/cloud). - Untuk konfigurasi network baru, selalu pakai version: 2 — lebih ringkas dan mudah dibaca dibanding version 1.
- Cloud-init hanya berjalan saat first boot. Kalau instance sudah pernah boot dan konfigurasi diubah, biasanya perlu
cloud-init cleanlalu reboot agar konfigurasi baru diterapkan ulang.