Debugging

Debugging #

Variabel yang nilainya tidak sesuai ekspektasi adalah salah satu sumber frustrasi paling umum saat bekerja dengan Ansible. Template yang menghasilkan nilai kosong, kondisi when yang selalu false padahal seharusnya true, atau playbook yang berperilaku berbeda di staging vs production — semuanya biasanya bersumber dari masalah variabel. Artikel ini membahas toolkit debugging yang tersedia di Ansible dan cara menggunakannya secara efektif.

Module debug: Alat Utama Debugging #

Module debug adalah cara paling langsung untuk memeriksa nilai variabel saat playbook berjalan:

# Tampilkan nilai satu variabel
- name: Cek nilai app_port
  debug:
    var: app_port

# Tampilkan pesan dengan interpolasi variabel
- name: Tampilkan informasi deployment
  debug:
    msg: "Deploying {{ app_name }} v{{ app_version }} ke {{ inventory_hostname }}"

# Tampilkan struktur data kompleks
- name: Inspeksi hasil task sebelumnya
  debug:
    var: nginx_config_check.stdout_lines

# Tampilkan semua variabel host (sangat verbose, gunakan dengan bijak)
- name: Dump semua variabel
  debug:
    var: hostvars[inventory_hostname]

Verbosity Level untuk debug #

Module debug mendukung parameter verbosity yang memungkinkan kamu menyembunyikan output debug kecuali saat menjalankan dengan flag -v:

tasks:
  - name: Deploy konfigurasi
    template:
      src: app.conf.j2
      dest: /etc/app/app.conf

  # Task ini hanya muncul saat ansible-playbook dijalankan dengan -vv atau lebih
  - name: Debug nilai konfigurasi (verbose only)
    debug:
      msg: "Config deployed with port={{ app_port }}, debug={{ app_debug }}"
      verbosity: 2
ansible-playbook site.yml          # Task debug tidak muncul
ansible-playbook site.yml -v       # verbosity 1 — tidak muncul (butuh 2)
ansible-playbook site.yml -vv      # verbosity 2 — MUNCUL
ansible-playbook site.yml -vvv     # verbosity 3 — muncul + lebih banyak info Ansible

Pola ini sangat berguna untuk menyematkan debug statement permanen di playbook tanpa membuat output normal menjadi berantakan.


Module assert: Validasi Sebelum Eksekusi #

Alih-alih menunggu task gagal karena nilai variabel salah, gunakan assert untuk memvalidasi nilai di awal playbook:

- name: Validasi variabel wajib sebelum deployment
  assert:
    that:
      - app_version is defined
      - app_version | length > 0
      - env in ['production', 'staging', 'development']
      - db_host is defined
      - app_port | int > 0
      - app_port | int < 65536
    fail_msg: >
      Variabel tidak valid!
      app_version={{ app_version | default('TIDAK TERDEFINISI') }},
      env={{ env | default('TIDAK TERDEFINISI') }}      
    success_msg: "Semua variabel valid, deployment dapat dilanjutkan"

assert langsung gagal dengan pesan yang jelas jika kondisi tidak terpenuhi — jauh lebih baik daripada menemukan kesalahan di tengah deployment.


Module fail: Gagal dengan Pesan yang Informatif #

fail memungkinkan kamu menghentikan playbook secara eksplisit dengan pesan error yang informatif:

- name: Cek disk space sebelum deployment
  command: df -BG /opt --output=avail
  register: disk_space
  changed_when: false

- name: Batalkan jika disk tidak cukup
  fail:
    msg: >
      Disk space tidak cukup untuk deployment!
      Tersedia: {{ disk_space.stdout_lines[1] | trim }}
      Minimal: 5GB diperlukan.
      Bebaskan disk space di {{ inventory_hostname }} sebelum melanjutkan.      
  when: disk_space.stdout_lines[1] | trim | replace('G', '') | int < 5

Debugging Precedence: Menemukan Dari Mana Nilai Berasal #

Saat nilai variabel berbeda dari yang diharapkan, ikuti langkah sistematis ini:

# Langkah 1: Lihat nilai aktual yang digunakan saat runtime
ansible -i inventory/ web-01 -m debug -a "var=app_port"

# Langkah 2: Lihat SEMUA variabel untuk host tersebut (cari duplikasi)
ansible -i inventory/ web-01 -m debug -a "var=hostvars['web-01']" | grep app_port

# Langkah 3: Periksa inventory variables
ansible-inventory -i inventory/ --host web-01 | python3 -m json.tool | grep app_port

# Langkah 4: Jalankan playbook dengan verbosity tinggi
ansible-playbook -i inventory/ site.yml -vvv 2>&1 | grep app_port

Checklist sumber variabel yang perlu dicek saat debugging:

Cek sumber ini secara berurutan (terendah ke tertinggi prioritas):
  □ roles/<name>/defaults/main.yml
  □ inventory/group_vars/all.yml
  □ inventory/group_vars/<group>.yml
  □ inventory/host_vars/<hostname>.yml
  □ playbook vars:
  □ roles/<name>/vars/main.yml
  □ task vars:
  □ set_fact yang mungkin di-set di task sebelumnya
  □ extra vars -e yang mungkin di-pass saat menjalankan

set_fact: Membuat Variabel Dinamis #

set_fact memungkinkan kamu membuat atau memodifikasi variabel saat runtime. Variabel yang di-set dengan set_fact bertahan untuk sisa play dan memiliki prioritas yang tinggi:

- name: Tentukan environment berdasarkan hostname
  set_fact:
    deployment_env: >-
      {{ 'production' if 'prod' in inventory_hostname
         else 'staging' if 'staging' in inventory_hostname
         else 'development' }}      

- name: Debug — verifikasi hasil set_fact
  debug:
    msg: "Host {{ inventory_hostname }} menggunakan env: {{ deployment_env }}"

- name: Set konfigurasi berdasarkan environment
  set_fact:
    app_log_level: "{{ 'warning' if deployment_env == 'production' else 'debug' }}"
    app_workers: "{{ 8 if deployment_env == 'production' else 2 }}"

Debugging Template Jinja2 #

Template yang menghasilkan nilai yang salah sering sulit di-debug. Gunakan debug untuk memverifikasi variabel sebelum template dirender:

- name: Debug variabel sebelum render template
  debug:
    msg:
      - "nginx_port = {{ nginx_port }}"
      - "nginx_workers = {{ nginx_worker_processes }}"
      - "ssl_enabled = {{ ssl_enabled | default(false) }}"
      - "upstream_hosts = {{ groups['appservers'] | map('extract', hostvars, ['ansible_default_ipv4', 'address']) | list }}"

- name: Render template nginx
  template:
    src: nginx.conf.j2
    dest: /etc/nginx/nginx.conf

Untuk template yang kompleks, kamu juga bisa render template ke file sementara di control node untuk diperiksa:

- name: Preview template sebelum deploy (dry run)
  template:
    src: nginx.conf.j2
    dest: /tmp/nginx.conf.preview
  delegate_to: localhost   # Render di control node
  check_mode: no

Ringkasan #

  • debug: var: untuk memeriksa nilai variabel, debug: msg: untuk pesan dengan interpolasi — alat utama debugging variabel.
  • Gunakan parameter verbosity: di module debug untuk menyematkan debug statement permanen yang hanya muncul saat menjalankan dengan -v.
  • assert untuk memvalidasi variabel wajib di awal playbook — gagal cepat dengan pesan yang jelas lebih baik dari gagal di tengah deployment.
  • fail untuk menghentikan playbook secara eksplisit dengan pesan error yang informatif saat kondisi berbahaya terdeteksi.
  • Saat debugging precedence: mulai dari ansible -m debug untuk melihat nilai aktual, lalu telusuri sumber dari prioritas terendah ke tertinggi.
  • set_fact untuk membuat variabel dinamis saat runtime — nilainya bertahan sepanjang play dan punya prioritas tinggi.

← Sebelumnya: Facts   Berikutnya: Apa itu Role? →

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