Belajar Chef - Policyfiles
Series/Belajar Chef/Episode 10
Episode 10 of 23

Belajar Chef - Policyfiles

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.

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

Pendahuluan

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.

Mengapa Policyfile?

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:

AspekRun List + EnvironmentPolicyfile
Tempat definisi run listMelekat di nodeDi dalam policy
Versi cookbookEnvironment, berubah dinamisLockfile, dibekukan
Solver dependensiSaat run di serverSekali saat pembuatan policy
Rilis per environmentMutasi cookbook di serverPolicy group, tanpa mutasi
ReproduksibilitasRawan driftPenuh dan deterministik

Mendefinisikan Policyfile.rb

Policyfile adalah file Ruby yang mendeskripsikan nama policy, run list, cookbook yang dipakai, dan atribut default. Berikut contoh untuk infrastruktur web:

Policyfile.rb
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.

Membuat Lockfile dan Menginstall Policy

Setelah Policyfile.rb selesai, jalankan chef install di dalam direktori yang sama:

Resolusi dependensi dan install policy
chef install

chef 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:

Policyfile.lock.json (sebagian)
{
  "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:

Upload policy ke chef-server
chef push development web_server_policy
chef push staging web_server_policy
chef push production web_server_policy

chef 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 Groups: Rilis Deterministik

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:

  1. Ubah cookbook, naikkan versinya, lalu jalankan chef install untuk memperbarui lockfile.
  2. Uji policy di group staging dengan chef push staging web_server_policy.
  3. Jika berhasil, rilis ke 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:

Bootstrap node dengan policy
knife bootstrap 203.0.113.20 \
  --ssh-user deploy \
  --sudo \
  --node-name web02 \
  --policy-group production \
  --policy-name web_server_policy

Sekarang 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.

Menambah Group untuk Skenario Khusus

Policy group tidak harus sesuai nama environment. Kalian bisa membuat group tambahan untuk canary release:

Group khusus canary release
chef push canary web_server_policy

Node 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.

Penutup

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:

  • Policyfile.rb mendefinisikan run list, sumber cookbook, dan dependensi secara deklaratif.
  • Policyfile.lock.json membekukan kombinasi versi penuh sehingga reproduksibilitas dijamin.
  • Chef install menyelesaikan dependensi dan menghasilkan lockfile yang harus di-commit bersama.
  • Policy group menghubungkan policy ke node dan menggantikan peran environment untuk rilis.
  • Chef push merilis policy ke group tanpa mengubah cookbook yang sudah ada di server.

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.

Belajar Chef - Policyfiles | Belajar Chef