{{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.