Pelajari cara mendefinisikan run list dan cookbook secara deklaratif dengan Policyfile.rb beserta lockfile Policyfile.lock.json untuk reproduksibilitas penuh, serta penggunaan policy groups untuk rilis deterministik per environment tanpa mutasi cookbook di server.

Di episode 9 kalian sudah mengenal Chef Infra Server dari sisi administrasi: instalasi paket chef-server-core, perintah chef-server-ctl, pembuatan pengguna dan organisasi, konfigurasi SSL, hingga backup dan high availability. Server kini siap menampung cookbook, tetapi ada masalah yang belum terpecahkan: bagaimana menjamin bahwa satu kombinasi cookbook yang sudah diuji bisa dirilis ke banyak node secara identik?
Pendekatan tradisional dengan run list dan environment memiliki titik lemah. Versi cookbook di environment bisa berubah, cookbook bisa diupload ulang, dan dependensi bisa melenceng karena solvers berbeda waktu. Policyfiles hadir untuk menjawab masalah ini dengan cara kerja yang mirip lockfile pada package manager.
Episode 10 ini akan membahas definisi Policyfile.rb, lockfile Policyfile.lock.json untuk reproduksibilitas penuh, serta policy groups yang memungkinkan rilis deterministik per environment tanpa mengubah cookbook di server.
Dalam pendekatan klasik, run list dan versi cookbook ditentukan di dua tempat terpisah: run list melekat pada node dan versi ditegakkan oleh environment. Ketika dependensi cookbook dinaikkan, solvers yang berbeda antara workstation dan server bisa menghasilkan kombinasi versi yang berbeda.
Policyfile mengubah cara berpikir ini. Sekarang definisi lengkap infrastruktur — cookbook apa saja, versi berapa, dan dependensinya — ditangkap dalam satu artefak yang disebut policy. Kombinasi ini dibekukan dalam lockfile, sehingga setiap node yang memakai policy yang sama selalu menjalankan kombinasi cookbook yang persis identik.
Berikut perbandingan kedua pendekatan:
| Aspek | Run List + Environment | Policyfile |
|---|---|---|
| Tempat definisi run list | Melekat di node | Di dalam policy |
| Versi cookbook | Environment, berubah dinamis | Lockfile, dibekukan |
| Solver dependensi | Saat run di server | Sekali saat pembuatan policy |
| Rilis per environment | Mutasi cookbook di server | Policy group, tanpa mutasi |
| Reproduksibilitas | Rawan drift | Penuh dan deterministik |
Policyfile adalah file Ruby yang mendeskripsikan nama policy, run list, cookbook yang dipakai, dan atribut default. Berikut contoh untuk infrastruktur web:
name 'web_server_policy'
run_list 'web_server::default', 'monitoring::default'
default_source :supermarket
default_source :chef_repo, 'cookbooks/'
cookbook 'web_server', path: 'cookbooks/web_server'
cookbook 'monitoring', '= 1.2.3'
named_run_list 'minimal', 'web_server::default'name memberi identitas unik policy di server.run_list mendefinisikan recipe yang dijalankan, dalam urutan tertentu.default_source :supermarket memungkinkan cookbook publik dari Supermarket.cookbook 'monitoring', '= 1.2.3' mematok versi eksak.named_run_list mendefinisikan run list alternatif untuk skenario khusus tanpa mengubah policy utama.Tip
Saat memasang cookbook dari path lokal, pastikan path relative dihitung dari lokasi Policyfile.rb berada. Penggunaan path: 'cookbooks/web_server' lebih mudah diprediksi daripada memakai direktori yang berbeda di setiap workstation.
Setelah Policyfile.rb selesai, jalankan chef install di dalam direktori yang sama:
chef installchef install membaca Policyfile.rb, menyelesaikan seluruh dependensi dengan solver di workstation, lalu menulis Policyfile.lock.json. File inilah kunci reproduksibilitas penuh. Sebagian isinya tampak seperti berikut:
{
"revision_id": "f7a1b2c3d4e5f6a7b8c9d0e1f2a3b4c5",
"name": "web_server_policy",
"run_list": [
"recipe[web_server::default]",
"recipe[monitoring::default]"
],
"cookbook_locks": {
"web_server": {
"version": "0.2.0",
"identifier": "a1b2c3d4e5f6a7b8c9d0e1f2a3b4c5d6",
"dotted_decimal_identifier": "72456436728239420389.28230458704770911000.1"
}
}
}revision_id adalah hash yang menangkap identitas keseluruhan policy. Dua lockfile dengan isi sama pasti menghasilkan revision_id yang sama, sedangkan perubahan sekecil apa pun akan mengubahnya. cookbook_locks mencatat versi dan identifier unik setiap cookbook.
Untuk menempatkan policy ke server:
chef push development web_server_policy
chef push staging web_server_policy
chef push production web_server_policychef push <group> <policy> mengupload policy ke policy group yang ditentukan. Chef mengarsipkan seluruh cookbook yang tercantum dalam lockfile ke server beserta policy-nya, sehingga server tidak perlu menyelesaikan dependensi lagi saat node berjalan.
Important
Jangan pernah mengedit Policyfile.lock.json secara manual. File ini dihasilkan oleh chef install dan perubahan tangan membuat revision_id tidak konsisten. Ulangi chef install setiap kali Policyfile.rb berubah, lalu commit kedua file ke repository bersama-sama.
Policy group adalah namespace yang menghubungkan policy ke node. Contohnya development, staging, dan production. Saat menjalankan chef push production web_server_policy, policy versi itu diikat ke group production, dan semua node yang memakai group tersebut menjalankan policy yang sama.
Keunggulan utama policy group adalah rilis tidak lagi membutuhkan mutasi cookbook di server. Untuk menaikkan versi aplikasi:
chef install untuk memperbarui lockfile.staging dengan chef push staging web_server_policy.production dengan chef push production web_server_policy.Selama langkah 2, node production masih memakai revision policy lama karena group production belum di-update. Tidak ada cookbook yang diubah di server; hanya ikatan policy ke group yang berubah.
Untuk menetapkan node ke sebuah group, gunakan subcommand chef-client --policy-group saat mengkonfigurasi node, misalnya saat bootstrap:
knife bootstrap 203.0.113.20 \
--ssh-user deploy \
--sudo \
--node-name web02 \
--policy-group production \
--policy-name web_server_policySekarang node web02 memakai policy web_server_policy dari group production. Chef-client tidak membaca run list atau environment node lagi, melainkan langsung mengeksekusi policy yang diikat ke group tersebut.
Policy group tidak harus sesuai nama environment. Kalian bisa membuat group tambahan untuk canary release:
chef push canary web_server_policyNode yang di-bootstrap dengan --policy-group canary akan menjalankan policy terbaru lebih dulu. Jika kesehatan node canary baik, rilis diteruskan ke group production. Pola ini memungkinkan deployment bertahap tanpa mengganti konfigurasi node satu per satu.
Warning
Chef-client menolak menjalankan policy jika node tidak memiliki run list dan environment yang konsisten dengan policy-nya. Saat memigrasi node dari model run list klasik ke policy, lakukan bootstrap ulang node dengan opsi --policy-group dan --policy-name agar tidak terjadi konflik konfigurasi.
Pada episode 10 ini kalian sudah memahami konsep Policyfile sebagai artefak tunggal yang menangkap run list, cookbook, dan seluruh dependensinya. Kalian belajar mendefinisikan Policyfile.rb, membekukan kombinasi versi ke dalam Policyfile.lock.json dengan chef install, serta mengupload dan merilis policy ke berbagai group dengan chef push. Kalian juga memahami mengapa policy groups memungkinkan rilis deterministik per environment tanpa mutasi cookbook di server.
Inti yang harus dibawa pulang:
Di episode 11 berikutnya kita akan menguji apakah infrastruktur yang sudah dibangun benar-benar patuh pada kebijakan keamanan, yaitu Chef InSpec. Kalian akan belajar menulis profil compliance dengan kontrol dan describe blocks, menjalankan inspec exec untuk memindai node, serta mengintegrasikan hasilnya dengan Chef Automate. Sampai jumpa.