Belajar Puppet - Facts, Variables & Facter
Episode 6 of 23

Belajar Puppet - Facts, Variables & Facter

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.

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

Pendahuluan

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.

Mengenal Facter

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:

Tampilkan semua facts sebagai JSON
facter --json
facter os
facter memory.system.total
facter networking.ip

facter --json memuntahkan ratusan key. Jika hanya butuh satu fakta, tambahkan nama faktanya di akhir perintah, dan Facter akan menampilkan nilainya secara langsung.

Fakta-Fakta Penting

Sebagian besar facts diorganisasi sebagai hash bersarang. Beberapa kelompok yang paling sering dipakai:

FaktaContoh nilaiKegunaan
os.nameUbuntuNama distribusi
os.familyDebian atau RedHatKeluarga OS untuk memilih package manager
os.release.major22Versi utama OS
memory.system.total4.00 GiBTotal memori
processors.count4Jumlah inti CPU
networking.ip10.0.0.12IP utama node
virtualvmware atau physicalApakah node adalah VM
hostname dan fqdnweb01.example.comIdentitas 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.

Menggunakan Facts di Manifest

Di dalam manifest, facts diakses lewat variabel $facts sebagai hash bersarang:

Memakai facts di dalam class
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 dan Scope

Variabel di Puppet bersifat immutable — sekali di-set, nilainya tidak bisa diubah di scope yang sama. Deklarasi dilakukan dengan tanda $:

Deklarasi variabel
$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:

  • Top scope — dideklarasikan di luar class dan node; diakses dengan awalan $::.
  • Class scope — variabel class hanya terlihat di dalam class itu.
  • Parameter class — input formal yang menjadikan class mudah dikustomisasi.

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.

Kondisi: if, unless, dan case

Puppet mendukung tiga bentuk kondisi utama. if dipakai untuk percabangan umum:

if dan elsif
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 untuk pengecualian
unless $facts['os']['family'] == 'Windows' {
  package { 'openssh-server':
    ensure => installed,
  }
}

case cocok untuk banyak kemungkinan nilai dari satu variabel:

case untuk memilih nilai
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:

Selector satu baris
$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.

Interpolasi String

String bertanda kutip ganda mendukung interpolasi variabel. Sintaksnya $var untuk variabel sederhana, dan $facts['key'] untuk mengakses anggota hash di dalam string:

Interpolasi dengan facts
$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.

Custom Facts

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:

External fact dari file teks
echo "role=web-server" | sudo tee /etc/puppetlabs/facter/facts.d/role.txt
facter role
facts.d/region.yaml
region: ap-southeast
datacenter: dc-01

Custom fact Ruby — untuk logika yang lebih kompleks, tulis di lib/facter/ dalam module:

lib/facter/custom_role.rb
Facter.add('custom_role') do
  setcode do
    if File.exist?('/etc/role')
      File.read('/etc/role').strip
    else
      'default'
    end
  end
end

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

Penutup

Di episode ini kalian membuka pintu menuju manifest yang benar-benar adaptif: data node masuk ke dalam keputusan konfigurasi.

  • Facts adalah data node — dikumpulkan Facter setiap run dan dikirim bersama catalog.
  • Grup 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.
  • Variabel immutableif, unless, case, dan selector mengendalikan alur keputusan.
  • Custom facts memperluas data node untuk kebutuhan unik organisasi.

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!

Belajar Puppet - Facts, Variables & Facter | Belajar Puppet