Di episode ini kita menyatukan manifest dan data menjadi catalog: mengatur urutan resource dengan before, require, notify, subscribe, chaining panah, serta membedah error katalog yang paling umum.

Di episode 7 kalian sudah belajar memisahkan data ke Hiera dan mengambilnya dengan lookup. Kini tibalah saat penyatuan: manifest dan data dikompilasi oleh server menjadi satu dokumen bernama catalog. Di episode 8 kita mempelajari bagaimana catalog dibangun, bagaimana urutan resource dikendalikan dengan before, require, notify, subscribe, dan chaining panah, serta error katalog yang paling sering menggagalkan run.
Catalog adalah hasil akhir dari kompilasi — daftar resource yang sudah jadi dengan semua parameternya, siap dijalankan oleh agent. Di dalamnya tidak ada lagi if atau case, hanya resource konkret.
Siklus Puppet adalah: agent mengirim facts ke server, server mengkompilasi catalog dari manifest dan data Hiera, lalu mengirim catalog kembali ke agent. Agent membandingkan desired state di catalog dengan kondisi aktual node, lalu mengoreksi perbedaan.
puppet apply --noop manifests/site.pp
puppet apply --noop --verbose manifests/site.pppuppet apply --noop adalah cara tercepat menguji manifest di mesin lokal tanpa benar-benar mengubah sistem. Dengan --verbose, kalian melihat setiap resource yang akan dicek.
Karena catalog adalah data terkompilasi, urutan deklarasi di manifest tidak selalu sama dengan urutan eksekusi. Hubungan antar resource diatur secara eksplisit, dan itu adalah topik inti episode ini.
Puppet tidak menjamin urutan eksekusi antar resource tanpa relasi yang jelas. Metaparameter before dan require membangun dependensi maju dan mundur:
package { 'nginx':
ensure => installed,
before => File['/etc/nginx/conf.d/app.conf'],
}
file { '/etc/nginx/conf.d/app.conf':
ensure => file,
content => template('profile/web/nginx.conf.erb'),
require => Package['nginx'],
}
service { 'nginx':
ensure => running,
enable => true,
}before => File[...] pada package artinya: package harus selesai sebelum file dikelola. require => Package['nginx'] pada file menuliskan relasi yang sama dari arah sebaliknya — memakai keduanya untuk relasi yang sama adalah redundan.
Tip
Gunakan salah satu, bukan keduanya, untuk sebuah pasangan relasi. require lebih mudah dibaca karena dependensi dinyatakan di resource yang butuh resource lain. before praktis ketika ingin menyatakan urutan tanpa mengubah resource tujuan.
Relasi before dan require hanya mengatur urutan. Untuk memicu aksi tambahan — misalnya restart service setelah konfigurasi berubah — gunakan notify dan subscribe. Ini adalah relasi event-driven: jika resource yang di-notify berubah, resource penerima ikut bereaksi.
file { '/etc/nginx/conf.d/app.conf':
ensure => file,
content => template('profile/web/nginx.conf.erb'),
notify => Service['nginx'],
}
service { 'nginx':
ensure => running,
enable => true,
subscribe => File['/etc/nginx/conf.d/app.conf'],
}notify => Service['nginx'] pada file dan subscribe => File[...] pada service adalah dua arah dari relasi yang sama. Saat konten file berubah, subscribe membuat service menerima event dan restart. Jika konten tidak berubah, tidak ada restart — inilah yang membuat Puppet efisien.
Important
notify dan subscribe hanya memicu aksi ketika resource sumber benar-benar berubah state. Restart tidak terjadi pada run di mana tidak ada perubahan, sehingga idempotensi tetap terjaga.
Selain metaparameter, Puppet menyediakan chaining arrows untuk relasi berantai. Panah -> berarti "wajib selesai lebih dulu", sedangkan ~> berarti "notify ketika berubah":
package { 'nginx': ensure => installed }
-> file { '/etc/nginx/conf.d/app.conf':
ensure => file,
content => template('profile/web/nginx.conf.erb'),
}
~> service { 'nginx':
ensure => running,
enable => true,
}Rantai di atas setara dengan kombinasi require, before, notify, dan subscribe sebelumnya. Chaining sangat cocok untuk rangkaian langkah yang linear: pasang paket, tulis konfigurasi, lalu jalankan service.
| Bentuk relasi | Makna |
|---|---|
before dan require | Urutan eksekusi |
notify dan subscribe | Urutan plus event (restart/reload) |
-> | Singkatan relasi before/require |
~> | Singkatan relasi notify/subscribe |
Warning
Jangan membuat rantai yang berputar — misalnya A butuh B, B butuh C, dan C butuh A. Puppet akan mendeteksi dependency cycle saat kompilasi dan menolak catalog dengan error.
Saat agent meminta catalog, server menjalankan langkah berikut:
Semua nilai yang akan di-dekripsi dari hiera-eyaml didekripsi pada tahap 3 — agent hanya menerima hasil akhir, bukan kunci.
puppet catalog compile --environment production web01.example.com
puppet node clean web01.example.comNote
Karena server yang mengkompilasi, agent cukup pintar untuk menerapkan catalog tanpa perlu mengerti Ruby. Ini juga berarti error kompilasi muncul di sisi server dan tidak sampai mengubah node.
Kesalahan kompilasi membuat run gagal sebelum catalog terkirim. Yang paling sering ditemui:
Deklarasi duplikat — dua resource dengan tipe dan title yang sama dalam satu scope:
file { '/etc/motd':
ensure => file,
content => 'pesan pertama',
}
file { '/etc/motd':
ensure => present,
}Puppet mengidentifikasi resource lewat pasangan tipe dan title. Mendeklarasikan File['/etc/motd'] dua kali memunculkan error Duplicate declaration. Solusinya selalu menulis satu deklarasi, lalu merujuk resource itu lewat title di relasi.
Kelas tidak ditemukan — terjadi saat include memakai nama class yang tidak ada di modulepath, atau module belum diinstall:
puppet module install puppetlabs-nginx
puppet module listVariabel tidak terdefinisi — referensi ke variabel yang belum di-set menghasilkan Undefined variable. Cek penulisan key facts, misalnya $facts['os']['family'], sudah tepat.
Sintaks salah — titik koma yang hilang di akhir deklarasi resource, atau kurung yang tidak seimbang. Pesan error Puppet biasanya menyebut nomor baris tepat di manifest.
Tip
Biasakan menjalankan puppet parser validate site.pp dan puppet apply --noop sebelum push ke semua node. Error kompilasi jauh lebih murah diperbaiki saat masih di satu file.
Catalog adalah jembatan antara keinginan dan realisasi — dan relasi antar resource yang membuatnya deterministik.
before dan require mengatur urutan, notify dan subscribe menambahkan event seperti restart service.-> dan ~> menulis rangkaian relasi secara linear dan mudah dibaca.Di episode 9, kalian akan menambahkan otak di balik layar: PuppetDB, database yang menyimpan facts, catalog, dan report tiap run, membuka query lintas node, serta menyalurkan daya exported resources — resource yang lahir di satu node dan dikumpulkan di node lain untuk memandu monitoring dan load balancer. Sampai jumpa!