Belajar Chef - Resources & Recipes
Episode 4 of 23

Belajar Chef - Resources & Recipes

Di episode ini kita akan membedah delapan resource dasar Chef beserta properti dan action-nya, cara menyusun recipe secara deklaratif, dan bagaimana idempotency bekerja pada tiap resource.

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

Pendahuluan

Di episode 3 kalian sudah berhasil membuat cookbook nginx dan mengkonvergennya ke node uji, serta menyentuh dua resource pertama: package dan service. Sekarang saatnya melengkapi kemampuan itu dengan memahami resource sebagai bahasa inti Chef dan recipe sebagai cara menyusunnya.

Episode 4 ini adalah episode paling fundamental di seluruh series — karena apapun yang ingin kalian lakukan dengan Chef, dari install package hingga mengelola user, semuanya adalah resource. Kita akan membahas delapan resource dasar (package, service, file, template, execute, directory, user, group), properti dan action masing-masing, cara menyusun recipe secara deklaratif, dan bagaimana idempotency bekerja di balik setiap resource.

Resource: Unit Terkecil Chef

Resource adalah pernyataan deklaratif tentang state yang diinginkan. Setiap resource memiliki tiga bagian utama: tipe resource (misal package), nama resource (identifier unik), dan blok properti & action yang mendeskripsikan state yang diinginkan.

Anatomi sebuah resource
package 'nginx' do
  version '1.24.0'     # properti
  action :install      # action
end

Saat chef-client menemukan resource ini, ia tidak langsung mengeksekusi. Ia mengumpulkan state saat ini (misal "nginx belum terinstall"), membandingkannya dengan state yang diinginkan, dan hanya bertindak jika berbeda. Inilah mengapa resource disebut declarative — kita mendeskripsikan hasil akhir, bukan langkah-langkahnya.

Delapan Resource Dasar

Berikut delapan resource yang paling sering dipakai di dunia nyata, lengkap dengan properti dan action utamanya.

package

Mengelola software package, otomatis memakai package manager sesuai platform (apt, yum, dnf).

Resource package
package 'nginx' do
  version '1.24.0'
  action :install
end

service

Mengontrol service/daemon sistem. Properti action dengan array memungkinkan beberapa aksi sekaligus.

Resource service
service 'nginx' do
  action [:enable, :start]
end

file

Mengelola file: membuat, menulis isi, atau menghapus. Resource file menulis konten apa adanya (tanpa template).

Resource file
file '/etc/motd' do
  content 'Selamat datang di node yang dikelola Chef'
  mode '0644'
  owner 'root'
  group 'root'
  action :create
end

template

Seperti file, tapi kontennya di-generate dari template ERB yang bisa memuat variabel node. Template akan dibahas mendalam di episode 7.

Resource template
template '/etc/nginx/sites-available/default' do
  source 'default.erb'
  variables(
    server_name: node['hostname']
  )
  notifies :reload, 'service[nginx]'
end

execute

Menjalankan perintah shell sebarang. Gunakan dengan hati-hati karena tidak idempoten secara otomatis — butuh properti not_if atau only_if.

Resource execute
execute 'update-nginx-cache' do
  command 'nginx -s reload'
  action :run
  not_if 'test ! -f /etc/nginx/nginx.conf'
end

Caution

execute adalah resource paling "imperatif" dan tidak idempoten secara otomatis. Selalu pasang not_if (jalankan jika kondisi tidak terpenuhi) atau only_if (jalankan hanya jika kondisi terpenuhi). Jika ada resource khusus yang bisa menggantikan perintah shell, gunakan itu terlebih dahulu.

directory

Mengelola direktori, termasuk direktori bertingkat dengan recursive.

Resource directory
directory '/var/www/example' do
  owner 'www-data'
  group 'www-data'
  mode '0755'
  recursive true
  action :create
end

user

Mengelola user sistem.

Resource user
user 'deploy' do
  comment 'Akun deploy aplikasi'
  home '/home/deploy'
  shell '/bin/bash'
  uid 1001
  action :create
end

group

Mengelola group sistem.

Resource group
group 'developers' do
  members ['deploy', 'ops']
  append true
  action :create
end

Ringkasan Resource dalam Tabel

ResourceFungsiAction utamaIdempoten
packageInstall/kelola software:install, :upgrade, :removeYa (otomatis)
serviceKelola daemon/service:start, :stop, :restart, :enableYa (otomatis)
fileKelola file dan isinya:create, :touch, :deleteYa (otomatis)
templateGenerate file dari template ERB:createYa (otomatis)
executeJalankan perintah shell:run, :nothingTidak (butuh not_if/only_if)
directoryKelola direktori:create, :deleteYa (otomatis)
userKelola user sistem:create, :lock, :removeYa (otomatis)
groupKelola group sistem:create, :manage, :removeYa (otomatis)

Menyusun Recipe Secara Deklaratif

Sebuah recipe hanyalah kumpulan resource yang disusun berurutan. Meski urutan resource memengaruhi urutan eksekusi, penting untuk tetap berpikir deklaratif: deskripsikan state akhir, bukan prosedur. Bandingkan dua cara berpikir untuk task yang sama — install nginx, buat direktori, dan letakkan file index:

package 'nginx' do
  action :install
end
 
directory '/var/www/example' do
  owner 'www-data'
  mode '0755'
  recursive true
  action :create
end
 
file '/var/www/example/index.html' do
  content '<h1>Hello Chef!</h1>'
  mode '0644'
  action :create
end
 
service 'nginx' do
  action [:enable, :start]
end

Perhatikan perbedaannya: versi Chef lebih panjang sedikit di kode, tapi menjamin idempotency. Versi shell harus dijalankan dengan sangat hati-hati dan tidak aman untuk dijalankan dua kali.

Tip

Properti notifies memungkinkan antar resource saling berkomunikasi: notifies :reload, 'service[nginx]' pada resource template berarti setiap kali file konfigurasi berubah, service nginx otomatis di-reload — tanpa menulis urutan eksplisit.

Menguji Idempotency

Mari praktikkan konsep yang sudah kita bahas sejak episode 1. Konvergen recipe dua kali dan amati outputnya:

Konvergen cookbook dua kali
cd ~/lab-chef/chef-repo
knife cookbook upload nginx
knife ssh 'name:node-01' 'sudo chef-client' --ssh-user devops
Run pertama vs run kedua
# Run pertama: ada perubahan
  * directory[/var/www/example] action create
    - create new directory /var/www/example
  * service[nginx] action start
    - start service service[nginx]
Chef Infra Client finished, 3/3 resources updated
 
# Run kedua: semuanya up to date
  * directory[/var/www/example] action create
    - up to date
  * service[nginx] action start
    - up to date
Chef Infra Client finished, 0/3 resources updated

Important

Kata kuncinya adalah 0/3 resources updated pada run kedua. Inilah bukti idempotency: resource tidak pernah bertindak lebih dari yang diperlukan. Jika output run kedua kalian masih menunjukkan updated, ada yang salah dengan cara menulis resource — selidiki propertinya.

Penutup

Di episode 4 ini kita sudah menguasai bahasa inti Chef: delapan resource dasar, properti dan action masing-masing, cara menyusun recipe secara deklaratif, dan bukti idempotency yang bekerja nyata.

Inti yang harus dibawa pulang:

  • Resource adalah pernyataan desired state — deskripsikan hasil akhir, bukan langkah.
  • Delapan resource dasar menutupi hampir semua kebutuhan konfigurasi server sehari-hari.
  • execute tidak idempoten — selalu lindungi dengan not_if atau only_if.
  • notifies menghubungkan resource — perubahan pada file konfigurasi otomatis me-reload service.
  • Tanda idempotency adalah 0/... resources updated pada run kedua.

Kalian sekarang bisa menulis recipe yang aman dan deklaratif. Di episode 5 selanjutnya, kita akan mempelajari attributes & Ohai — level attribute dan urutan precedence (default, force_default, normal, override, automatic), cara kerja plugin Ohai mengumpulkan fakta sistem (OS, memory, network), dan cara membaca node attribute di dalam recipe.

Belajar Chef - Resources & Recipes | Belajar Chef