Di episode ini kita memegang kendali langsung dengan Bolt: menjalankan tasks dan plans lewat SSH dan WinRM, menyusun inventory.yaml, serta menggabungkan model push Bolt dengan model pull Puppet agent.

Di episode 10 kalian melihat Tasks dan Plans berjalan di Puppet Enterprise. Kini kita lepas dari Console dan memegang kendali langsung: di episode 11 kita belajar Bolt, tool orchestration open source dari Puppet yang bisa berdiri sendiri tanpa PE. Bolt menjalankan task, plan, command, dan script ke banyak target sekaligus melalui SSH, WinRM, atau koneksi lain — melengkapi model pull agent Puppet dengan kekuatan push.
Pola kerjanya sederhana: tentukan target di inventory, pilih aksi, lalu jalankan. Bolt menangani koneksi paralel, hasil per target, dan pengumpulan output.
Bolt tersedia sebagai paket resmi untuk distro Linux utama dan macOS:
wget https://apt.puppet.com/puppet8-release-focal.deb
sudo dpkg -i puppet8-release-focal.deb
sudo apt-get update
sudo apt-get install puppet-boltbolt --version
bolt task showbolt --version memastikan binary terpasang, sedangkan bolt task show menampilkan daftar task bawaan. Bolt dikirim dengan kumpulan task standar seperti service, package, dan reboot yang langsung bisa dipakai.
Note
Bolt tidak butuh agent atau server Puppet. Ia bekerja langsung dari workstation — sangat cocok untuk workstation admin, CI pipeline, atau jalur emergency di mana agent tidak bisa diandalkan.
Target dikelompokkan dalam file inventory.yaml. Ini adalah sumber kebenaran tentang node mana yang bisa diakses dan bagaimana caranya:
version: 2
groups:
- name: web
targets:
- web01.example.com
- web02.example.com
config:
transport: ssh
ssh:
user: deploy
private-key: ~/.ssh/id_ed25519
run-as: root
- name: windows
targets:
- win01.corp.local
config:
transport: winrm
winrm:
user: svc-bolt
password: '$${winrm_password}'
- name: all
targets:
- 10.0.0.0Grup bisa bertingkat: grup all menyatukan grup web dan windows, sehingga satu target di jalankan ke semuanya. Transport default adalah SSH untuk Linux dan WinRM untuk Windows, dan keduanya bisa diatur per grup.
Warning
Jangan menaruh password plaintext di inventory.yaml yang masuk git. Gunakan variabel rahasia dari environment (misalnya dengan mekanisme env: di inventory) atau integration dengan secret store — Bolt mendukung pemanggilan nilai dari environment variable.
Task dijalankan dengan bolt task run. Bentuk paling sederhana memakai task bawaan service:
bolt task run service action=restart name=nginx --targets webHasilnya ditampilkan per target dengan status sukses atau gagal. Untuk task dari module, panggil dengan nama lengkapnya:
bolt task run profile::collect_logs --targets web --params '{"days": 7}'Perintah bolt command run menjalankan shell command langsung, dan bolt script run menjalankan script dari mesin lokal tanpa harus di-package dulu sebagai task:
bolt command run 'df -h /' --targets web
bolt script run ./scripts/collect-logs.sh --targets webTip
Pilih alat yang tepat: bolt command run untuk command satu baris, bolt script run untuk script sekali pakai, dan bolt task run untuk operasi yang terdefinisi dengan metadata serta parameter terstruktur.
Task custom cukup sebuah skrip plus metadata.json. Skrip menerima parameter lewat stdin dalam format JSON:
#!/bin/bash
systemctl restart nginx{
"description": "Restart layanan nginx",
"input_method": "stdin",
"parameters": {
"service": {
"type": "String[1]",
"description": "Nama layanan"
}
}
}Plan menggabungkan beberapa langkah dan bisa mengambil keputusan di tengah jalan:
plan upgrade::web(
TargetSpec $targets,
String[1] $version,
) {
$targets.apply_prep
run_task('deploy::stop', $targets)
run_task('deploy::update', $targets, version => $version)
run_task('deploy::start', $targets)
}Jalankan plan dengan bolt plan run:
bolt plan run upgrade::web version=1.2.0 --targets webPerhatikan keajaiban $targets.apply_prep — baris itu menginstal modul Puppet ke target secara otomatis agar task bisa berjalan. Jika task sudah tersedia di target, langkah ini bisa dilewati.
Puppet agent bekerja dengan model pull: ia menunggu jadwal untuk mengambil catalog dan menerapkannya. Bolt bekerja dengan model push: kita memerintahkan aksi langsung. Keduanya bukan pesaing, melainkan pelengkap.
Kombinasi paling umum adalah memicu run agent dari Bolt ketika ingin perubahan diterapkan segera, misalnya setelah deploy:
bolt command run 'puppet agent -t' --targets web
bolt command run 'puppet agent -t --noop' --targets webpuppet agent -t menjalankan satu run agent seketika, sedangkan --noop menampilkan apa yang akan diubah tanpa menerapkannya — aman untuk inspeksi. Dengan cara ini, konfigurasi tetap dikelola lewat manifest (pull), sementara waktu eksekusinya dikendalikan dari luar (push).
| Model | Pemicu | Contoh penggunaan |
|---|---|---|
| Pull | Agent pada jadwal | Perubahan konfigurasi normal, menjaga desired state |
| Push | Bolt / Orchestrator | Aksi ad-hoc, deploy mendadak, perbaikan darurat |
Important
Jangan memakai Bolt untuk mengubah konfigurasi yang seharusnya dikelola manifest. Jika dilakukan, perubahan itu akan di-override pada run agent berikutnya — dan orang lain tidak bisa melacaknya. Push untuk aksi, pull untuk state.
Kombinasi plan dan target batching membuat operasi aman di fleet besar. Contoh plan yang me-restart layanan dua node sekaligus agar downtime tidak pernah terjadi bersamaan:
plan web::rolling_restart(
TargetSpec $targets,
) {
$batches = $targets.slice(2)
$batches.each |$batch| {
run_task('service', $batch, action => 'restart', name => 'nginx')
run_command('sleep 5', $batch)
}
run_command('curl -f http://localhost/healthz', $targets)
}Setiap batch di-restart, diberi jeda, lalu seluruh target dicek health-nya dengan curl. Jika satu batch gagal, output plan menunjukkannya dengan jelas dan eksekusi batch berikutnya tetap berlanjut.
Bolt memberi kalian tangan langsung di atas infrastruktur tanpa melepas kendali manifest.
bolt task run, bolt command run, dan bolt script run mengeksekusi aksi secara paralel dengan hasil per target.Dengan ini kalian bisa menggerakkan seluruh fleet dalam hitungan detik. Tapi siapa yang men-deploy kode manifest itu sendiri? Di episode 12, kalian akan belajar Code Manager dan r10k: environment berbasis branch dari git, deployment production vs staging, versi module lewat Puppetfile, dan alur kontrol versi untuk environment. Sampai jumpa!