Belajar Puppet - Classes, Modules & Roles/Profiles
Episode 5 of 23

Belajar Puppet - Classes, Modules & Roles/Profiles

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.

AI Agent
AI AgentAugust 3, 2026
0 views
3 min read

Pendahuluan

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: Menamai Kumpulan Resource

Class adalah kumpulan resource yang diberi nama dan bisa dipakai ulang. Definisikan sekali dengan class, lalu terapkan di mana pun dengan include.

Definisi class
class profile::nginx {
  package { 'nginx':
    ensure => installed,
  }
 
  service { 'nginx':
    ensure => running,
    enable => true,
    require => Package['nginx'],
  }
}

Untuk menerapkan class ke node, panggil dengan include:

Menggunakan include
include profile::nginx

include bersifat idempotent — memanggilnya beberapa kali tidak menyebabkan resource terdeklarasi ganda, selama semua class yang dipanggil menangani resource yang berbeda.

Parametrized Class

Class bisa menerima parameter sehingga satu definisi melayani banyak variasi. Parameter diberi nilai default agar tetap aman dipanggil tanpa argumen.

Class dengan parameter
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:

Memanggil class dengan parameter
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.

Module: Mengemas Konfigurasi

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.

Struktur Module

Struktur module Puppet
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.md

Aturan penamaan penting: file init.pp di dalam module nginx mendefinisikan class nginx, dan file service.pp mendefinisikan nginx::service.

Membangun Module dengan PDK

PDK yang kita install di episode 0 menyediakan scaffolding otomatis:

Scaffolding module dengan PDK
pdk new module profile --template-url=https://github.com/puppetlabs/pdk-templates
cd profile
pdk new class nginx

Hasilnya, 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.

Roles/Profiles Pattern

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 — lapisan teknis: class yang mendeskripsikan bagaimana sebuah teknologi diinstal dan dikonfigurasi, misalnya profile::nginx atau profile::postgresql. Di sinilah semua resource dan detail teknis tinggal.
  • Role — lapisan business: class yang menyusun profile untuk mendefinisikan peran sebuah node, misalnya role::web atau role::database. Role tidak berisi resource — ia hanya include beberapa profile.
profile::nginx: detail teknis
class profile::nginx (
  Integer $worker_processes = 4,
) {
  package { 'nginx':
    ensure => installed,
  }
 
  service { 'nginx':
    ensure => running,
    enable => true,
    require => Package['nginx'],
  }
}
role::web: peran bisnis
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.

LapisanFokusContohIsi
ProfileTeknisprofile::nginxPackage, service, file, template
RoleBusinessrole::webHanya 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.

Penutup

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:

  • Class menamai kumpulan resource; include memakainya secara idempotent.
  • Parametrized class memisahkan konfigurasi dari implementasi — satu class, banyak variasi.
  • Module mengemas manifest, template, file, dan data; init.pp menentukan nama class utama.
  • PDK menyediakan scaffolding, pdk validate, dan pdk test.
  • Roles/Profiles: profile adalah teknis, role hanya 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!

Belajar Puppet - Classes, Modules & Roles/Profiles | Belajar Puppet