Belajar Puppet - Hiera (Hierarchical Data)
Episode 7 of 23

Belajar Puppet - Hiera (Hierarchical Data)

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.

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

Pendahuluan

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.

Konsep Hiera 5

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.

hiera.yaml di level environment
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.

Menyusun Data di Tiga Level

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.

data/common.yaml
ntp_servers:
  - 0.pool.ntp.org
  - 1.pool.ntp.org
dns_servers:
  - 8.8.8.8
  - 1.1.1.1
timezone: UTC
data/osfamily/RedHat.yaml
ssh_packages:
  - openssh-server
web_server_pkg: httpd
data/nodes/web01.example.com.yaml
timezone: Asia/Jakarta
app_port: 8080

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

lookup Function

Di dalam manifest, data Hiera diambil dengan function lookup. Bentuk paling sederhana:

lookup dasar
$ntp = lookup('ntp_servers')
$tz  = lookup('timezone')

lookup bisa dibatasi tipe data dan diberi default agar tidak error saat key hilang:

lookup dengan tipe dan default
$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:

StrategiPerilaku
firstPakai nilai dari level tertinggi yang punya key
uniqueGabungkan semua nilai array dari semua level, hilangkan duplikat
hashGabungkan hash antar level, key level tinggi menang
deepSeperti 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.

Data YAML dan JSON di Module

Module juga bisa membawa data sendiri lewat direktori data/. Ini berguna untuk nilai default sebuah module, sementara environment tetap berhak menimpanya:

Struktur module dengan data
profile::web/
  data/
    common.yaml
  hiera.yaml
  manifests/
  templates/
profile/web/data/common.yaml
profile::web::worker_processes: 4
profile::web::listen_port: 80

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

hiera-eyaml untuk Secret

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:

Setup kunci dan enkripsi secret
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:

data/secrets.yaml dengan nilai terenkripsi
db_password: ENC[PKCS7,MIIEvgYJKoZIhvcNAQcCoIIErzCCBKsCAQExAAEwDQYJKoZIhvcNAQEBBQAEggSg...]
db_user: app_reader

Lalu daftarkan backend eyaml di hierarki, biasanya sebagai level tertinggi agar secret selalu menang:

hiera.yaml dengan backend eyaml
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.

Penutup

Dengan Hiera, kalian memindahkan seluruh keputusan nilai dari kode ke data terpusat.

  • Hiera 5 menyediakan hierarki data — level common, osfamily, dan hostname adalah tiga tingkatan yang paling sering dipakai.
  • 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.
  • Module membawa data sendiri di folder data/, dan environment berhak menimpanya.
  • hiera-eyaml mengamankan secret dengan enkripsi PKCS7 tanpa mengubah cara manifest membaca data.

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!