virtualization:lxd:cloud-init

Differences

This shows you the differences between two versions of the page.

Link to this comparison view

Both sides previous revision Previous revision
Next revision
Previous revision
virtualization:lxd:cloud-init [2026/09/27 21:08] – ilyasavirtualization:lxd:cloud-init [2026/09/28 02:46] (current) – ilyasa
Line 1: Line 1:
-====== LXC Cloud-Init ======+{{indexmenu_n> 0010}} 
 +====== LXD: Cloud-Init ======
  
-Cloud-init digunakan untuk konfigurasi instance LXC secara otomatis saat first boot. Konfigurasi utama: **User Data**, **Vendor Data**, dan **Network Config**.+===== Apa itu Cloud-Init? =====
  
-Lokasi data di dalam guest:+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.
  
-<code> +Dengan cloud-init, kita tidak perlu login manual ke setiap instance untuk:
-/var/lib/cloud/seed/nocloud-net/ +
-</code>+
  
-===== 1. User Data =====+  * Membuat user & set SSH key 
 +  * Install package 
 +  * Konfigurasi jaringan 
 +  * Menjalankan command tertentu saat boot
  
-Fungsi: buat user, SSH key, akses sudo, hostname, install package, jalankan command.+Semua bisa disiapkan **sebelum** instance dinyalakan.
  
-Lokasi GUI:+{{ :images:capture:lxd-cloud-initscreenshot_2026-09-28_02-40-25.png?nolink&800 |}}
  
-<code> 
-Instance → Configuration → Cloud Init → User Data → Override 
-</code> 
  
-Wajib diawali <code>#cloud-config</code>.+===== 3 Komponen Utama =====
  
-==== Buat User + SSH Key ====+Cloud-init bekerja dengan 3 jenis konfigurasi:
  
-<code yaml> +^ Komponen ^ Fungsi ^ Diawali ^ 
-#cloud-config+| User Data | Konfigurasi spesifik per-instance (user, SSH key, sudo, hostname, package, command) | <code>#cloud-config</code> | 
 +| Vendor Data | Konfigurasi umum/default yang berlaku untuk semua instance (timezone, package standar) | <code>#cloud-config</code> | 
 +| Network Config | Konfigurasi jaringan (IP, DNS, routing) | Tidak pakai <code>#cloud-config</code> |
  
-users: +Ketiganya ditulis dalam format **YAML**.
-  - name: ilyasa +
-    groups: sudo +
-    shell: /bin/bash +
-    sudo: ALL=(ALL) NOPASSWD:ALL +
-    ssh_authorized_keys: +
-      - ssh-ed25519 AAAAC3NzaC1lZDI1NTE5AAAA... ilyasa@laptop +
-</code>+
  
-Cek setelah boot:+Setelah boot, ketiga file ini disimpan di dalam instance pada:
  
-<code bash> +<code> 
-id ilyasa +/var/lib/cloud/seed/nocloud-net/
-ssh ilyasa@IP_ADDRESS+
 </code> </code>
  
-==== Disable Password Authentication ====+  * ''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 ====
  
 <code yaml> <code yaml>
Line 54: Line 58:
     ssh_authorized_keys:     ssh_authorized_keys:
       - ssh-ed25519 AAAAC3NzaC1lZDI1NTE5AAAA... ilyasa@laptop       - ssh-ed25519 AAAAC3NzaC1lZDI1NTE5AAAA... ilyasa@laptop
- 
-ssh_pwauth: false 
 </code> </code>
  
-===== 2. Vendor Data =====+Penjelasan singkat:
  
-Fungsi: konfigurasi umum/default (timezone, package standar, service umum).+  * ''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
  
-Lokasi GUI:+==== Tambahan: Matikan Login Password ====
  
-<code> +Supaya server hanya bisa diakses lewat SSH key (lebih aman), tambahkan: 
-Instance → Configuration → Cloud Init → Vendor Data → Override+ 
 +<code yaml> 
 +ssh_pwauth: false
 </code> </code>
  
-Wajib diawali <code>#cloud-config</code>.+===== 2. Vendor Data ===== 
 + 
 +Dipakai untuk hal-hal yang sifatnya umum dan berlaku ke banyak instance, misalnya timezone dan package dasar.
  
 <code yaml> <code yaml>
Line 87: Line 95:
 ===== 3. Network Config ===== ===== 3. Network Config =====
  
-Fungsi: konfigurasi interface jaringan. **Tidak** menggunakan <code>#cloud-config</code>. +**Penting:** bagian ini format-nya berbeda, **tidak** pakai ''#cloud-config''.
- +
-Lokasi GUI: +
- +
-<code> +
-Instance → Configuration → Cloud Init → Network Config → Override +
-</code>+
  
-==== DHCP IPv4 ====+==== DHCP (paling simple) ====
  
 <code yaml> <code yaml>
Line 104: Line 106:
 </code> </code>
  
-==== DHCP IPv4 + IPv6 ====+==== Static IP ====
  
-<code yaml> +Contoh kebutuhan: 
-version: 2 +  * IP: 10.14.3.50/24 
-ethernets: +  * Gateway: 10.14.3.1 
-  eth0: +  * DNS: 10.14.3.53, 1.1.1.1
-    dhcp4: true +
-    dhcp6: true +
-</code> +
- +
-==== Static IPv4 ==== +
- +
-Contoh: IP 10.14.3.50/24, Gateway 10.14.3.1, DNS 10.14.3.53 & 1.1.1.1+
  
 <code yaml> <code yaml>
Line 133: Line 128:
 </code> </code>
  
-==== Static IPv4 tanpa Gateway ====+==== Static IP + IPv6 ====
  
 <code yaml> <code yaml>
Line 141: Line 136:
     addresses:     addresses:
       - 10.14.3.50/24       - 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:     nameservers:
       addresses:       addresses:
         - 10.14.3.53         - 10.14.3.53
 +        - 1.1.1.1
 </code> </code>
  
-==== Static IPv4 dengan Multiple IP ====+==== Multiple IP di 1 Interface ====
  
 <code yaml> <code yaml>
Line 162: Line 164:
       addresses:       addresses:
         - 10.14.3.53         - 10.14.3.53
-        - 1.1.1.1 
 </code> </code>
  
-==== Static IPv4 + IPv6 ====+==== Tambah Route Khusus ==== 
 + 
 +Kalau butuh route tambahan selain default gateway:
  
 <code yaml> <code yaml>
Line 173: Line 176:
     addresses:     addresses:
       - 10.14.3.50/24       - 10.14.3.50/24
-      - 2001:db8:10:14::50/64 
     routes:     routes:
       - to: default       - to: default
         via: 10.14.3.1         via: 10.14.3.1
-      - to: default +      - to: 10.20.0.0/24 
-        via: 2001:db8:10:14::1+        via: 10.14.3.254
     nameservers:     nameservers:
       addresses:       addresses:
         - 10.14.3.53         - 10.14.3.53
-        - 1.1.1.1 
-        - 2001:4860:4860::8888 
 </code> </code>
  
-===== 4. Static Routing Tambahan =====+===== Parameter Tambahan yang Berguna ===== 
 + 
 +Selain contoh dasar di atas, berikut parameter lain yang sering dipakai. 
 + 
 +==== User Data — Parameter Lain ==== 
 + 
 +**Konfigurasi user lebih lanjut:** 
 + 
 +<code yaml> 
 +#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 
 +</code> 
 + 
 +**Set password tanpa hash manual (auto-generate/plaintext):** 
 + 
 +<code yaml> 
 +chpasswd: 
 +  list: | 
 +    ilyasa:password123 
 +  expire: false 
 +</code> 
 + 
 +**Hostname & FQDN:** 
 + 
 +<code yaml> 
 +hostname: server-001 
 +fqdn: server-001.ilyasa.id 
 +manage_etc_hosts: true 
 +</code> 
 + 
 +**Tulis file langsung ke instance:** 
 + 
 +<code yaml> 
 +write_files: 
 +  - path: /etc/motd 
 +    content: | 
 +      Selamat datang di server saya. 
 +    owner: root:root 
 +    permissions: '0644' 
 +</code> 
 + 
 +**Jalankan command saat boot:** 
 + 
 +<code yaml> 
 +bootcmd: 
 +  - echo "jalan paling awal, bahkan sebelum network up" >> /var/log/boot-note.log 
 + 
 +runcmd: 
 +  - systemctl enable --now nginx 
 +  - ufw allow 22/tcp 
 +</code> 
 + 
 +**Matikan/reboot otomatis setelah cloud-init selesai:** 
 + 
 +<code yaml> 
 +power_state: 
 +  mode: reboot     # pilihan: poweroff, reboot, halt 
 +  timeout: 30 
 +  message: Rebooting setelah provisioning 
 +</code> 
 + 
 +**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:** 
 + 
 +<code yaml> 
 +locale: en_US.UTF-8 
 + 
 +ntp: 
 +  enabled: true 
 +  servers: 
 +    - 0.id.pool.ntp.org 
 +    - 1.id.pool.ntp.org 
 +</code> 
 + 
 +**Resize disk otomatis (berguna kalau disk image lebih kecil dari alokasi):** 
 + 
 +<code yaml> 
 +growpart: 
 +  mode: auto 
 +  devices: ['/'] 
 +</code> 
 + 
 +**Mount tambahan (misal swap):** 
 + 
 +<code yaml> 
 +mounts: 
 +  - [ /dev/sdb1, /mnt/data, ext4, "defaults,nofail", "0", "2" ] 
 + 
 +swap: 
 +  filename: /swapfile 
 +  size: 1073741824    # 1GB dalam byte 
 +</code> 
 + 
 +**Upgrade & reboot otomatis kalau perlu:** 
 + 
 +<code yaml> 
 +package_upgrade: true 
 +package_reboot_if_required: true 
 +</code> 
 + 
 +==== Network Config — Parameter Lain ==== 
 + 
 +Network Config v2 mengikuti sintaks **Netplan**, jadi parameter-parameter Netplan berikut ini berlaku juga. 
 + 
 +**MTU custom:**
  
 <code yaml> <code yaml>
Line 192: Line 313:
 ethernets: ethernets:
   eth0:   eth0:
 +    dhcp4: true
 +    mtu: 1400
 +</code>
 +
 +**Match interface berdasarkan MAC address (berguna kalau nama interface tidak konsisten):**
 +
 +<code yaml>
 +version: 2
 +ethernets:
 +  nic0:
 +    match:
 +      macaddress: "00:16:3e:xx:xx:xx"
 +    set-name: eth0
 +    dhcp4: true
 +</code>
 +
 +**DNS search domain:**
 +
 +<code yaml>
 +nameservers:
 +  addresses: [10.14.3.53]
 +  search: [fopens.example, lab.local]
 +</code>
 +
 +**Kontrol DHCP lebih detail (dhcp4-overrides):**
 +
 +<code yaml>
 +version: 2
 +ethernets:
 +  eth0:
 +    dhcp4: true
 +    dhcp4-overrides:
 +      use-dns: false        # abaikan DNS dari DHCP, pakai nameservers manual
 +      route-metric: 100
 +</code>
 +
 +**Interface opsional (boot tidak nunggu link up, cocok untuk lab/testing):**
 +
 +<code yaml>
 +version: 2
 +ethernets:
 +  eth0:
 +    dhcp4: true
 +    optional: true
 +</code>
 +
 +**VLAN tagging:**
 +
 +<code yaml>
 +version: 2
 +ethernets:
 +  eth0:
 +    dhcp4: false
 +vlans:
 +  vlan100:
 +    id: 100
 +    link: eth0
 +    addresses:
 +      - 10.100.0.10/24
 +</code>
 +
 +**Bridge (berguna untuk lab virtualisasi/container):**
 +
 +<code yaml>
 +version: 2
 +ethernets:
 +  eth0:
 +    dhcp4: false
 +bridges:
 +  br0:
 +    interfaces: [eth0]
     addresses:     addresses:
       - 10.14.3.50/24       - 10.14.3.50/24
Line 197: Line 389:
       - to: default       - to: default
         via: 10.14.3.1         via: 10.14.3.1
-      - to: 10.20.0.0/24 
-        via: 10.14.3.254 
-      - to: 172.20.22.0/26 
-        via: 10.14.3.253 
-    nameservers: 
-      addresses: 
-        - 10.14.3.53 
-        - 1.1.1.1 
 </code> </code>
  
-===== 5. Verifikasi Cloud-Init =====+===== Cara Verifikasi =====
  
-Cek status:+Setelah instance boot, cek apakah cloud-init berjalan dengan baik:
  
 <code bash> <code bash>
Line 215: Line 399:
 </code> </code>
  
-Cek data yang diberikan Incus:+Cek file konfigurasi yang diterima instance:
  
 <code bash> <code bash>
 cd /var/lib/cloud/seed/nocloud-net cd /var/lib/cloud/seed/nocloud-net
 ls ls
 +cat user-data
 +cat vendor-data
 +cat network-config
 </code> </code>
  
-Output: +Cek hasil konfigurasi jaringan:
- +
-<code> +
-meta-data +
-network-config +
-user-data +
-vendor-data +
-</code> +
- +
-Cek isi masing-masing:+
  
 <code bash> <code bash>
-cat /var/lib/cloud/seed/nocloud-net/user-data +ip addr show eth0      # cek IP 
-cat /var/lib/cloud/seed/nocloud-net/vendor-data +ip route                 # cek routing 
-cat /var/lib/cloud/seed/nocloud-net/network-config+resolvectl status        # cek DNS
 </code> </code>
  
-===== 6. Verifikasi Network ===== +===== Hal yang Perlu Diingat =====
- +
-<code bash> +
-ip addr show eth0 +
-ip route +
-resolvectl status +
-</code> +
- +
-===== 7. Catatan Penting ===== +
- +
-  * **User Data** & **Vendor Data** harus diawali <code>#cloud-config</code>. +
-  * **Network Config** tidak pakai <code>#cloud-config</code>. +
-  * Gunakan image varian <code>/cloud</code> (sudah support cloud-init). +
-  * SSH public key diletakkan di <code>ssh_authorized_keys</code>. +
-  * Untuk config baru, pakai **Network Config v2** (lebih mudah dibaca). +
-  * Jangan edit manual file di <code>/var/lib/cloud/seed/nocloud-net/</code>, itu data yang di-generate otomatis oleh Incus. +
- +
-===== Ringkasan Format =====+
  
-^ GUI Field ^ Format ^ Contoh ^ +  * User Data & Vendor Data **wajib** diawali ''#cloud-config''. 
-| User Data | Cloud-config | <code>#cloud-config</code> + YAML | +  * Network Config **tidak** pakai ''#cloud-config''. 
-| Vendor Data | Cloud-config | <code>#cloud-config</code> + YAML | +  * Gunakan image yang sudah mendukung cloud-init (biasanya varian ''/cloud''). 
-| Network Config | Network-config | <code>version: 2</code> + YAML | +  * Untuk konfigurasi network baru, selalu pakai **version: 2** — lebih ringkas dan mudah dibaca dibanding version 1. 
-| SSH Key | Cloud-config | <code>ssh_authorized_keys</code> | +  * 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.
-| DHCP | Network-config | <code>dhcp4: true</code> | +
-| Static IP | Network-config | <code>addresses</code> + <code>routes</code> |+
  • virtualization/lxd/cloud-init.1790518115.txt.gz
  • Last modified: 2026/10/08 04:33
  • (external edit)