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.

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 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.
package 'nginx' do
version '1.24.0' # properti
action :install # action
endSaat 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.
Berikut delapan resource yang paling sering dipakai di dunia nyata, lengkap dengan properti dan action utamanya.
Mengelola software package, otomatis memakai package manager sesuai platform (apt, yum, dnf).
package 'nginx' do
version '1.24.0'
action :install
endMengontrol service/daemon sistem. Properti action dengan array memungkinkan beberapa aksi sekaligus.
service 'nginx' do
action [:enable, :start]
endMengelola file: membuat, menulis isi, atau menghapus. Resource file menulis konten apa adanya (tanpa template).
file '/etc/motd' do
content 'Selamat datang di node yang dikelola Chef'
mode '0644'
owner 'root'
group 'root'
action :create
endSeperti file, tapi kontennya di-generate dari template ERB yang bisa memuat variabel node. Template akan dibahas mendalam di episode 7.
template '/etc/nginx/sites-available/default' do
source 'default.erb'
variables(
server_name: node['hostname']
)
notifies :reload, 'service[nginx]'
endMenjalankan perintah shell sebarang. Gunakan dengan hati-hati karena tidak idempoten secara otomatis — butuh properti not_if atau only_if.
execute 'update-nginx-cache' do
command 'nginx -s reload'
action :run
not_if 'test ! -f /etc/nginx/nginx.conf'
endCaution
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.
Mengelola direktori, termasuk direktori bertingkat dengan recursive.
directory '/var/www/example' do
owner 'www-data'
group 'www-data'
mode '0755'
recursive true
action :create
endMengelola user sistem.
user 'deploy' do
comment 'Akun deploy aplikasi'
home '/home/deploy'
shell '/bin/bash'
uid 1001
action :create
endMengelola group sistem.
group 'developers' do
members ['deploy', 'ops']
append true
action :create
end| Resource | Fungsi | Action utama | Idempoten |
|---|---|---|---|
package | Install/kelola software | :install, :upgrade, :remove | Ya (otomatis) |
service | Kelola daemon/service | :start, :stop, :restart, :enable | Ya (otomatis) |
file | Kelola file dan isinya | :create, :touch, :delete | Ya (otomatis) |
template | Generate file dari template ERB | :create | Ya (otomatis) |
execute | Jalankan perintah shell | :run, :nothing | Tidak (butuh not_if/only_if) |
directory | Kelola direktori | :create, :delete | Ya (otomatis) |
user | Kelola user sistem | :create, :lock, :remove | Ya (otomatis) |
group | Kelola group sistem | :create, :manage, :remove | Ya (otomatis) |
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]
endPerhatikan 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.
Mari praktikkan konsep yang sudah kita bahas sejak episode 1. Konvergen recipe dua kali dan amati outputnya:
cd ~/lab-chef/chef-repo
knife cookbook upload nginx
knife ssh 'name:node-01' 'sudo chef-client' --ssh-user devops# 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 updatedImportant
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.
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:
execute tidak idempoten — selalu lindungi dengan not_if atau only_if.notifies menghubungkan resource — perubahan pada file konfigurasi otomatis me-reload service.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.