Lewati ke isi

Server & Infrastruktur

Cara Memakai Cloud-init untuk Menyiapkan VPS Otomatis

Panduan menulis user-data cloud-init untuk membuat user, memasang kunci SSH, paket, dan file konfigurasi secara otomatis saat VPS pertama kali menyala.

Terbit 5 menit baca

Jawaban singkat

Cloud-init membaca file user-data berformat cloud-config saat VPS pertama kali boot, lalu membuat user, memasang kunci SSH, menginstal paket, menulis file, dan menjalankan perintah secara otomatis. Validasi file dengan cloud-init schema dan cek hasilnya dengan cloud-init status --long.

Daftar isi
  1. Apa yang terjadi saat boot pertama?
  2. Langkah menyiapkan VPS dengan cloud-init
  3. 1. Pahami bentuk file user-data
  4. 2. Tulis konfigurasi dasar yang aman
  5. 3. Tambahkan file dan perintah
  6. 4. Validasi sebelum dipakai
  7. 5. Buat VPS dan tempel user-data
  8. Bagaimana memeriksa hasil dan mengulang proses?
  9. Periksa status dan log
  10. Jalankan ulang untuk pengujian
  11. Kapan cloud-init cukup, kapan perlu alat lain?
  12. Pertanyaan yang sering diajukan
  13. Checklist sebelum menekan tombol buat server

Berapa lama waktu yang kamu habiskan setiap kali menyiapkan VPS baru? Membuat user, menempel kunci SSH, mematikan login password, memasang paket yang sama, mengatur zona waktu. Semua itu bisa selesai sendiri saat server pertama kali menyala, asalkan kamu memberikan satu file teks ke cloud-init.

Cloud-init adalah program standar yang ada di hampir semua image cloud Linux, termasuk Ubuntu, Debian, AlmaLinux, dan Rocky Linux. Saat boot pertama, ia membaca metadata dari penyedia dan file user-data buatanmu, lalu menjalankan instruksinya. Banyak panel VPS menyediakan kolom "user data" atau "cloud-init" saat membuat server baru. Kalau panelmu tidak menyediakannya, cek dulu ke penyedia apakah fitur ini didukung.

Apa yang terjadi saat boot pertama?

Cloud-init bekerja dalam beberapa tahap berurutan. Tahap Detect mengenali platform tempat server berjalan. Tahap Local mencari sumber data dan menulis konfigurasi jaringan. Tahap Network memproses user-data setelah jaringan aktif. Tahap Config menjalankan modul konfigurasi, dan tahap Final berjalan paling akhir untuk memasang paket serta menjalankan skrip buatan pengguna.

Urutan ini menjelaskan kenapa perintah di runcmd boleh memakai paket yang baru dipasang: perintahnya disiapkan lebih awal, tapi baru dieksekusi di tahap terakhir.

Langkah menyiapkan VPS dengan cloud-init

1. Pahami bentuk file user-data

File user-data paling umum berformat YAML dan wajib diawali baris persis seperti ini:

#cloud-config

Tanpa baris itu, cloud-init tidak mengenali isinya sebagai konfigurasi. Setelah baris pertama, kamu menulis kunci-kunci modul, misalnya users, packages, write_files, dan runcmd. Daftar lengkap modul ada di dokumentasi resmi cloud-init.

2. Tulis konfigurasi dasar yang aman

Contoh berikut membuat user deploy dengan akses sudo, memasang kunci SSH, mematikan login password, memperbarui paket, dan mengatur zona waktu Jakarta:

#cloud-config
users:
  - default
  - name: deploy
    groups: sudo
    shell: /bin/bash
    sudo: "ALL=(ALL) NOPASSWD:ALL"
    ssh_authorized_keys:
      - ssh-ed25519 AAAAC3Nza...isi-kunci-publikmu deploy@laptop

ssh_pwauth: false
disable_root: true
timezone: Asia/Jakarta

package_update: true
package_upgrade: true
packages:
  - ufw
  - fail2ban
  - htop

Baris - default mempertahankan user bawaan image (misalnya ubuntu). Hapus baris itu kalau kamu hanya ingin user deploy. Nama grup sudo berlaku di Ubuntu dan Debian. Di AlmaLinux atau Rocky Linux, grup admin bernama wheel.

Langkah-langkah ini sama dengan yang biasa dikerjakan manual di cara mengamankan VPS Linux baru, hanya saja sekarang tertulis dan bisa diulang.

3. Tambahkan file dan perintah

Modul write_files menulis file sebelum perintah dijalankan, sedangkan runcmd menjalankan perintah shell di akhir proses boot pertama:

write_files:
  - path: /etc/ssh/sshd_config.d/10-hardening.conf
    permissions: "0644"
    content: |
      PermitRootLogin no
      PasswordAuthentication no

runcmd:
  - ufw allow OpenSSH
  - ufw --force enable
  - systemctl enable --now fail2ban
  - systemctl restart ssh

Gabungkan blok ini dengan contoh di langkah 2 dalam satu file. Perhatikan bahwa runcmd hanya berjalan sekali per instance, bukan setiap reboot. Nama layanan SSH juga berbeda antar distro: ssh di Ubuntu dan Debian, sshd di keluarga Red Hat.

4. Validasi sebelum dipakai

Kesalahan indentasi YAML adalah penyebab paling umum cloud-init "tidak melakukan apa-apa". Kalau kamu punya mesin Linux dengan cloud-init terpasang, periksa file dulu:

cloud-init schema -c user-data.yaml

Perintah ini memvalidasi struktur cloud-config tanpa menjalankannya. Di server yang sudah jalan, sudo cloud-init schema --system memeriksa user-data yang benar-benar diterima server tersebut.

5. Buat VPS dan tempel user-data

Saat membuat VPS baru, tempel seluruh isi file ke kolom user-data di panel penyedia. Kalau penyedia menyediakan API, user-data biasanya dikirim sebagai salah satu parameter. Hindari menaruh kata sandi atau token rahasia di user-data, karena isinya bisa dibaca kembali dari dalam server.

Bagaimana memeriksa hasil dan mengulang proses?

Periksa status dan log

Setelah server menyala, login dengan user deploy, lalu jalankan:

cloud-init status --wait --long

Opsi --wait membuat perintah menunggu sampai cloud-init selesai, dan --long menampilkan rincian termasuk error yang bisa dipulihkan. Kalau ada yang gagal, baca dua log ini:

  • /var/log/cloud-init.log untuk jalannya setiap modul.
  • /var/log/cloud-init-output.log untuk keluaran perintah, misalnya hasil apt dan runcmd.

Jalankan ulang untuk pengujian

Saat menguji di VM uji, kamu bisa memaksa cloud-init berjalan lagi seperti boot pertama:

sudo cloud-init clean --logs --reboot

Jangan lakukan ini di server produksi tanpa pertimbangan, karena modul akan dijalankan ulang dan bisa menimpa konfigurasi.

Kapan cloud-init cukup, kapan perlu alat lain?

Cloud-init unggul untuk pekerjaan "hari pertama": menyiapkan server dari nol sampai siap dimasuki. Setelah server hidup, perubahan berikutnya lebih cocok dikelola dengan Ansible, karena Ansible bisa dijalankan berulang dan menjaga banyak server tetap seragam. Banyak tim memakai keduanya: cloud-init hanya memasang user dan kunci SSH, lalu Ansible mengambil alih.

ModulFungsiKapan berjalan
usersMembuat user, grup, kunci SSH, aturan sudoBoot pertama
ssh_pwauthMenyalakan atau mematikan login password SSHBoot pertama
package_update, packagesMemperbarui indeks paket dan memasang paketBoot pertama
write_filesMenulis file konfigurasiBoot pertama, sebelum runcmd
timezoneMengatur zona waktuBoot pertama
runcmdMenjalankan perintah shellSekali per instance, di akhir

Pertanyaan yang sering diajukan

Apakah cloud-init bisa dipakai di VPS yang sudah lama berjalan?

Bisa secara teknis, tapi tidak dianjurkan. Cloud-init dirancang untuk boot pertama. Untuk server yang sudah berjalan, gunakan skrip atau Ansible.

Kenapa user-data saya diabaikan?

Penyebab paling umum adalah baris pertama bukan #cloud-config, indentasi YAML salah, atau penyedia tidak meneruskan user-data. Cek dengan cloud-init status --long dan cloud-init schema --system.

Apakah cloud-init juga mengatur jaringan?

Ya, di banyak image cloud, cloud-init menulis konfigurasi jaringan seperti file Netplan. Kalau ingin mengatur jaringan sendiri, konfigurasi jaringan cloud-init bisa dimatikan.

Bisakah user-data berupa skrip shell biasa?

Bisa. Jika baris pertamanya #!/bin/bash, cloud-init menjalankannya sebagai skrip. Namun format #cloud-config lebih mudah dibaca dan divalidasi.

Checklist sebelum menekan tombol buat server

  • Baris pertama tepat #cloud-config.
  • Kunci SSH publik sudah benar dan login password dimatikan.
  • Grup sudo dan nama layanan SSH sesuai distro.
  • File lolos cloud-init schema.
  • Tidak ada kata sandi atau token rahasia di dalam user-data.

Sumber & referensi

Baca juga