Belajar Chef - Custom Resources & Libraries
Series/Belajar Chef/Episode 16
Episode 16 of 23

Belajar Chef - Custom Resources & Libraries

Memperluas Chef: membuat custom resource dengan DSL dan properti, memahami perbedaan LWRP dan HWRP, menulis helper Ruby di libraries, serta memasang exception dan report handler pada siklus chef-client run.

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

Pendahuluan

Di episode 15 kalian membangun kebiasaan penulisan cookbook yang bersih dan teruji. Semakin dalam mengotomasi, semakin sering kalian menemukan pola yang diulang-ulang — dan di situlah waktunya mengabstraksi. Di episode 16 ini kita membahas Custom Resources & Libraries: membuat resource sendiri dengan DSL custom resource, mengenal LWRP dan HWRP, plus menulis helper Ruby dan handler yang meng-hook siklus chef-client run.

Tujuan episode ini:

  • Membuat custom resource dengan properti dan aksi.
  • Memahami perbedaan custom resource, LWRP, dan HWRP.
  • Menulis helper Ruby di direktori libraries/.
  • Memasang report dan exception handler.

Custom Resource

Custom resource hidup di direktori resources/ dalam cookbook, satu file per resource. Ia mendefinisikan properti sebagai input dan aksi sebagai perilaku yang dipanggil recipe.

resources/my_site.rb
unified_mode true
 
property :domain, String, required: true
property :document_root, String, default: "/var/www/html"
property :allow_upload, [true, false], default: false
 
action :create do
  directory new_resource.document_root do
    recursive true
  end
  template File.join(new_resource.document_root, "index.html") do
    source "index.html.erb"
    variables domain: new_resource.domain
  end
end
 
action :delete do
  directory new_resource.document_root do
    recursive true
    action :delete
  end
end

Resource di atas bisa dipakai persis seperti resource bawaan:

recipe/default.rb
my_site "blog.example.com" do
  document_root "/srv/blog"
  action :create
end

Note

new_resource memberi akses ke nilai properti yang sedang diproses. Selalu akses properti lewat new_resource, bukan node, supaya nilai default dan nilai per-lokasi dipakai dengan benar.

Custom Property

Properti adalah kontrak input resource. Chef mendukung tipe, nilai default, required, hingga validasi regex.

Property dengan validasi
property :domain, String, required: true, regex: /^[a-z0-9.-]+$/
property :worker_count, Integer, default: 2
property :http_ports, Array, default: [80, 8080]

LWRP vs HWRP

Custom resource modern menggantikan dua pendekatan lama:

PendekatanLokasiKarakteristik
Custom resourceresources/name.rbDSL modern, unified_mode
LWRPresources/ + providers/Legacy, resource dan provider terpisah
HWRPlibraries/ berupa kelas RubyKontrol penuh, wajib paham API internal

Gunakan custom resource untuk semua kasus baru; LWRP dan HWRP cukup dipahami saat membaca cookbook lama.

Helper Ruby di libraries/

libraries/ adalah tempat fungsi Ruby reusable yang dipakai lintas recipe:

libraries/helpers.rb
module MyApp
  module Helpers
    def site_url(domain)
      "https://#{domain}/"
    end
  end
end
 
Chef::DSL::Recipe.include MyApp::Helpers

Lalu panggil di recipe:

Menggunakan helper
my_site "blog.example.com" do
  document_root "/srv/blog"
end
 
log "Situs: #{site_url('blog.example.com')}"

Handler dan Siklus Run

Siklus chef-client run memiliki fase yang bisa di-hook: start, report (sukses), dan exception (gagal). Handler adalah kelas Ruby turunan dari Chef::Handler:

libraries/notify_handler.rb
class NotifyHandler < Chef::Handler
  def report
    status = success? ? "BERHASIL" : "GAGAL"
    Chef::Log.warn("Chef run #{status} pada #{run_status.node_name}")
  end
end

Setelah handler terpasang, jalankan chef-client dan amati log untuk melihat handler bekerja.

Daftarkan handler dalam recipe:

recipe/handlers.rb
chef_handler "NotifyHandler" do
  source "#{node["chef_handler"]["handler_path"]}/notify_handler.rb"
  supports report: true, exception: true
  action :enable
end
Fase runMethod handlerKegunaan
Sebelum resource jalanreport dengan flag startInisialisasi
Run suksesreportNotifikasi sukses, metrics
Run gagalexceptionAlert ke Slack atau PagerDuty

Handler cocok untuk mengirim notifikasi, mencatat metrics, atau menghasilkan report otomatis.

Penutup

Pada episode 16 ini kalian melampaui resource bawaan: membuat custom resource dengan properti dan aksi, memahami perbedaan dengan LWRP dan HWRP, menulis helper Ruby di libraries/, serta memasang report dan exception handler yang meng-hook siklus chef-client run.

Inti yang harus dibawa pulang:

  • Custom resource adalah abstraksi pola yang diulang-ulang.
  • Properti membentuk kontrak input yang aman dan tervalidasi.
  • LWRP dan HWRP adalah pendekatan legacy — pahami, jangan mulai baru dengannya.
  • Helper di libraries/ membuat logika lintas recipe tetap DRY.
  • Handler menghubungkan run ke notifikasi, metrics, dan alerting.

Di episode 17 berikutnya kita pindah fokus dari mengelola server ke mengemas aplikasi: Chef Habitat — membangun artifact dengan hab pkg build, menulis plan, menjalankan supervisor, dan menggabungkan aplikasi terkemas Habitat dengan server yang dikelola Chef. Sampai jumpa di episode 17!

Belajar Chef - Custom Resources & Libraries | Belajar Chef