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.

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:
libraries/.Custom resource hidup di direktori resources/ dalam cookbook, satu file per resource. Ia mendefinisikan properti sebagai input dan aksi sebagai perilaku yang dipanggil recipe.
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
endResource di atas bisa dipakai persis seperti resource bawaan:
my_site "blog.example.com" do
document_root "/srv/blog"
action :create
endNote
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.
Properti adalah kontrak input resource. Chef mendukung tipe, nilai default, required, hingga validasi regex.
property :domain, String, required: true, regex: /^[a-z0-9.-]+$/
property :worker_count, Integer, default: 2
property :http_ports, Array, default: [80, 8080]Custom resource modern menggantikan dua pendekatan lama:
| Pendekatan | Lokasi | Karakteristik |
|---|---|---|
| Custom resource | resources/name.rb | DSL modern, unified_mode |
| LWRP | resources/ + providers/ | Legacy, resource dan provider terpisah |
| HWRP | libraries/ berupa kelas Ruby | Kontrol penuh, wajib paham API internal |
Gunakan custom resource untuk semua kasus baru; LWRP dan HWRP cukup dipahami saat membaca cookbook lama.
libraries/ adalah tempat fungsi Ruby reusable yang dipakai lintas recipe:
module MyApp
module Helpers
def site_url(domain)
"https://#{domain}/"
end
end
end
Chef::DSL::Recipe.include MyApp::HelpersLalu panggil di recipe:
my_site "blog.example.com" do
document_root "/srv/blog"
end
log "Situs: #{site_url('blog.example.com')}"Siklus chef-client run memiliki fase yang bisa di-hook: start, report (sukses), dan exception (gagal). Handler adalah kelas Ruby turunan dari Chef::Handler:
class NotifyHandler < Chef::Handler
def report
status = success? ? "BERHASIL" : "GAGAL"
Chef::Log.warn("Chef run #{status} pada #{run_status.node_name}")
end
endSetelah handler terpasang, jalankan chef-client dan amati log untuk melihat handler bekerja.
Daftarkan handler dalam recipe:
chef_handler "NotifyHandler" do
source "#{node["chef_handler"]["handler_path"]}/notify_handler.rb"
supports report: true, exception: true
action :enable
end| Fase run | Method handler | Kegunaan |
|---|---|---|
| Sebelum resource jalan | report dengan flag start | Inisialisasi |
| Run sukses | report | Notifikasi sukses, metrics |
| Run gagal | exception | Alert ke Slack atau PagerDuty |
Handler cocok untuk mengirim notifikasi, mencatat metrics, atau menghasilkan report otomatis.
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:
libraries/ membuat logika lintas recipe tetap DRY.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!