Perluas kemampuan Puppet di luar resource bawaan: definisikan defined type, buat custom facts untuk Facter, dan tulis functions dengan modern functions API. Pahami juga cara kerja provider per platform seperti apt, yum, dan systemd, serta cara membuat custom provider.

Di episode 15 kalian sudah belajar best practice penulisan manifest, termasuk idempotency dan pola roles dan profiles. Semua itu bekerja di atas resource bawaan Puppet seperti package, service, dan file. Namun terkadang kebutuhan lebih spesifik: memodelkan entitas bisnis yang berulang, menambahkan fakta khusus sistem kita, atau menghitung nilai saat catalog dikompilasi.
Puppet menyediakan tiga lapisan ekstensibilitas untuk menjawab kebutuhan tersebut: defined types untuk merangkum beberapa resource menjadi satu unit pemakaian ulang, custom facts untuk menambah data yang diambil Facter, dan functions untuk logika transformasi data di sisi catalog. Di balik semua resource, ada providers yang menentukan bagaimana resource diterapkan pada platform yang berbeda.
Pada episode ini kita akan membahas pembuatan defined type, custom facts, functions dengan modern functions API, perbandingan provider antar platform seperti apt, yum, dan systemd, serta prinsip pembuatan custom provider.
Defined type adalah kumpulan resource yang dibungkus dalam satu unit bernama. Berbeda dengan class, defined type bisa dipakai berkali-kali dengan nama berbeda dalam satu catalog.
define user_account (
String $ensure = 'present',
Array[String] $groups = [],
) {
user { $name:
ensure => $ensure,
groups => $groups,
membership => 'minimum',
}
file { "/home/${name}":
ensure => directory,
owner => $name,
group => $name,
}
}Nama defined type ditulis tanpa tanda titik dua karena didefinisikan di file manifests/define/user_account.pp. Untuk memakainya:
user_account { 'deploy':
groups => ['www-data', 'docker'],
}
user_account { 'ci-runner':
ensure => absent,
}Tip
Nama resource (deploy, ci-runner) tersedia di dalam definisi sebagai variabel $name dan otomatis dipakai untuk title resource internal. Pastikan nama unik agar tidak terjadi duplikasi resource di seluruh catalog.
Facter menyediakan fakta bawaan seperti os, networking, dan memory. Ketika kita butuh data khusus, kita menambahkan custom fact sebagai file Ruby di lib/facter/ dalam module.
Facter.add('uptime_hours') do
setcode do
seconds = Facter.value('uptime_seconds').to_i
(seconds / 3600.0).round(2)
end
endUntuk memvalidasi fakta baru di mesin lokal, jalankan facter uptime_hours dan lihat hasilnya. PDK juga menyediakan scaffold untuk fakta:
pdk new fact uptime_hoursCustom fact kemudian bisa dipakai di manifest seperti fakta bawaan, misalnya $facts['uptime_hours'], dan bisa menjadi dasar rule classification pada node classifier yang kita bahas di episode 13.
Function melakukan transformasi data saat catalog dikompilasi. Puppet modern merekomendasikan functions API dengan Puppet::Functions.create_function, bukan API lama berbasis Ruby module.
Puppet::Functions.create_function(:join_words) do
dispatch :join_words do
param 'Array[String]', :words
end
def join_words(words)
words.join(' ')
end
endFunction yang baru didefinisikan bisa dipanggil langsung dari manifest:
$words = ['selamat', 'datang', 'di', 'puppet']
$sentence = join_words($words)
notify { $sentence: }Selain membuat function sendiri, Puppet menyediakan banyak function bawaan dari stdlib seperti join, split, flatten, dan map. Gunakan function bawaan dulu sebelum menulis function custom.
Provider adalah mesin di balik setiap resource Puppet. Resource package memakai provider apt di Debian/Ubuntu dan provider yum atau dnf di RedHat. Resource service memakai provider systemd, init, atau service sesuai init system.
| Resource | Provider | Platform |
|---|---|---|
package | apt | Debian, Ubuntu |
package | yum / dnf | RHEL, CentOS, Fedora |
package | gem | RubyGems (semua platform) |
service | systemd | Distribusi modern |
service | init / service | SysV init |
user | useradd | Linux umum |
Puppet memilih provider secara otomatis berdasarkan fakta platform dan konfigurasi. Pemilihan ini bisa dipengaruhi dengan parameter provider pada resource, misalnya provider => 'systemd'.
Important
Jangan meng-hardcode provider kecuali benar-benar perlu. Membiarkan Puppet memilih provider membuat manifest portabel lintas OS. Memaksa provider apt di sistem RHEL justru membuat run gagal.
Provider dibuat sebagai file Ruby di lib/puppet/provider/<type>/<provider_name>.rb dan lib/puppet/type/<type>.rb untuk resource type-nya. Provider biasa memakai directive confine untuk membatasi platform yang didukung.
require 'puppet/provider/package'
Puppet::Type.type(:package).provide(:custom_apt,
parent: Puppet::Provider::Package::Apt,
source: :apt) do
confine operatingsystem: :debian
commands aptget: 'apt-get'
def install
aptget('-y', 'install', @resource[:name])
end
def query
# kembalikan hash status paket, atau nil jika tidak terinstall
end
endWarning
Membuat custom provider adalah pekerjaan tingkat lanjut dan sebaiknya dihindari jika solusi dengan resource bawaan atau module Forge sudah memadai. Provider yang salah berpotensi merusak sistem. Jika memungkinkan, turunkan dari provider yang sudah ada (seperti contoh parent: di atas) agar perilaku idempotent-nya terwarisi.
Lokasi file menentukan scope pemakaian. Provider yang ditaruh di lib/ module hanya tersedia saat module itu dipakai, sedangkan provider di direktori environment modules/ berlaku untuk seluruh environment tersebut.
Pada episode 16 ini kalian sudah memahami tiga lapis ekstensibilitas Puppet: defined types untuk merangkum resource yang dipakai berulang, custom facts untuk menambah data Facter, dan functions dengan modern functions API untuk transformasi data saat kompilasi catalog. Kalian juga memahami peran provider sebagai jembatan resource ke platform, dari apt, yum, hingga systemd, serta prinsip pembuatan custom provider.
Inti yang harus dibawa pulang:
$name sebagai identitas.lib/facter/ sebagai file Ruby dan diuji dengan facter.Puppet::Functions.create_function dengan deklarasi dispatch.Saat jumlah node sudah ratusan, data yang dikumpulkan Puppet bisa sangat berharga. Di episode 17 kita akan membahas Belajar Puppet - PuppetDB Query & Exported Resources Lanjutan: query API untuk fakta, reports, dan resources, konsumsi data dari external tools, serta pola exported resources untuk inventory, monitoring, dan konfigurasi jaringan lintas node.