Belajar Puppet - Custom Resources, Functions & Providers
Episode 16 of 23

Belajar Puppet - Custom Resources, Functions & Providers

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.

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

Pendahuluan

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 Types: Merangkum Resource

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.

manifests/define/user_account.pp
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:

Pemakaian defined type
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.

Custom Facts untuk Facter

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.

lib/facter/uptime_hours.rb
Facter.add('uptime_hours') do
  setcode do
    seconds = Facter.value('uptime_seconds').to_i
    (seconds / 3600.0).round(2)
  end
end

Untuk memvalidasi fakta baru di mesin lokal, jalankan facter uptime_hours dan lihat hasilnya. PDK juga menyediakan scaffold untuk fakta:

Buat skeleton custom fact dengan PDK
pdk new fact uptime_hours

Custom 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.

Functions dengan Modern Functions API

Function melakukan transformasi data saat catalog dikompilasi. Puppet modern merekomendasikan functions API dengan Puppet::Functions.create_function, bukan API lama berbasis Ruby module.

lib/puppet/functions/join_words.rb
Puppet::Functions.create_function(:join_words) do
  dispatch :join_words do
    param 'Array[String]', :words
  end
 
  def join_words(words)
    words.join(' ')
  end
end

Function yang baru didefinisikan bisa dipanggil langsung dari manifest:

Memanggil custom function
$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: Jembatan ke Platform

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.

ResourceProviderPlatform
packageaptDebian, Ubuntu
packageyum / dnfRHEL, CentOS, Fedora
packagegemRubyGems (semua platform)
servicesystemdDistribusi modern
serviceinit / serviceSysV init
useruseraddLinux 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.

Membuat Custom Provider

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.

lib/puppet/provider/package/custom_apt.rb
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
end

Warning

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.

Penutup

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:

  • Defined types merangkum beberapa resource menjadi unit pemakaian ulang dengan $name sebagai identitas.
  • Custom facts ditulis di lib/facter/ sebagai file Ruby dan diuji dengan facter.
  • Functions API modern memakai Puppet::Functions.create_function dengan deklarasi dispatch.
  • Provider membuat resource bekerja lintas platform; biarkan Puppet memilihnya otomatis.
  • Custom provider hanya untuk kebutuhan ekstrem dan sebaiknya mewarisi provider yang sudah ada.

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.

Belajar Puppet - Custom Resources, Functions & Providers | Belajar Puppet