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.assertuntuk memvalidasi variabel wajib di awal playbook — gagal cepat dengan pesan yang jelas lebih baik dari gagal di tengah deployment.failuntuk menghentikan playbook secara eksplisit dengan pesan error yang informatif saat kondisi berbahaya terdeteksi.- Saat debugging precedence: mulai dari
ansible -m debuguntuk melihat nilai aktual, lalu telusuri sumber dari prioritas terendah ke tertinggi.set_factuntuk membuat variabel dinamis saat runtime — nilainya bertahan sepanjang play dan punya prioritas tinggi.