Belajar Chef - Best Practice
Series/Belajar Chef/Episode 15
Episode 15 of 23

Belajar Chef - Best Practice

Menulis cookbook yang benar: idempotency ketat, desain resource deklaratif, dependency dan versioning lewat metadata, modularity, serta test-driven infrastructure dengan InSpec dan Test Kitchen.

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

Pendahuluan

Di episode 14 kalian mengotomasi bootstrap node di cloud dengan Terraform dan cloud-init. Semakin banyak otomasi, semakin besar tuntutan terhadap kualitas cookbook — cookbook yang asal-asalan akan merusak environment dalam sekali run. Di episode 15 ini kita membahas best practice: mendesain cookbook yang idempoten, modular, dan teruji, plus test-driven infrastructure dengan InSpec dan Test Kitchen.

Tujuan episode ini:

  • Menerapkan idempotency ketat dalam resource.
  • Mengelola dependency dan versioning lewat metadata.
  • Memisahkan cookbook menjadi modul yang fokus.
  • Menulis test InSpec dan menjalankannya di Test Kitchen.

Idempotency Ketat

Idempotency adalah kemampuan menjalankan ulang tanpa mengubah hasil akhir. Resource seperti package, template, dan service sudah idempoten secara desain — mereka hanya bertindak jika keadaan menyimpang dari desired state. Yang sering bermasalah adalah execute: ia selalu jalan setiap run kecuali kita beri guard.

execute dengan guard not_if
execute "initialize app database" do
  command "myapp-db init --force"
  not_if "myapp-db status"
end

Important

Aturan sederhana: setiap execute tanpa guard dianggap bug. Selalu sediakan not_if atau only_if yang mendeteksi apakah pekerjaan sudah selesai.

Resource Design yang Benar

  • Deklaratif, bukan imperatif — nyatakan hasil akhir, jangan langkah demi langkah.
  • Pakai resource bawaan — instal paket dengan package, bukan execute apt-get install.
  • Kelola konten dengan template, cookbook_file, atau file — bukan script yang menulis file secara manual.
TujuanResource yang benarResource yang salah
Instal paketpackageexecute "apt-get install"
Tulis filetemplate atau fileexecute "echo > file"
Jalankan layananserviceexecute "systemctl restart"

Dependency dan Metadata

Semua ketergantungan cookbook dideklarasikan di metadata.rb dengan batas versi. Ini memungkinkan resolver (Berkshelf atau Policyfile) menghitung grafik dependency secara deterministik.

metadata.rb
name "my_app"
version "1.2.0"
depends "apt", ">= 6.0.0"
depends "chef-vault", ">= 3.0.0"

Versioning dan Modularity

Cookbook diberi versi semver di metadata.rb. Rilis menaikkan versi, dipin di lockfile seperti Policyfile.lock.json, dan didistribusikan lewat Supermarket pribadi.

Modularity berarti memecah tanggung jawab:

  • Cookbook library — resource reusable tanpa logika bisnis.
  • Cookbook service — satu layanan per cookbook.
  • Wrapper cookbook — menyesuaikan cookbook upstream tanpa mengubahnya.
Wrapper cookbook
include_recipe "nginx::default"
node.override["nginx"]["worker_processes"] = 8

Test-Driven Infrastructure

Prinsip TDD: tulis ekspektasi dulu, lalu bangun konfigurasi agar ekspektasi itu terpenuhi. Di Chef, pasangannya adalah InSpec untuk assertion dan Test Kitchen untuk menjalankan cookbook di environment sementara. Test konvensional diletakkan di test/integration/ dalam cookbook:

test/integration/default/default_test.rb
control "nginx_is_installed" do
  describe package("nginx") do
    it { should be_installed }
  end
end
 
control "nginx_is_running" do
  describe service("nginx") do
    it { should be_running }
    it { should be_enabled }
  end
end

Siklus pengembangan dengan Kitchen:

  1. Tulis test InSpec.
  2. kitchen converge — terapkan cookbook ke VM atau kontainer.
  3. kitchen verify — jalankan test; seharusnya gagal dulu.
  4. Perbaiki cookbook, ulangi converge dan verify sampai hijau.
  5. kitchen destroy — bersihkan environment.

Tip

Jalankan kitchen test untuk memicu seluruh siklus create, converge, verify, destroy dalam satu perintah — pasangan yang sempurna untuk pipeline CI.

Penutup

Pada episode 15 ini kalian mempelajari best practice penulisan cookbook: idempotency ketat dengan guard, desain resource yang deklaratif, dependency dan versioning lewat metadata, modularity lewat pemisahan cookbook, serta siklus test-driven infrastructure dengan InSpec dan Test Kitchen.

Inti yang harus dibawa pulang:

  • Idempotency adalah hukum pertamaexecute wajib ber-guard.
  • Resource deklaratif lebih aman daripada script imperatif.
  • Metadata berisi dependency dengan batas versi yang jelas.
  • Modular — cookbook kecil yang fokus lebih mudah diuji.
  • TDD dengan InSpec + Test Kitchen memvalidasi perubahan sebelum menyentuh environment nyata.

Di episode 16 berikutnya kita melampaui resource bawaan: Custom Resources & Libraries — membuat resource sendiri dengan DSL custom resource, memahami LWRP dan HWRP, serta menulis helper dan handler yang meng-hook siklus chef-client run. Sampai jumpa di episode 16!

Belajar Chef - Best Practice | Belajar Chef