Di episode ini kita memisahkan data dari kode dengan Hiera 5: hierarki data berjenjang, hiera.yaml, lookup function, data YAML dan JSON di module serta environment, dan enkripsi secret dengan hiera-eyaml.

Di episode 6 kalian sudah tahu cara membaca data node lewat facts dan mengubahnya menjadi keputusan di dalam manifest. Tapi menulis if dan case untuk setiap kemungkinan nilai akan membuat kode penuh logika bisnis. Di episode 7 kita memindahkan data keluar dari kode dengan Hiera 5, sistem data berjenjang bawaan Puppet.
Dengan Hiera, konfigurasi disimpan sebagai data murni — YAML atau JSON — yang dicari berdasarkan hierarki. Kode manifest hanya tinggal memanggil data lewat lookup, dan nilai yang sama bisa menangani semua node hanya dengan mengubah posisi di hierarki.
Hiera menyelesaikan satu masalah: dari mana sebuah nilai diambil, dan siapa yang lebih berhak. Setiap data didefinisikan sekali di file datar, lalu hierarki menentukan urutan prioritas. Semakin spesifik sebuah level, semakin tinggi prioritasnya.
version: 5
defaults:
datadir: data
data_hash: yaml_data
hierarchy:
- name: "Per-node data"
path: "nodes/%{trusted.certname}.yaml"
- name: "Per-OS family"
path: "osfamily/%{facts.os.family}.yaml"
- name: "Per-OS"
path: "os/%{facts.os.name}.yaml"
- name: "Common"
path: "common.yaml"Hierarki dibaca dari atas: Hiera mencoba nodes/<certname>.yaml lebih dulu. Jika key tidak ditemukan di sana, barulah turun ke osfamily, lalu os, dan terakhir common.yaml.
Important
Lokasi hiera.yaml menentukan cakupannya. Di /etc/puppetlabs/puppet/hiera.yaml hierarki berlaku untuk seluruh environment; di dalam folder data/ sebuah module, hierarki hanya berlaku untuk module tersebut. Konfigurasi environment lebih tinggi daripada module.
Level data yang paling umum adalah common, osfamily, dan hostname. Ketiganya mewakili strategi yang sehat: nilai umum untuk semua, penyesuaian per keluarga OS, dan pengecualian per node.
ntp_servers:
- 0.pool.ntp.org
- 1.pool.ntp.org
dns_servers:
- 8.8.8.8
- 1.1.1.1
timezone: UTCssh_packages:
- openssh-server
web_server_pkg: httpdtimezone: Asia/Jakarta
app_port: 8080Perhatikan pola: common.yaml memuat nilai default, file per keluarga OS memuat kustomisasi yang berlaku untuk banyak node, dan file per node memuat pengecualian. Node web01.example.com mendapatkan timezone: Asia/Jakarta dari level node, bukan UTC dari common.
Tip
Nama file per node harus persis sama dengan certname — kasus huruf pun ikut penting. Jika certname adalah WEB01.EXAMPLE.COM, file Hiera juga harus WEB01.EXAMPLE.COM.yaml.
Di dalam manifest, data Hiera diambil dengan function lookup. Bentuk paling sederhana:
$ntp = lookup('ntp_servers')
$tz = lookup('timezone')lookup bisa dibatasi tipe data dan diberi default agar tidak error saat key hilang:
$port = lookup('app_port', Integer, 'first', 80)
$dns = lookup('dns_servers', Array[String], 'unique')
$rules = lookup('firewall_rules', Hash, 'deep')Parameter kedua membatasi tipe hasil, parameter ketiga adalah strategi merge, dan parameter keempat adalah nilai default. Strategi merge menentukan bagaimana nilai dari beberapa level digabungkan:
| Strategi | Perilaku |
|---|---|
first | Pakai nilai dari level tertinggi yang punya key |
unique | Gabungkan semua nilai array dari semua level, hilangkan duplikat |
hash | Gabungkan hash antar level, key level tinggi menang |
deep | Seperti hash, tetapi key bertingkat ikut digabung |
Contohnya, lookup('ntp_servers', Array[String], 'unique') akan menggabungkan daftar server NTP dari common.yaml dan level lainnya tanpa duplikat.
Module juga bisa membawa data sendiri lewat direktori data/. Ini berguna untuk nilai default sebuah module, sementara environment tetap berhak menimpanya:
profile::web/
data/
common.yaml
hiera.yaml
manifests/
templates/profile::web::worker_processes: 4
profile::web::listen_port: 80Perhatikan nama key-nya: profile::web::worker_processes mengikuti fully qualified name dari parameter class. Hiera lalu mengisinya otomatis sebagai parameter class ketika class di-include — inilah jembatan utama antara data dan kode.
Note
Untuk memakai lookup otomatis pada parameter class, class harus menggunakan auto-parameter binding — cukup include tanpa class { ... }. Data Hiera dengan nama nama::module::parameter akan terpasang dengan sendirinya.
Secret seperti password tidak boleh ditaruh plaintext di git. hiera-eyaml adalah backend Hiera yang menyimpan nilai terenkripsi di dalam file YAML biasa, sementara kunci privat dijaga di server.
Persiapkan kunci dan enkripsi nilai:
sudo puppet module install puppetlabs-eyaml --modulepath /etc/puppetlabs/puppet/modules
eyaml encrypt --pkcs7-private-key=/etc/puppetlabs/eyaml/keys/private_key.pkcs7.pem \
--pkcs7-public-key=/etc/puppetlabs/eyaml/keys/public_key.pkcs7.pem \
--string "S3cr3t"Output dari perintah di atas adalah blok ENC[PKCS7,...] yang siap ditaruh di data. Contoh hasil:
db_password: ENC[PKCS7,MIIEvgYJKoZIhvcNAQcCoIIErzCCBKsCAQExAAEwDQYJKoZIhvcNAQEBBQAEggSg...]
db_user: app_readerLalu daftarkan backend eyaml di hierarki, biasanya sebagai level tertinggi agar secret selalu menang:
version: 5
defaults:
datadir: data
data_hash: yaml_data
hierarchy:
- name: "Secrets"
lookup_key: eyaml_lookup_key
path: "secrets.yaml"
options:
pkcs7_private_key: /etc/puppetlabs/eyaml/keys/private_key.pkcs7.pem
pkcs7_public_key: /etc/puppetlabs/eyaml/keys/public_key.pkcs7.pem
- name: "Common"
path: "common.yaml"Di manifest, secret terenkripsi tetap dibaca normal dengan lookup('db_password') — Puppet Server mendekripsinya saat kompilasi catalog, dan agent tidak pernah melihat kunci privat.
Warning
Publikasikan public key ke tim dan backup private key ke tempat aman di luar server. Jika private key hilang, seluruh secret yang terenkripsi dengan kunci itu tidak bisa lagi didekripsi. Jangan pernah menaruh private key di repository.
Dengan Hiera, kalian memindahkan seluruh keputusan nilai dari kode ke data terpusat.
hiera.yaml mendefinisikan urutan prioritas, dan %{facts.os.family} serta %{trusted.certname} membuatnya dinamis.lookup mengambil nilai dengan kontrol tipe, strategi merge, dan default yang aman.data/, dan environment berhak menimpanya.Sekarang manifest hanya berisi "apa yang harus dilakukan", bukan "nilai apa yang dipakai". Di episode 8, kalian akan melihat bagaimana manifest dan data itu disatukan menjadi catalog, belajar mengatur urutan resource dengan before, require, notify, subscribe, dan chaining -> serta ~>, plus error katalog yang paling sering muncul. Sampai jumpa!