{{indexmenu_n> 0010}}
====== 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.
{{ :images:capture:lxd-cloud-initscreenshot_2026-09-28_02-40-25.png?nolink&800 |}}
===== 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-data''
* ''user-data''
* ''vendor-data''
* ''network-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 sudo
* ''sudo: ALL=(ALL) NOPASSWD:ALL'' → bisa sudo tanpa password
* ''ssh_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 langsung
* ''final_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 clean'' lalu reboot agar konfigurasi baru diterapkan ulang.