Apa itu Playbook?

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, dan gather_facts.
  • Gunakan --check untuk dry run sebelum menjalankan perubahan ke production.
  • PLAY RECAP di 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.

← Sebelumnya: Best Practice   Berikutnya: Struktur →

About | Author | Content Scope | Editorial Policy | Privacy Policy | Disclaimer | Contact