Apa itu Playbook? #
Apabila inventaris (inventory) mendefinisikan siapa yang kita kelola di dalam infrastruktur, maka Playbook (Buku Panduan) adalah komponen yang mendefinisikan apa tindakan otomatisasi yang harus kita lakukan terhadap mereka. Playbook bertindak sebagai jantung dari ekosistem otomatisasi Ansible. Ditulis menggunakan bahasa penanda YAML yang deklaratif, playbook memungkinkan kita mendokumentasikan serangkaian alur kerja terurut—mulai dari instalasi paket sistem, penyuntingan konfigurasi, hingga pengelolaan siklus hidup layanan—untuk dieksekusi secara berulang dengan hasil yang konsisten. Artikel ini membahas konsep dasar otomatisasi deklaratif, menyandingkan perintah ad-hoc dengan playbook, membedah anatomi berkas playbook, menjelaskan komponen utama blok play, hingga memandu cara eksekusi dan penelusuran laporan hasil.
Konsep Dasar Deklaratif #
Satu pilar filosofi penulisan playbook Ansible yang membedakannya dengan skrip bash tradisional adalah pendekatan Deklaratif (Declarative Approach). Dalam pemrograman imperatif (seperti skrip shell), kita menuliskan bagaimana (how) langkah-langkah teknis harus dijalankan secara prosedural. Kita harus mengecek apakah direktori sudah ada, menulis logika if-else untuk mengecek status paket, dan menangani error secara manual.
Sebaliknya, pendekatan deklaratif di playbook Ansible menuntut kita untuk fokus mendefinisikan status akhir yang diinginkan (desired state atau what), bukan prosedur teknis mencapainya.
Berikut adalah visualisasi alur bagaimana Ansible memproses status deklaratif playbook dari berkas fisik hingga eksekusi runtime di target server:
flowchart TD
A["YAML Playbook (site.yml)"] -->|"1. Parse & Sintaks Validasi"| B["Ansible Playbook Executor"]
B -->|"2. Baca Inventaris (hosts.ini)"| C["Host Mapping (webservers, dbservers)"]
C -->|"3. Rakit Variabel & Precedence"| D["HostVars Database (Memori)"]
D -->|"4. Eksekusi Play 1 (Linear)"| E["Managed Node Batch 1"]
D -->|"5. Eksekusi Play 2 (Linear)"| F["Managed Node Batch 2"]
E -->|"6. Kumpulkan Output & Recap"| G["Laporan Hasil di Terminal (PLAY RECAP)"]
F -->|"6. Kumpulkan Output & Recap"| G
Ansible Engine secara cerdas akan mendeteksi status aktual target server saat ini (actual state), membandingkannya dengan status akhir yang kita inginkan di playbook, lalu hanya akan melakukan tindakan perubahan jika status aktual tidak sesuai dengan status akhir. Prinsip inilah yang mewujudkan keandalan sifat Idempotensi (Idempotency).
Perbandingan Ad-hoc Command dan Playbook #
Ansible menyediakan dua metode eksekusi: Ad-hoc Commands (Perintah Cepat) dan Playbooks. Kita harus memilih metode yang paling efisien berdasarkan konteks tugas operasional kita.
1. Ad-hoc Commands (Perintah Satu Aksi) #
Merupakan perintah tunggal yang dijalankan langsung dari terminal baris perintah tanpa disimpan ke dalam berkas otomatisasi. Metode ini sangat baik untuk tugas pemeliharaan cepat sekali jalan (quick, one-time tasks).
- Kasus Penggunaan: Memeriksa kapasitas memori target server, melakukan reboot cepat, atau menyalin satu berkas darurat ke managed node.
- Contoh Perintah:
# Memeriksa kapasitas disk server di grup webservers ansible webservers -m command -a "df -h" -u ubuntu # Menginstal paket curl di seluruh managed node secara paralel ansible all -m apt -a "name=curl state=present" --become
2. Playbooks (Buku Panduan Terstruktur) #
Merupakan berkas teks berformat YAML yang menyimpan seluruh rangkaian alur kerja otomatisasi yang kompleks secara terstruktur.
- Kasus Penggunaan: Proses provisioning server baru dari nol, deployment rilis aplikasi multi-tier, konfigurasi kluster database, atau pengerasan keamanan (security hardening) server.
- Contoh Perintah:
# Menjalankan seluruh alur konfigurasi terstruktur ansible-playbook -i inventory/production/hosts.ini playbooks/site.yml
Tabel di bawah ini merangkum perbandingan komparatif antara Ad-hoc dan Playbook:
| Atribut Perbandingan | Ad-hoc Commands | Playbooks |
|---|---|---|
| Struktur Kerja | Aksi tunggal, linier | Multi-aksi, multi-host, hierarkis |
| Portabilitas | Tidak tersimpan, sekali pakai | Tersimpan dalam Git, sangat reusable |
| Keterbacaan | Sulit dipahami jika argumen panjang | Deklaratif, terstruktur, mudah di-audit |
| Dukungan Handlers | Tidak didukung | Didukung secara native (pemicu event) |
| Penyimpanan Logika | Sangat terbatas | Sangat kuat (loops, conditionals, block) |
Anatomi Struktur Berkas Playbook #
Sebuah berkas playbook terdiri dari satu atau beberapa blok Play (Skenario). Satu Play berfungsi untuk memetakan sekumpulan server target (dari inventaris) dengan rangkaian tugas (Tasks) yang akan dijalankan oleh modul-modul Ansible.
Berikut adalah anatomi visual dari berkas playbook standar industri:
# File: playbooks/setup-webserver.yml
---
# Tanda tiga strip menandai dimulainya dokumen YAML
# ==================== PLAY 1: Web Tier Setup ====================
- name: Konfigurasikan Web Server Nginx
hosts: webservers
become: true
vars:
http_port: 80
app_directory: /var/www/my-app
tasks:
- name: Pasang paket Nginx
apt:
name: nginx
state: present
- name: Salin file konfigurasi virtual host
template:
src: templates/nginx.conf.j2
dest: /etc/nginx/sites-available/default
notify: Memicu Restart Nginx
- name: Pastikan layanan Nginx aktif dan berjalan saat booting
systemd:
name: nginx
state: started
enabled: true
handlers:
- name: Memicu Restart Nginx
systemd:
name: nginx
state: restarted
# ==================== PLAY 2: Database Tier Setup ====================
- name: Konfigurasikan Server Database PostgreSQL
hosts: dbservers
become: true
tasks:
- name: Pasang paket PostgreSQL
apt:
name: postgresql
state: present
Penjelasan Elemen Struktural: #
- name:(Tingkat Play): Label penjelas skenario global. Output teks ini akan muncul di konsol terminal kita untuk memudahkan peninjauan alur kerja.hosts:: Menunjuk sasaran server target (dalam contoh di atas grupwebserverspada Play 1 dan grupdbserverspada Play 2).tasks:: Daftar instruksi kerja deklaratif yang akan dieksekusi secara berurutan dari atas ke bawah.handlers:: Tugas khusus yang bertindak sebagai penerima sinyal (event listener). Tugas ini tidak akan berjalan kecuali ada tugas di bagiantasks:yang menghasilkan status perubahan (changed) dan mengirimkan sinyalnotify:yang namanya cocok dengan handler tersebut.
Komponen Utama Blok Play #
Saat menyusun sebuah blok Play, kita dapat menggunakan parameter kendali bawaan Ansible untuk mengatur jalannya otomatisasi:
1. hosts (Penyaringan Target) #
Menentukan sasaran server eksekusi. Kita dapat menggunakan pola penulisan yang fleksibel:
hosts: webservers:dbservers # Gabungan grup (webservers ATAU dbservers)
hosts: webservers:&jakarta # Irisan grup (webservers yang juga anggota grup jakarta)
hosts: all:!bastion # Semua server di inventaris KECUALI server bastion
2. become (Eskalasi Privilege) #
Mengatur apakah Ansible harus menjalankan seluruh tugas di bawah play ini menggunakan hak akses administratif (root):
become: true # Aktifkan eskalasi
become_method: sudo # Menggunakan perintah sudo (default Linux)
become_user: root # Menjadi user root (default)
3. vars (Variabel Lokal Play) #
Mendefinisikan parameter konfigurasi lokal yang hanya berlaku di dalam cakupan blok play ini saja. Variabel ini memiliki prioritas precedence lebih tinggi daripada variabel di inventaris group_vars/all.yml.
4. gather_facts (Pengumpulan Data Target) #
Secara default, sebelum menjalankan tugas pertama, Ansible akan menjalankan tugas implisit bernama Gathering Facts untuk mendeteksi informasi detail server target (seperti alamat IP, tipe OS, sisa RAM, kapasitas disk).
gather_facts: false
Jika playbook kita sama sekali tidak membutuhkan variabel informasi hardware target (misalnya playbook kita hanya bertugas memicu API eksternal atau melakukan reboot), kita sangat direkomendasikan untuk mengatur gather_facts: false guna memangkas durasi eksekusi playbook secara signifikan (menghemat waktu jabat tangan SSH negosiasi data).
Panduan Lengkap Eksekusi CLI #
Kita menggunakan perintah biner ansible-playbook untuk menjalankan berkas skenario playbook kita. Ansible menyediakan argumen CLI tingkat lanjut untuk membantu kontrol eksekusi yang aman.
Berikut adalah daftar perintah eksekusi yang wajib dikuasai oleh pengembang otomatisasi:
1. Menjalankan Playbook Standar #
ansible-playbook -i inventory/production/hosts.ini playbooks/setup-webserver.yml
2. Membatasi Target Secara Dinamis (Limit) #
Jika di dalam playbook tertulis hosts: webservers, namun kita hanya ingin menguji eksekusi ke server prod-web-01 saja tanpa merubah kode playbook fisik:
ansible-playbook -i inventory/production/hosts.ini playbooks/setup-webserver.yml --limit "prod-web-01.unisbadri.com"
3. Melakukan Uji Coba Simulasi (Dry Run) #
Menggunakan opsi --check (atau dry run) membuat Ansible memproses alur playbook dan membandingkan status sistem tanpa mengirimkan perintah modifikasi apa pun ke target server. Sangat penting dilakukan sebelum menerapkan perubahan di server produksi:
ansible-playbook -i inventory/production/hosts.ini playbooks/setup-webserver.yml --check
4. Menampilkan Detail Perubahan Kode (Diff Mode) #
Opsi --diff akan menampilkan output perubahan file konfigurasi sistem secara visual (mirip git diff) sebelum dan sesudah eksekusi. Sangat baik jika digabungkan dengan mode check:
ansible-playbook -i inventory/production/hosts.ini playbooks/setup-webserver.yml --check --diff
5. Resume Eksekusi dari Task Tertentu #
Jika eksekusi playbook kita mengalami kegagalan di tengah jalan pada task nomor 10 akibat masalah jaringan, setelah kita memperbaiki masalah tersebut, kita dapat melanjutkan eksekusi langsung dari task yang gagal tanpa mengulangi task 1 sampai 9:
ansible-playbook -i inventory/production/hosts.ini playbooks/setup-webserver.yml --start-at-task "Salin file konfigurasi virtual host"
Membedah Hasil Laporan dan Play Recap #
Ketika playbook dieksekusi, Ansible akan mencetak laporan interaktif ke layar terminal. Pada bagian akhir eksekusi, Ansible menyajikan laporan ringkas berupa PLAY RECAP:
PLAY RECAP *****************************************************************************************
prod-web-01.unisbadri.com : ok=4 changed=1 unreachable=0 failed=0 skipped=0 rescued=0
prod-web-02.unisbadri.com : ok=3 changed=0 unreachable=0 failed=0 skipped=1 rescued=0
prod-db-01.unisbadri.com : ok=2 changed=0 unreachable=1 failed=0 skipped=0 rescued=0
Penjelasan Status Laporan: #
ok: Jumlah tugas yang berhasil dijalankan tanpa memerlukan tindakan modifikasi karena target server sudah berada dalam status akhir yang diinginkan (idempotensi terpenuhi).changed: Jumlah tugas yang berhasil melakukan perubahan modifikasi sistem target agar sesuai dengan status akhir yang diinginkan.unreachable: Menunjukkan bahwa Ansible gagal menginisiasi koneksi SSH ke target server (masalah jaringan, user salah, port tertutup, atau private key ditolak).failed: Jumlah tugas yang gagal dieksekusi (skrip crash, argumen modul salah, dependensi paket kurang). Jika sebuah host mengalami statusfailed, Ansible secara default akan menghentikan seluruh tugas berikutnya khusus untuk host tersebut.skipped: Jumlah tugas yang dilewati karena tidak memenuhi parameter kondisionalwhen.
Playbook sebagai Dokumentasi Hidup #
Di era rekayasa infrastruktur modern, salah satu nilai tambah utama dari playbook adalah fungsinya sebagai Dokumentasi yang Dapat Dieksekusi (Executable Documentation).
Dalam administrasi server konvensional, panduan instalasi server dicatat di dalam berkas teks statis atau halaman wiki internal perusahaan. Wiki tersebut sering kali tidak akurat karena seiring berjalannya waktu, konfigurasi sistem di server aktual terus berubah tanpa ada yang memperbarui catatan wiki.
Playbook Ansible memecahkan masalah ini. Karena playbook ditulis dalam bahasa YAML deklaratif dengan parameter deskriptif - name: yang komunikatif, playbook secara otomatis merepresentasikan blueprint aktual dari infrastruktur kita yang dapat dibaca oleh siapa saja, sekaligus dapat dijalankan kapan saja untuk memastikan kesesuaian status server.
# File: playbooks/audit-hardening.yml
# Berkas ini bertindak sebagai berkas audit sekaligus penegak kepatuhan keamanan
---
- name: Audit dan Penegakan Kepatuhan Keamanan SSH
hosts: all
become: true
tasks:
- name: Pastikan akses SSH root ditutup
lineinfile:
path: /etc/ssh/sshd_config
regexp: "^PermitRootLogin"
line: "PermitRootLogin no"
state: present
notify: Restart Layanan SSH
- name: Pastikan autentikasi password SSH dinonaktifkan
lineinfile:
path: /etc/ssh/sshd_config
regexp: "^PasswordAuthentication"
line: "PasswordAuthentication no"
state: present
notify: Restart Layanan SSH
handlers:
- name: Restart Layanan SSH
systemd:
name: sshd
state: restarted
Membagikan file ini ke repositori Git perusahaan memungkinkan tim audit keamanan untuk meninjau status keamanan SSH seluruh server cukup dengan membaca kode di atas, tanpa harus melakukan login manual ke ratusan server.
Ringkasan #
- Status Akhir Deklaratif — Playbook Ansible berfokus pada pendefinisian status akhir yang kita inginkan (desired state), membiarkan mesin engine yang menangani detail alur kerja idempoten secara otomatis.
- Efisiensi Kerja — Gunakan perintah ad-hoc hanya untuk tindakan diagnosa cepat sekali jalan; gunakan playbook untuk otomatisasi konfigurasi yang terstruktur dan dapat digunakan kembali.
- Anatomi Terpusat — Playbook tersusun atas blok Play yang bertugas memetakan target server (inventory) dengan instruksi otomatisasi (tasks) dan pemicu aksi lanjutan (handlers).
- Penghematan Waktu gather_facts — Nonaktifkan pencarian fakta target (
gather_facts: false) jika alur playbook kita tidak memerlukan pembacaan parameter hardware server.- Kontrol CLI Tingkat Lanjut — Biasakan melakukan simulasi check mode (
--check --diff) sebelum menjalankan rilis otomatisasi ke lingkungan produksi untuk mendeteksi potensi konflik.- Evaluasi PLAY RECAP — Pantau output rekap akhir secara disiplin untuk melacak status kesehatan host target, khususnya jika terdeteksi indikator
failedatauunreachable.- Dokumentasi Terintegrasi — Tulis parameter nama tugas (
- name:) secara deskriptif yang menjelaskan tujuan fungsional tugas tersebut, bukan sekadar perintah terminal yang dijalankan.