Mengorganisir manifest ke level berikutnya: class yang bisa dipakai ulang, parametrized class, struktur module lengkap, scaffolding dengan PDK, dan pola Roles/Profiles untuk menjaga hierarki class tetap bersih.

Di episode 4 sebelumnya kalian sudah menulis manifest dan mengenal resource type — package, service, file, exec, user, group, dan cron — serta mengujinya dengan puppet apply. Masalahnya, manifest tunggal tidak akan bertahan saat konfigurasi tumbuh: kalian akan mengulang resource yang sama di banyak file dan kesulitan menerapkannya ke banyak node. Episode 5 menjawab masalah ini dengan tiga konsep: class untuk mengelompokkan resource, module untuk mengemasnya, dan Roles/Profiles pattern untuk menjaga arsitektur tetap bersih.
Class adalah kumpulan resource yang diberi nama dan bisa dipakai ulang. Definisikan sekali dengan class, lalu terapkan di mana pun dengan include.
class profile::nginx {
package { 'nginx':
ensure => installed,
}
service { 'nginx':
ensure => running,
enable => true,
require => Package['nginx'],
}
}Untuk menerapkan class ke node, panggil dengan include:
include profile::nginxinclude bersifat idempotent — memanggilnya beberapa kali tidak menyebabkan resource terdeklarasi ganda, selama semua class yang dipanggil menangani resource yang berbeda.
Class bisa menerima parameter sehingga satu definisi melayani banyak variasi. Parameter diberi nilai default agar tetap aman dipanggil tanpa argumen.
class profile::nginx (
String $listen_port = 80,
Boolean $enable_ssl = false,
) {
package { 'nginx':
ensure => installed,
}
service { 'nginx':
ensure => running,
enable => true,
require => Package['nginx'],
}
file { '/etc/nginx/conf.d/server.conf':
ensure => file,
content => "listen ${listen_port};\nssl ${enable_ssl};\n",
require => Package['nginx'],
notify => Service['nginx'],
}
}Saat memakai, panggil dengan nilai yang diinginkan:
class { 'profile::nginx':
listen_port => 8443,
enable_ssl => true,
}Note
Ada dua cara memanggil class: include dan resource-like declaration class { 'nama': }. include lebih disarankan karena aman dipanggil berulang dan fleksibel dengan data Hiera — kita akan melihatnya saat data masuk ke gambar di episode tentang Hiera.
Manifest yang berserakan akan sulit dikelola. Puppet menyelesaikannya dengan module — paket terstruktur yang berisi manifest, template, file, dan data. Module adalah unit distribusi dan unit versioning Puppet; kalian bisa mengunduhnya dari Puppet Forge atau menulis sendiri.
nginx/
├── manifests/
│ ├── init.pp # class nginx
│ └── service.pp # class nginx::service
├── templates/
│ └── server.conf.epp # template konfigurasi
├── files/
│ └── index.html # file statis
├── hieradata/
│ └── common.yaml # data Hiera
├── examples/
│ ├── init.pp
├── spec/
│ └── ... # unit test
├── metadata.json # deskripsi & dependency
└── README.mdAturan penamaan penting: file init.pp di dalam module nginx mendefinisikan class nginx, dan file service.pp mendefinisikan nginx::service.
PDK yang kita install di episode 0 menyediakan scaffolding otomatis:
pdk new module profile --template-url=https://github.com/puppetlabs/pdk-templates
cd profile
pdk new class nginxHasilnya, file manifests/init.pp dan manifests/nginx.pp siap diisi. PDK juga menyediakan pdk validate dan pdk test untuk memastikan kode valid dan lolos unit test.
Tip
Jalankan pdk validate setiap kali selesai menulis manifest. Validator akan menangkap kesalahan sintaks dan style sebelum masuk ke server — jauh lebih murah daripada memperbaiki setelah agent run gagal.
Saat infrastruktur tumbuh, hierarki class mudah berantakan — class menyatu dengan data bisnis, dan mengubah satu bagian berisiko merusak bagian lain. Roles/Profiles pattern memecah lapisan itu menjadi dua:
profile::nginx atau profile::postgresql. Di sinilah semua resource dan detail teknis tinggal.role::web atau role::database. Role tidak berisi resource — ia hanya include beberapa profile.class profile::nginx (
Integer $worker_processes = 4,
) {
package { 'nginx':
ensure => installed,
}
service { 'nginx':
ensure => running,
enable => true,
require => Package['nginx'],
}
}class role::web {
include profile::base
include profile::nginx
include profile::firewall
}Perhatikan: role::web tidak tahu bagaimana nginx diinstall — ia hanya tahu bahwa node web membutuhkan profile nginx, base, dan firewall. Kalian bisa menukar profile::nginx dengan implementasi lain tanpa mengubah role.
| Lapisan | Fokus | Contoh | Isi |
|---|---|---|---|
| Profile | Teknis | profile::nginx | Package, service, file, template |
| Role | Business | role::web | Hanya include profile |
Important
Aturan emas Roles/Profiles: role tidak boleh berisi resource langsung — hanya include profile. Jika kalian menemukan resource di dalam role, itu tanda lapisan sedang bocor. Pisahkan segera, karena menata ulang nanti jauh lebih mahal daripada sekarang.
Pola ini didukung penuh oleh node classification: node ditugaskan satu role, dan role itu membawa semua profile yang dibutuhkan. Kita akan menghubungkan semuanya dengan Hiera dan node classification di episode-episode berikutnya.
Pada episode 5 ini kalian naik level dari manifest tunggal ke arsitektur module: mendefinisikan class yang bisa dipakai ulang, menulis parametrized class untuk fleksibilitas, memahami struktur module lengkap (manifests, templates, files, hieradata), membangun module lewat PDK, dan menerapkan Roles/Profiles pattern yang memisahkan lapisan teknis dari lapisan bisnis.
Inti yang harus dibawa pulang:
init.pp menentukan nama class utama.pdk validate, dan pdk test.include profile — jaga lapisan tetap bersih.Di episode 6 berikutnya kita akan membahas Hiera: data-driven configuration — memisahkan data dari logic dengan basis data hierarkis, memahami struktur hiera.yaml, lookup otomatis parameter class, dan penerapan praktis untuk environment dev, staging, dan production. Sampai jumpa di episode berikutnya!