Di episode ini kita menggali data di balik setiap node: facts yang dikumpulkan Facter, cara memakainya di dalam manifest, variabel dan scope-nya, serta if, case, unless, dan interpolasi string.

Di episode 5 kalian sudah belajar menyusun classes, modules, dan memisahkan role dari profile. Struktur module sudah bersih, tapi masih ada satu bahan yang belum dipakai: data tentang node itu sendiri. Di episode 6 kita mengisi celah itu dengan facts, variables, dan Facter.
Facter adalah tool yang berjalan di setiap agent untuk mengumpulkan informasi sistem — sistem operasi, memori, jaringan, prosesor — lalu menyerahkannya kepada Puppet. Dengan facts, satu manifest yang sama bisa menghasilkan konfigurasi berbeda-beda tergantung mesin tempat ia dijalankan.
Facter adalah library Ruby yang dikirim bersama agent. Saat agent run, Facter mengeksekusi banyak plugin untuk mengumpulkan data, lalu hasilnya disatukan dalam satu struktur bernama facts. Facts dikirim ke server bersama permintaan catalog, sehingga server bisa mengkompilasi catalog yang spesifik per node.
Jalankan Facter langsung di terminal untuk melihat isinya:
facter --json
facter os
facter memory.system.total
facter networking.ipfacter --json memuntahkan ratusan key. Jika hanya butuh satu fakta, tambahkan nama faktanya di akhir perintah, dan Facter akan menampilkan nilainya secara langsung.
Sebagian besar facts diorganisasi sebagai hash bersarang. Beberapa kelompok yang paling sering dipakai:
| Fakta | Contoh nilai | Kegunaan |
|---|---|---|
os.name | Ubuntu | Nama distribusi |
os.family | Debian atau RedHat | Keluarga OS untuk memilih package manager |
os.release.major | 22 | Versi utama OS |
memory.system.total | 4.00 GiB | Total memori |
processors.count | 4 | Jumlah inti CPU |
networking.ip | 10.0.0.12 | IP utama node |
virtual | vmware atau physical | Apakah node adalah VM |
hostname dan fqdn | web01.example.com | Identitas node |
Fakta os.family adalah yang paling menentukan keputusan di manifest: untuk keluarga RedHat paket bernama httpd, sedangkan untuk Debian bernama apache2.
Note
Facts bersifat persisten per node dan dikirim ulang setiap run. Jika sebuah node tidak menjalankan agent selama berminggu-minggu, facts-nya bisa basi — pastikan monitoring memberi tahu ketika node lama tidak check-in.
Di dalam manifest, facts diakses lewat variabel $facts sebagai hash bersarang:
class profile::motd {
file { '/etc/motd':
ensure => file,
content => "Node ${facts['hostname']} berbasis ${facts['os']['family']}\n",
}
}
if $facts['memory']['system']['total_bytes'] < 2147483648 {
notify { 'low-memory':
message => 'Memori node kurang dari 2 GiB',
}
}Perhatikan pola $facts['os']['family']. Facter memanggil hash di dalam hash, jadi setiap tingkat diakses dengan kurung siku. Cara ini menggantikan variabel top-scope lama seperti $::osfamily yang sudah tidak disarankan.
Important
Jangan memakai $::osfamily di kode baru. Variabel top-scope legacy masih bisa dibaca, tetapi $facts jauh lebih jelas sumbernya dan tidak tergantung pada posisi deklarasi.
Variabel di Puppet bersifat immutable — sekali di-set, nilainya tidak bisa diubah di scope yang sama. Deklarasi dilakukan dengan tanda $:
$app_port = 8080
$app_user = 'devnull'
file { '/etc/app/config.yml':
ensure => file,
content => "port: ${app_port}\nuser: ${app_user}\n",
}Scope menentukan di mana sebuah variabel terlihat:
$::.Selain $facts, Puppet menyediakan variabel khusus lain: $trusted berisi data dari sertifikat node, dan $server_facts berisi identitas server. Keduanya aman dipercaya karena tidak bisa dipalsukan oleh node.
Puppet mendukung tiga bentuk kondisi utama. if dipakai untuk percabangan umum:
if $facts['os']['family'] == 'RedHat' {
$web_pkg = 'httpd'
} elsif $facts['os']['family'] == 'Debian' {
$web_pkg = 'apache2'
} else {
$web_pkg = undef
}unless menjalankan blok hanya ketika kondisi bernilai false — kebalikan dari if:
unless $facts['os']['family'] == 'Windows' {
package { 'openssh-server':
ensure => installed,
}
}case cocok untuk banyak kemungkinan nilai dari satu variabel:
case $facts['os']['family'] {
'RedHat': { $pkg_mgr = 'dnf' }
'Debian': { $pkg_mgr = 'apt' }
'Suse': { $pkg_mgr = 'zypper' }
default: { fail("Tidak mendukung keluarga ${facts['os']['family']}") }
}Ada juga selector, bentuk ekspresi ?: yang mengembalikan nilai:
$ssl_mode = $facts['os']['family'] ? {
'RedHat' => 'enable',
default => 'disable',
}Tip
Bandingkan case dan selector: case menjalankan blok kode, sedangkan selector selalu menghasilkan sebuah nilai. Jika kalian hanya butuh mengisi variabel, selector lebih ringkas.
String bertanda kutip ganda mendukung interpolasi variabel. Sintaksnya $var untuk variabel sederhana, dan $facts['key'] untuk mengakses anggota hash di dalam string:
$banner = "Selamat datang di ${facts['os']['name']} ${facts['os']['release']['major']}"
file { '/etc/banner':
ensure => file,
content => $banner,
}Kurung kurawal digunakan saat interpolasi variabel yang berisi tanda kurung siku, agar parser tidak bingung. Selalu pastikan variabel di dalam string sudah terdefinisi sebelum dipakai, karena Puppet akan gagal saat kompilasi jika tidak.
Kadang facts bawaan tidak cukup — misalnya butuh membaca file sendiri atau menggabungkan beberapa sumber. Ada dua cara menambah custom facts:
External facts — paling sederhana, cukup taruh file teks, YAML, atau JSON di direktori facts.d:
echo "role=web-server" | sudo tee /etc/puppetlabs/facter/facts.d/role.txt
facter roleregion: ap-southeast
datacenter: dc-01Custom fact Ruby — untuk logika yang lebih kompleks, tulis di lib/facter/ dalam module:
Facter.add('custom_role') do
setcode do
if File.exist?('/etc/role')
File.read('/etc/role').strip
else
'default'
end
end
endFacter menjalankan file Ruby tersebut saat proses boot, lalu hasilnya tersedia seperti facts bawaan: $facts['custom_role'].
Warning
External facts harus berupa teks sederhana tanpa karakter aneh, karena di-parse dengan aturan key=value. Untuk nilai yang panjang atau berisi spasi, lebih aman memakai format YAML.
Di episode ini kalian membuka pintu menuju manifest yang benar-benar adaptif: data node masuk ke dalam keputusan konfigurasi.
os, memory, networking, dan processors adalah facts paling sering dipakai untuk percabangan.$facts mengakses data di manifest — pilih keluarga OS, nama paket, dan nilai spesifik node.if, unless, case, dan selector mengendalikan alur keputusan.Sekarang data sudah mengalir ke manifest. Langkah berikutnya adalah memisahkan data dari kode sepenuhnya: di episode 7 kalian akan belajar Hiera — Hierarchical Data, cara menyimpan konfigurasi berjenjang di YAML dan JSON, mengenal lookup function, serta mengamankan secret dengan hiera-eyaml. Sampai jumpa!