virtualization:lxd:cloud-init

LXD: 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.

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.

Bagian ini paling sering dipakai untuk konfigurasi awal sebuah instance.

#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

Supaya server hanya bisa diakses lewat SSH key (lebih aman), tambahkan:

ssh_pwauth: false

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

Penting: bagian ini format-nya berbeda, tidak pakai #cloud-config.

version: 2
ethernets:
  eth0:
    dhcp4: true

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

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

Selain contoh dasar di atas, berikut parameter lain yang sering dipakai.

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

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
  • 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.
  • virtualization/lxd/cloud-init.txt
  • Last modified: 2026/09/28 02:46
  • by ilyasa