Fondasi bahasa Puppet: struktur manifest, anatomi resource type dengan title, parameter, dan properties, tujuh resource type dasar, konsep deklaratif dan idempoten, serta pengujian lokal dengan puppet apply.

Di episode 3 sebelumnya kalian berhasil membangun lab Puppet — server dan agent terhubung lewat sertifikat SSL, dan agent run pertama berjalan mulus. Namun catalog yang diterapkan masih kosong, karena kalian belum menulis apa pun. Episode 4 adalah saatnya mengisi catalog itu: kita akan belajar menulis manifest dengan resource type — fondasi bahasa Puppet yang akan kalian pakai setiap hari.
Manifest adalah file Puppet dengan ekstensi .pp yang berisi kode konfigurasi. Di sinilah kalian mendeklarasikan resource. Manifest bisa diterapkan langsung ke mesin lokal dengan puppet apply, atau dikompilasi server menjadi catalog untuk node jarak jauh.
Sebuah manifest berisi satu atau lebih resource declaration. Ini contoh manifest minimal:
package { 'curl':
ensure => installed,
}
file { '/etc/motd':
ensure => file,
content => 'Welcome to my managed server',
}Perhatikan polanya: kalian menyatakan keadaan akhir, bukan langkah. Ini perbedaan fundamental dari scripting.
Setiap resource declaration memiliki tiga bagian:
package, service, atau file.package { 'nginx':
ensure => '1.18.0',
}Pada contoh di atas, package adalah type, nginx adalah title, dan ensure => '1.18.0' adalah parameter. Ada parameter yang disebut property — parameter yang menggambarkan keadaan yang diinginkan dan akan diperiksa oleh agent, misalnya ensure, content, mode. Parameter non-property hanya mengatur cara resource dibuat, misalnya before, require, atau provider.
| Bagian | Contoh | Peran |
|---|---|---|
| Type | package | Abstraksi element sistem |
| Title | 'nginx' | Identitas unik resource |
| Property | ensure => running | Keadaan yang diperiksa & dikonvergensi |
| Parameter | require => Package['nginx'] | Mengatur urutan dan perilaku |
Tujuh resource type berikut adalah yang paling sering dipakai:
Mengelola paket melalui package manager (apt, dnf, yum).
package { 'nginx':
ensure => installed,
}Nilai ensure bisa berupa installed/present (terinstall), absent (terhapus), latest (selalu versi terbaru), atau nomor versi spesifik.
Mengelola service systemd (atau init).
service { 'nginx':
ensure => running,
enable => true,
}ensure => running memastikan service menyala; enable => true memastikan service ikut menyala saat boot.
Mengelola file dan direktori — konten, kepemilikan, dan permission.
file { '/etc/nginx/nginx.conf':
ensure => file,
owner => 'root',
group => 'root',
mode => '0644',
source => 'puppet:///modules/nginx/nginx.conf',
}Menjalankan perintah eksternal — untuk hal yang tidak bisa ditangani resource lain. Perhatikan unless agar idempotent.
exec { 'download-release':
command => 'wget -O /tmp/app.tar.gz https://example.com/app.tar.gz',
path => ['/usr/bin', '/bin'],
unless => 'test -f /tmp/app.tar.gz',
}Mengelola akun sistem dan grup.
group { 'app':
ensure => present,
}
user { 'app':
ensure => present,
gid => 'app',
shell => '/usr/sbin/nologin',
managehome => false,
}Mengelola cron job.
cron { 'backup-daily':
command => '/usr/local/bin/backup.sh',
minute => 0,
hour => 2,
}Note
Ada sekitar dua lusin resource type bawaan Puppet — termasuk mount, exec, host, selinux, hingga notify. Kalian bisa melihat dokumentasi lengkap setiap type dengan perintah puppet describe package atau puppet describe file.
Sifat deklaratif Puppet bermakna: kalian mendeklarasikan hasil, dan Puppet yang menentukan cara mencapainya. Dari sifat ini lahir idempotensi — menjalankan manifest berkali-kali menghasilkan keadaan akhir yang sama, tanpa efek samping pengulangan.
puppet apply nginx.pp
puppet apply nginx.pp
puppet apply nginx.ppRun pertama akan membuat perubahan; run kedua dan ketiga hanya memverifikasi bahwa keadaan sudah sesuai — itulah alasan mengapa agent aman berjalan terjadwal setiap 30 menit.
Important
Idempotensi adalah kontrak antara penulis manifest dan sistem. Resource exec adalah pengecualian yang paling sering melanggar kontrak ini — tanpa guard seperti unless atau onlyif, exec akan menjalankan perintahnya setiap agent run. Gunakan exec hanya jika resource lain tidak bisa, dan selalu beri guard.
Sebelum resource dikirim ke node lain, uji dulu secara lokal. puppet apply menerapkan manifest langsung ke mesin tempat kalian berada — cara tercepat memvalidasi sintaks dan perilaku.
package { 'nginx':
ensure => installed,
}
service { 'nginx':
ensure => running,
enable => true,
require => Package['nginx'],
}sudo puppet apply nginx.ppPerhatikan hubungan require => Package['nginx'] pada service — parameter ini memastikan paket terinstall dulu sebelum service dikelola. Ini contoh ordering yang akan kita perdalam saat membahas class dan module.
Tip
Gunakan puppet apply --noop untuk dry run: Puppet akan menunjukkan perubahan yang akan dilakukan tanpa benar-benar menerapkannya. Kombinasi --noop dan --verbose sangat berguna untuk memeriksa apa yang akan berubah sebelum mengeksekusi.
Pada episode 4 ini kalian sudah menguasai fondasi bahasa Puppet: memahami struktur manifest, membedah anatomi resource declaration dengan type, title, dan parameter, mengenal tujuh resource type dasar (package, service, file, exec, user, group, cron), serta menguji manifest secara lokal dengan puppet apply.
Inti yang harus dibawa pulang:
.pp adalah rumah konfigurasi; resource declaration adalah isinya.unless/onlyif) agar tidak melanggar idempotensi.puppet apply --noop adalah dry run favorit sebelum menerapkan.Di episode 5 berikutnya kita akan menaikkan level: classes, modules & roles/profiles — mengorganisir manifest ke dalam class yang bisa dipakai ulang, memahami struktur module lengkap, dan menerapkan pola Roles/Profiles yang menjadi standar industri untuk menjaga hierarki class tetap bersih. Persiapkan PDK kalian, karena episode berikutnya sarat hands-on!