Apa itu Playbook? #
Jika inventory mendefinisikan siapa yang dikelola, maka playbook mendefinisikan apa yang harus dilakukan. Playbook adalah file YAML yang berisi instruksi terurut — instal paket ini, salin file ini, jalankan service ini — yang Ansible eksekusi terhadap host yang ditentukan. Playbook adalah cara kamu mengubah infrastruktur dari kondisi saat ini ke kondisi yang kamu inginkan, secara konsisten dan bisa diulang.
Dari Ad-hoc ke Playbook #
Sebelum membahas playbook, penting memahami perbedaannya dengan ad-hoc command — perintah Ansible yang dijalankan langsung dari command line tanpa file playbook:
# Ad-hoc command: cocok untuk satu aksi cepat
ansible webservers -m apt -a "name=nginx state=present" --become
# Playbook: cocok untuk rangkaian aksi yang terstruktur
ansible-playbook -i inventory/ setup-webserver.yml
Ad-hoc command tidak tersimpan, tidak bisa di-review, dan sulit diulang secara konsisten. Playbook adalah versi tertulis dari aksi-aksi tersebut — terdokumentasi, bisa masuk ke Git, dan bisa dijalankan kapan saja dengan hasil yang sama.
Anatomi Playbook #
Playbook terdiri dari satu atau lebih play. Setiap play menghubungkan sekumpulan host (dari inventory) dengan sekumpulan task.
---
# Tanda --- menandai awal dokumen YAML
# Ini adalah sebuah PLAY
- name: Setup web server # Nama play (opsional tapi sangat dianjurkan)
hosts: webservers # Target host dari inventory
become: true # Jalankan task dengan sudo
tasks: # Daftar task dalam play ini
- name: Install nginx # Nama task
apt: # Module yang digunakan
name: nginx
state: present
- name: Start nginx service
systemd:
name: nginx
state: started
enabled: true
- name: Copy konfigurasi nginx
template:
src: templates/nginx.conf.j2
dest: /etc/nginx/nginx.conf
notify: Reload nginx # Trigger handler saat task ini menghasilkan perubahan
handlers: # Handler dijalankan setelah semua task selesai
- name: Reload nginx # Hanya dijalankan jika di-notify
systemd:
name: nginx
state: reloaded
Dalam satu file playbook bisa ada beberapa play, masing-masing dengan target host yang berbeda:
---
- name: Setup web server
hosts: webservers
tasks:
- name: Install nginx
apt:
name: nginx
state: present
- name: Setup database server
hosts: dbservers
tasks:
- name: Install PostgreSQL
apt:
name: postgresql
state: present
Komponen Utama Play #
name — Label deskriptif untuk play. Ditampilkan saat playbook berjalan, memudahkan monitoring progres. Tidak wajib tapi sangat dianjurkan.
hosts — Menentukan host mana yang menjadi target play ini. Bisa berupa nama grup, nama host spesifik, pola, atau kombinasinya:
hosts: webservers # Semua host dalam grup webservers
hosts: web-01.example.com # Host spesifik
hosts: webservers:dbservers # Gabungan dua grup
hosts: webservers:!web-01 # Grup webservers kecuali web-01
hosts: all # Semua host di inventory
become — Aktifkan privilege escalation (sudo) untuk semua task dalam play ini:
become: true # Aktifkan sudo
become_user: root # Target user (default: root)
become_method: sudo # Method (default: sudo)
vars — Variabel yang didefinisikan langsung dalam play, berlaku untuk seluruh play:
vars:
app_port: 8080
deploy_user: deployer
gather_facts — Ansible secara default mengumpulkan informasi tentang managed node (OS, IP, memory, dll) di awal setiap play. Bisa dinonaktifkan untuk mempercepat eksekusi:
gather_facts: false # Nonaktifkan jika facts tidak diperlukan dalam play ini
Eksekusi Playbook #
Menjalankan playbook menggunakan perintah ansible-playbook:
# Jalankan playbook
ansible-playbook -i inventory/ playbook.yml
# Jalankan hanya untuk subset host
ansible-playbook -i inventory/ playbook.yml --limit webservers
# Dry run — tampilkan apa yang akan berubah tanpa benar-benar mengeksekusi
ansible-playbook -i inventory/ playbook.yml --check
# Dry run dengan detail perubahan
ansible-playbook -i inventory/ playbook.yml --check --diff
# Jalankan dari task tertentu (berguna saat resume setelah gagal)
ansible-playbook -i inventory/ playbook.yml --start-at-task "Copy konfigurasi nginx"
# Minta konfirmasi sebelum setiap task
ansible-playbook -i inventory/ playbook.yml --step
Output Playbook #
Saat playbook berjalan, Ansible memberikan feedback status untuk setiap task:
PLAY [Setup web server] ********************************************************
TASK [Gathering Facts] *********************************************************
ok: [web-01.example.com]
ok: [web-02.example.com]
TASK [Install nginx] ***********************************************************
changed: [web-01.example.com] ← ada perubahan (nginx diinstal)
ok: [web-02.example.com] ← tidak ada perubahan (sudah terinstal)
TASK [Start nginx service] *****************************************************
ok: [web-01.example.com]
ok: [web-02.example.com]
PLAY RECAP *********************************************************************
web-01.example.com : ok=3 changed=1 unreachable=0 failed=0
web-02.example.com : ok=3 changed=0 unreachable=0 failed=0
PLAY RECAP di akhir memberikan ringkasan per-host: berapa task yang ok (tidak ada perubahan), changed (ada perubahan), dan failed (gagal).
Playbook sebagai Dokumentasi #
Salah satu nilai terbesar playbook yang sering diabaikan adalah perannya sebagai dokumentasi infrastruktur yang dapat dieksekusi. Playbook yang ditulis dengan baik menceritakan apa yang dilakukan sistem tanpa perlu penjelasan terpisah:
---
- name: Setup production web server
hosts: webservers
become: true
tasks:
- name: Install nginx sebagai web server
apt:
name: nginx
state: present
- name: Install certbot untuk SSL
apt:
name: certbot
state: present
- name: Deploy konfigurasi nginx dari template
template:
src: templates/nginx.conf.j2
dest: /etc/nginx/nginx.conf
- name: Pastikan nginx berjalan dan aktif saat boot
systemd:
name: nginx
state: started
enabled: true
Siapa pun yang membaca playbook ini langsung memahami apa yang ada di server web production, tanpa harus SSH ke server dan memeriksa satu per satu.
Ringkasan #
- Playbook adalah file YAML berisi instruksi terurut yang Ansible eksekusi terhadap host dari inventory.
- Playbook terdiri dari satu atau lebih play — setiap play menghubungkan sekumpulan host dengan sekumpulan task.
- Ad-hoc command untuk aksi cepat sekali jalan; playbook untuk aksi yang perlu diulang, didokumentasikan, dan dikontrol versinya.
- Komponen utama play:
hosts,become,vars,tasks,handlers, dangather_facts.- Gunakan
--checkuntuk dry run sebelum menjalankan perubahan ke production.PLAY RECAPdi akhir eksekusi memberikan ringkasan status per-host:ok,changed,failed.- Playbook yang baik adalah dokumentasi infrastruktur yang dapat dieksekusi — nama task yang deskriptif adalah kuncinya.