Pelajari struktur lengkap sebuah cookbook beserta peran setiap direktori seperti recipes, attributes, templates, files, libraries, dan metadata.rb, serta cara menyusun run_list per node, roles, dan environments untuk mengelompokkan node secara konsisten.

Di episode 5 kalian sudah mengenal attributes dan Ohai, dua mekanisme yang membuat cookbook bisa menyesuaikan diri dengan kondisi tiap node. Kalian tahu cara membaca nilai seperti node['hostname'] dan node['platform'], serta memahami bagaimana atribut mengalir dari berbagai level sampai menghasilkan nilai akhir saat chef-client berjalan.
Mungkin kalian bertanya: kalau sudah punya banyak recipe, di mana seharusnya recipe itu disimpan? Bagaimana caranya server tahu recipe mana yang harus dijalankan untuk node tertentu? Jawabannya ada di cookbook, run_list, serta mekanisme pengelompokan berupa roles dan environments.
Episode 6 ini akan membedah struktur direktori cookbook, mulai dari recipes/ hingga metadata.rb, lalu menjelaskan bagaimana run list menentukan urutan eksekusi recipe per node. Di akhir episode kalian akan memahami cara mengelompokkan node dengan roles dan environments supaya satu konfigurasi bisa dipakai banyak server tanpa menulis ulang.
Cookbook adalah unit distribusi terkecil di Chef. Sebuah cookbook bisa berisi recipe, atribut default, template, file statis, helper Ruby, dan metadata yang mendeskripsikan dependensinya. Ketika kalian menjalankan chef generate cookbook web_server, Chef Workstation akan membuat struktur berikut:
web_server/
├── attributes/ # atribut default per cookbook
├── files/ # file statis yang disalin apa adanya
├── libraries/ # helper Ruby (kode custom)
├── metadata.rb # deskripsi cookbook & dependensi
├── recipes/ # recipe utama cookbook
├── templates/ # file konfigurasi berbasis ERB
└── TESTING.md # dokumentasi pengujianBerikut peran setiap direktori:
recipes/ — hati dari cookbook. Setiap file Ruby mendeklarasikan resource yang ingin dijamin state-nya. default.rb adalah entry point yang dijalankan ketika cookbook dipanggil tanpa nama recipe.attributes/ — atribut default yang disimpan terpusat per cookbook. Nilai di sini dibaca lewat pola default['web_server']['port'] dan bisa di-override oleh role, environment, maupun atribut node.templates/ — template ERB yang dirender dengan variabel node, cocok untuk file konfigurasi yang nilainya bergantung pada mesin.files/ — file statis seperti binary, sertifikat, atau konfigurasi tetap yang disalin apa adanya tanpa diproses.libraries/ — kode Ruby custom seperti class, module, atau helper method yang bisa dipakai ulang di seluruh recipe.metadata.rb — kartu identitas cookbook: nama, versi, maintainer, dependensi, dan platform yang didukung.File metadata.rb adalah bagian yang paling sering diabaikan pemula, padahal chef-server menggunakannya untuk menyelesaikan dependensi. Contoh tipikalnya:
name 'web_server'
maintainer 'Arman Dwi Pangestu'
maintainer_email 'devnull@example.com'
license 'Apache-2.0'
description 'Mengelola konfigurasi web server'
version '0.1.0'
depends 'nginx', '>= 1.18'
supports 'ubuntu', '>= 22.04'Deklarasi depends memberitahu server bahwa cookbook ini butuh cookbook nginx versi tertentu. Tanpa metadata yang benar, upload cookbook di episode 8 bisa gagal karena dependensi tidak terpenuhi.
Note
Semua direktori di atas bersifat opsional. Cookbook terkecil hanya butuh metadata.rb dan satu file di recipes/. Direktori lain dihasilkan chef generate cookbook supaya pola kerjanya konsisten, tetapi boleh dihapus jika tidak dipakai.
Run list adalah daftar berurutan dari recipe atau role yang akan dijalankan chef-client pada sebuah node. Urutan eksekusinya penting: resource pada recipe pertama dieksekusi lebih dulu, lalu dilanjutkan ke berikutnya.
Untuk menetapkan run list sebuah node dari workstation, gunakan knife node run_list set:
knife node run_list set web01 'recipe[apt],recipe[web_server]'Setelahnya, kalian bisa memverifikasi isi run list node tersebut:
knife node show web01 -a run_listNotasi recipe dalam run list mengikuti dua bentuk: recipe[web_server] berarti memanggil recipes/default.rb, sedangkan recipe[web_server::nginx] berarti memanggil recipes/nginx.rb.
Tip
Simbol recipe[] dan role[] adalah contoh inline hint yang juga dipakai di dalam dokumentasi Chef: recipe[web_server::nginx] mereferensikan file recipes/nginx.rb, sedangkan recipe[web_server] sama dengan recipes/default.rb. Nama file harus persis cocok dengan bagian setelah dua titik dua.
Role mengelompokkan node berdasarkan fungsinya, misalnya webserver, database, atau load_balancer. Sebuah role berisi run list dan atribut default yang otomatis menyatu ke semua node yang memakai role tersebut. Berikut contoh file role:
name 'webserver'
description 'Node yang menjalankan web server'
run_list(
'recipe[apt]',
'recipe[web_server]'
)
default_attributes(
'web_server' => {
'worker_processes' => 4
}
)Upload role ke server, lalu pasang ke node dalam satu langkah:
knife role from file roles/webserver.rb
knife node run_list set web01 'role[webserver]'Environment mengelompokkan node berdasarkan tahap lifecycle: development, staging, dan production. Environment memiliki kuasa lebih tinggi dalam hierarki atribut karena memakai precedence override, dan bisa mengunci versi cookbook yang boleh dijalankan sebuah node.
name 'production'
description 'Environment produksi'
cookbook_versions(
'web_server' => '~> 0.1.0'
)
override_attributes(
'web_server' => {
'worker_processes' => 16
}
)Upload dan tetapkan environment ke node:
knife environment from file environments/production.rb
knife node environment set web01 productionKeduanya kerap tertukar oleh pemula. Tabel berikut merangkum perbedaan inti:
| Aspek | Roles | Environments |
|---|---|---|
| Fungsi utama | Peran node (web, database) | Tahap lifecycle (dev, prod) |
| Isi | run_list + attributes | versi cookbook + attributes |
| Precedence atribut | default | override (lebih tinggi) |
| Jumlah per node | Boleh banyak role | Hanya satu environment |
| Contoh | role[webserver] | production |
Important
Satu node hanya boleh berada dalam satu environment, tetapi boleh memiliki banyak role. Environment mengatur versi cookbook yang boleh dipakai node, sementara role menentukan fungsi dan run list node tersebut. Kombinasi keduanya menghasilkan konfigurasi yang terstruktur tanpa duplikasi.
Pada episode 6 ini kalian sudah memahami anatomi cookbook, peran setiap direktori dari recipes/ sampai metadata.rb, serta cara kerja run list dalam menentukan urutan eksekusi. Kalian juga sudah melihat bagaimana roles dan environments memisahkan fungsi dari tahap lifecycle, sehingga satu cookbook bisa dipakai secara konsisten di ratusan node yang berbeda peran dan lingkungannya.
Inti yang harus dibawa pulang:
recipes/ sebagai entry point dan metadata.rb sebagai identitas serta daftar dependensi.Di episode 7 berikutnya kita akan masuk ke topik yang membuat cookbook benar-benar dinamis, yaitu Templates & Data Bags. Kalian akan belajar template ERB yang merender file konfigurasi berdasarkan atribut node, serta data bags untuk menyimpan data terstruktur di server dan chef-vault untuk mengamankan secret seperti password dan kunci API. Pastikan tetap semangat.