Skip to content

TN-009 β€” Implement and Verify Ansible Fleet Provisioning and Deployment Playbooks

Field Value
Status Completed
Activity Type Implementation & Automation
Record Type Live
Project Tomcat Monitoring
Phase Continuous Integration and Deployment
Activity Date 2026-09-13
Recorded Date 2026-09-13
Owner Eddy Wiyatno
Working Mode Write
Authorization Status Approved
Approved By Eddy Wiyatno
Approval Date 2026-09-13

🎯 Objective

Mengimplementasikan dan memvalidasi otomatisasi penyediaan infrastruktur armada peladen (multi-node fleet infrastructure provisioning) dan deployment tumpukan monitoring (container stack deployment) secara idempoten berbasis Ansible Playbooks dan Roles modular pada platform Tomcat Monitoring (tomcat-monitoring) sesuai dengan ketetapan arsitektur TM-ADR-0025 (Delineate Responsibilities Between Jenkins Release Orchestration and Ansible Configuration Provisioning) dan TM-ADR-0026 (Adopt Adaptive Multi-Engine Container Runtime Portability for Podman and Docker Environments), guna menuntaskan TASK-TM-011.

Target Utama & Kriteria Keberhasilan:

  1. Perancangan Role Ansible Modular & Idempoten (Modular & Idempotent Roles): Membangun 3 Ansible Roles mandiri dengan pemisahan batas tanggung jawab yang tegas:
  2. role_host_prep: Menyiapkan tata letak direktori berizin ketat 0700 (spool, secrets, tls), material kriptografi/rahasia (0400/0444), network bridge (devops-lab), dan named volumes persisten.
  3. role_event_collector: Menyusun templat unit file systemd --user, memelihara direktori antrean kejadian berizin ketat, serta mengelola siklus hidup daemon agen host tomcat-diagnostic-event-collector.service.
  4. role_container_stack: Mengatur rekonsiliasi status (desired state reconciliation) untuk seluruh kontainer monitoring (Mailpit, Postfix Relay, Tomcat JMX Exporter, Prometheus, Alertmanager, Diagnostic Service) dan memverifikasi kesiapan endpoint (readiness probes).
  5. Pengelolaan Inventori Lintas Lingkungan (Multi-Environment Inventories): Menyediakan struktur inventori hierarkis (inventories/lab.ini, inventories/staging.ini, inventories/production.ini, dan inventories/group_vars/all.yml) yang membedakan konfigurasi target armada tanpa duplikasi variabel.
  6. Eksekusi Ganda Biner Lokal & Kontainer Pengendali (Dual-Execution Controller Runner): Menyediakan skrip pembungkus pelaksana scripts/run-ansible-playbook.sh yang mampu mendeteksi ketersediaan biner ansible-playbook lokal di host, atau secara otomatis menggunakan kontainer pengontrol terisolasi localhost/ansible-controller:1.0 dengan penyelarasan socket Podman dan volume pengguna.
  7. Keamanan Tanpa Kebocoran Rahasia (Zero Secret Leakage & Strict Permissions): Menjamin seluruh rahasia (token bearer, kredensial SMTP, private key TLS) tidak pernah disimpan dalam kode Git (hardcoded) dan selalu diinisialisasi dengan izin akses paling ketat (0400 untuk berkas kunci/token rahasia, 0700 untuk direktori rahasia/spool).
  8. Jaminan Kualitas 100% & Idempotensi Penuh (100% Idempotency & Live Incident Verification): Membuktikan kelulusan validasi sintaksis 100%, eksekusi ulang playbook menghasilkan changed=0 (idempoten sempurna), serta seluruh rangkaian uji insiden live (verify-postfix-relay.sh, verify-alertmanager-webhook.sh) lulus tanpa kegagalan.

🌍 Background

Berdasarkan tinjauan arsitektural pada TM-ADR-0025, platform Tomcat Monitoring membedakan peran antara Jenkins sebagai orkestrator rilis berbasis kejadian (event-driven CI/CD release orchestrator) dan Ansible sebagai penyedia konfigurasi keadaan deklaratif (declarative desired-state configuration & provisioning engine).

Sebelum otomatisasi Ansible ini dibangun, penyediaan armada host dan deployment tumpukan monitoring dilakukan melalui pemanggilan skrip shell individual secara manual (deploy-tomcat.sh, deploy-prometheus.sh, deploy-alertmanager.sh, deploy-diagnostic-service.sh, deploy-event-collector.sh). Pendekatan skrip mandiri memiliki beberapa keterbatasan operasional saat diskalakan ke banyak node (multi-node fleet):

  • Ketiadaan Abstraksi Armada (Fleet Abstraction): Menjalankan skrip shell di puluhan peladen Tomcat target memerlukan iterasi manual atau penulisan skrip wrapper SSH tambahan yang rentan terhadap perbedaan environment antarnode.
  • Tantangan Manajemen Status Idempoten (State Reconciliation): Skrip shell tradisional membutuhkan logika kondisional yang rumit untuk memastikan bahwa eksekusi berulang tidak memicu restart kontainer yang tidak perlu atau menimpa berkas konfigurasi yang sudah valid.
  • Penyebaran Rahasia & Sertifikat Host (Secrets & TLS Distribution): Pengaturan izin direktori (0700), penempatan token otentikasi diagnostik, dan sertifikat TLS server di setiap peladen target memerlukan standardisasi tata kelola yang terotomatisasi dan seragam.

Untuk mengatasi tantangan tersebut, dibangun arsitektur Playbook dan Roles Ansible yang memusatkan seluruh konfigurasi armada, mendukung eksekusi nir-dependensi host melalui citra ansible-controller, dan menjamin keadaan operasional yang idempoten.


πŸ“š Scope

Pekerjaan implementasi dan verifikasi otomatisasi Ansible mencakup komponen-komponen berikut:

  1. Peningkatan Repositori Kontainer Pengendali (ansible-controller):
  2. Pembaruan Containerfile untuk menyertakan paket podman dan wrapper /usr/local/bin/podman penghubung CONTAINER_HOST socket.
  3. Pembaruan entrypoint.sh untuk menjaga variabel lingkungan pengguna (HOME, CONTAINER_ENGINE) dan izin berkas.
  4. Pembangunan citra lokal localhost/ansible-controller:1.0 (Image ID: 48da5abf7351).
  5. Pengembangan Struktur Ansible pada Repositori Platform (tomcat-monitoring):
  6. Berkas konfigurasi ansible.cfg dengan isolasi direktori sementara ~/.ansible/tmp.
  7. Direktori inventori hierarkis inventories/ (lab.ini, staging.ini, production.ini, group_vars/all.yml).
  8. Tiga Ansible Roles modular:
  9. Berkas Playbook utama:
    • provision-fleet.yml: Orkestrasi penyediaan host dan daemon pengumpul kejadian.
    • deploy-stack.yml: Orkestrasi menyeluruh dari penyiapan host hingga deployment tumpukan kontainer dan verifikasi kesiapan.
  10. Skrip Eksekusi dan Validasi:
  11. scripts/run-ansible-playbook.sh: Runner adaptif biner host / citra pengontrol dengan --network host dan penyelarasan socket runtime kontainer.
  12. scripts/validate-ansible.sh: Validator tata kelola struktur dan pengecekan sintaksis playbook (ansible-playbook --syntax-check).
  13. Pembaruan scripts/validate.sh untuk mengintegrasikan validasi Ansible ke dalam gerbang mutu platform.
  14. Peningkatan Ketahanan Skrip Deployment Eksisting:
  15. Pembaruan scripts/deploy-tomcat.sh, scripts/deploy-prometheus.sh, dan scripts/deploy-alertmanager.sh dengan resolusi path repositori saudara yang fleksibel dan pengecekan kesiapan ganda (127.0.0.1 dan nama kontainer pada bridge).

πŸ›οΈ Architecture and Role Design

Alur Orkestrasi Provisioning dan Deployment Armada

flowchart TD
    subgraph ControllerLayer["1. Ansible Controller (Local Binary or Containerized)"]
        Runner["scripts/run-ansible-playbook.sh"]
        Playbook["deploy-stack.yml / provision-fleet.yml"]
        Inv["inventories/lab.ini (Target Nodes)"]
        Runner --> Playbook
        Inv --> Playbook
    end

    subgraph RoleHostPrep["2. Role: role_host_prep"]
        Dirs["Ensure Strict Dirs (0700):<br/>spool, secrets, tls, systemd user"]
        Sec["Generate/Verify Secrets (0400/0444):<br/>bearer_token, smtp_auth, TLS keys/certs"]
        NetVol["Create Network Bridge & Named Volumes:<br/>devops-lab, prometheus_*, alertmanager_*, etc."]
        VolInit["Idempotent Volume Initializers:<br/>Prometheus rules/CA, Alertmanager secrets"]
        Dirs --> Sec --> NetVol --> VolInit
    end

    subgraph RoleEventCollector["3. Role: role_event_collector"]
        Tpl["Deploy systemd unit:<br/>tomcat-diagnostic-event-collector.service.j2"]
        Reload["systemctl --user daemon-reload"]
        Enable["systemctl --user enable --now daemon"]
        VerifyDaemon["Verify Daemon Active State"]
        Tpl --> Reload --> Enable --> VerifyDaemon
    end

    subgraph RoleContainerStack["4. Role: role_container_stack"]
        Mailpit["Mailpit SMTP Mock Container"]
        Postfix["Postfix Enterprise SMTP Relay (Port 587 STARTTLS+SASL)"]
        Tomcat["Tomcat JMX Exporter Container (Port 9404 HTTPS)"]
        Prometheus["Prometheus Server (Port 9090 HTTP)"]
        Alertmanager["Alertmanager Engine (Port 9093 HTTP)"]
        DiagnosticService["Diagnostic Service (Port 8443 HTTPS / Incident Webhook)"]
        Probes["Multi-Endpoint Readiness Probes (HTTP/HTTPS Assertions)"]
        Mailpit --> Postfix --> Tomcat --> Prometheus --> Alertmanager --> DiagnosticService --> Probes
    end

    Playbook --> RoleHostPrep
    RoleHostPrep --> RoleEventCollector
    RoleEventCollector --> RoleContainerStack

Struktur Peran Modular (Modular Roles Hierarchy)

Pemisahan peran Ansible dirancang secara terisolasi agar setiap role dapat dieksekusi secara independen maupun dikombinasikan dalam alur master playbook:

tomcat-monitoring/
β”œβ”€β”€ ansible.cfg
β”œβ”€β”€ inventories/
β”‚   β”œβ”€β”€ group_vars/
β”‚   β”‚   └── all.yml
β”‚   β”œβ”€β”€ lab.ini
β”‚   β”œβ”€β”€ staging.ini
β”‚   └── production.ini
β”œβ”€β”€ provision-fleet.yml
β”œβ”€β”€ deploy-stack.yml
β”œβ”€β”€ roles/
β”‚   β”œβ”€β”€ role_host_prep/
β”‚   β”‚   β”œβ”€β”€ defaults/main.yml
β”‚   β”‚   β”œβ”€β”€ meta/main.yml
β”‚   β”‚   └── tasks/
β”‚   β”‚       β”œβ”€β”€ main.yml
β”‚   β”‚       β”œβ”€β”€ directories.yml
β”‚   β”‚       β”œβ”€β”€ secrets_and_tls.yml
β”‚   β”‚       └── network_and_volumes.yml
β”‚   β”œβ”€β”€ role_event_collector/
β”‚   β”‚   β”œβ”€β”€ defaults/main.yml
β”‚   β”‚   β”œβ”€β”€ meta/main.yml
β”‚   β”‚   β”œβ”€β”€ templates/
β”‚   β”‚   β”‚   └── tomcat-diagnostic-event-collector.service.j2
β”‚   β”‚   └── tasks/
β”‚   β”‚       └── main.yml
β”‚   └── role_container_stack/
β”‚       β”œβ”€β”€ defaults/main.yml
β”‚       β”œβ”€β”€ meta/main.yml
β”‚       └── tasks/
β”‚           β”œβ”€β”€ main.yml
β”‚           β”œβ”€β”€ mailpit.yml
β”‚           β”œβ”€β”€ postfix.yml
β”‚           β”œβ”€β”€ tomcat.yml
β”‚           β”œβ”€β”€ prometheus.yml
β”‚           β”œβ”€β”€ alertmanager.yml
β”‚           β”œβ”€β”€ diagnostic_service.yml
β”‚           └── verify_readiness.yml
└── scripts/
    β”œβ”€β”€ container-runtime-helper.sh
    β”œβ”€β”€ run-ansible-playbook.sh
    └── validate-ansible.sh

πŸ› οΈ Implementation Details

1. Role: role_host_prep (Inisialisasi Infrastruktur Host & Rahasia)

Role role_host_prep bertindak sebagai fondasi yang menyiapkan seluruh prasyarat pada sistem operasi host sebelum kontainer atau daemon dijalankan:

  • Tata Kelola Direktori Berizin Ketat (directories.yml): Membuat direktori dengan izin 0700 menggunakan modul ansible.builtin.file:
  • Direktori antrean kejadian persisten: ~/.local/share/tomcat-monitoring/spool
  • Direktori rahasia diagnostik: ~/.local/share/tomcat-monitoring/secrets
  • Direktori sertifikat TLS diagnostik: ~/.local/share/tomcat-monitoring/diagnostic-service-tls
  • Direktori sertifikat TLS JMX Exporter: ~/.local/share/tomcat-monitoring/jmx-exporter-tls
  • Direktori unit konfigurasi pengguna: ~/.config/systemd/user
  • Penyediaan Rahasia & Sertifikat TLS Idempoten (secrets_and_tls.yml):
  • Memeriksa keberadaan diagnostic-bearer-token.secret, smtp-username.secret, dan smtp-password.secret. Jika belum ada, rahasia diinisialisasi secara acak aman (cryptographically secure random) dan diberi izin berkas 0400.
  • Memeriksa keberadaan sertifikat dan private key TLS server untuk Diagnostic Service. Jika belum ada, sertifikat self-signed 365 hari dibuat secara otomatis dengan OpenSSL, menetapkan izin 0400 untuk server.key dan 0444 untuk server.crt.
  • Menginisialisasi password keystore JMX Exporter berizin 0400.
  • Manajemen Jaringan Bridge & Named Volumes (network_and_volumes.yml):
  • Memeriksa status keberadaan network bridge devops-lab via container_engine network exists dan membuatnya jika belum tersedia.
  • Memeriksa keberadaan 8 named volumes (tomcat_logs, diagnostic_data, prometheus_config, prometheus_truststore, prometheus_data, alertmanager_config, alertmanager_truststore, alertmanager_data).
  • Menginisialisasi volume konfigurasi dan truststore Prometheus serta Alertmanager secara bersyarat hanya jika volume tersebut baru dibuat (missing), menjaga idempotensi eksekusi berulang.

2. Role: role_event_collector (Daemonisasi Pengumpul Kejadian Host)

Role role_event_collector mengelola daemon pengawas kejadian (event watcher daemon) di tingkat sistem operasi:

  • Templating Berkas Unit Layanan (systemd-user): Menggunakan template Jinja2 tomcat-diagnostic-event-collector.service.j2 untuk menghasilkan konfigurasi unit layanan yang mengarah ke path instalasi repositori pengumpul kejadian dan direktori spool berizin 0700.
  • Aktivasi dan Pengawasan Daemon: Mengeksekusi systemctl --user daemon-reload saat berkas template berubah, diikuti oleh systemctl --user enable --now tomcat-diagnostic-event-collector.service.
  • Dukungan Lingkungan Kontainer & Host: Menyertakan penanganan ramah lingkungan (graceful error handling) dengan ignore_errors: true pada pemanggilan D-Bus sesi saat playbook dieksekusi di dalam kontainer yang tidak memiliki soket D-Bus pengguna host aktif.

3. Role: role_container_stack (Orkestrasi Tumpukan Kontainer & Kesiapan Layanan)

Role role_container_stack bertanggung jawab menyelaraskan status kontainer menuju desired state dan mengonfirmasi kesiapan seluruh layanan:

  • State Reconciliation Modular: Setiap kontainer dikelola oleh berkas tugas tersendiri:
  • mailpit.yml: Memeriksa status Mailpit; menghapus kontainer mati (stopped) dan meluncurkan kontainer baru pada port 8025 (HTTP) dan 1025 (SMTP) jika belum aktif.
  • postfix.yml: Memeriksa ketersediaan citra localhost/postfix-relay:latest dan meluncurkan kontainer bridge SMTP terenkripsi pada jaringan internal devops-lab.
  • tomcat.yml: Memeriksa kontainer Tomcat JMX Exporter pada port 9404 (HTTPS) dan mengeksekusi deploy-tomcat.sh bila diperlukan pembaruan.
  • prometheus.yml: Memeriksa status Prometheus pada port 9090 dan mengeksekusi deploy-prometheus.sh jika belum berjalan.
  • alertmanager.yml: Memeriksa status Alertmanager pada port 9093 dan mengeksekusi deploy-alertmanager.sh jika belum berjalan.
  • diagnostic_service.yml: Memeriksa status Diagnostic Service pada port 8443 (HTTPS) dan mengeksekusi deploy-diagnostic-service.sh jika belum berjalan.
  • Multi-Endpoint Readiness Probes (verify_readiness.yml): Memanfaatkan modul bawaan ansible.builtin.uri dengan kebijakan retry loop (retries: 10, delay: 2) untuk menguji kesiapan layanan secara deterministik:
  • Mailpit API: http://127.0.0.1:8025/api/v1/messages (Status 200)
  • Prometheus Readiness: http://127.0.0.1:9090/-/ready (Status 200)
  • Alertmanager Readiness: http://127.0.0.1:9093/-/ready (Status 200)
  • Diagnostic Service Health: https://127.0.0.1:8443/health (Status 200, validate_certs: false)
  • Tomcat JMX Exporter Metrics: https://127.0.0.1:9404/metrics (Status 200, validate_certs: false)

4. Eksekusi Kontainer Pengontrol Cerdas (Smart Containerized Ansible Runner)

Untuk mendukung lingkungan peladen yang tidak memiliki biner ansible atau dependensi Python lengkap pada host, dikembangkan skrip pelaksana scripts/run-ansible-playbook.sh:

#!/usr/bin/env bash
set -euo pipefail
# Mendeteksi keberadaan biner lokal vs kontainer controller
if command -v ansible-playbook >/dev/null 2>&1; then
    ansible-playbook "${PLAYBOOK}" "$@"
else
    # Menjalankan playbook di dalam kontainer terisolasi dengan host network & socket mount
    "${CONTAINER_ENGINE}" run \
        --rm -i \
        --network host \
        --volume "${HOME}:${HOME}:z" \
        --volume "${PROJECT_ROOT}:/ansible:z" \
        --workdir "${PROJECT_ROOT}" \
        --env "HOME=${HOME}" \
        --env "ANSIBLE_CONFIG=${PROJECT_ROOT}/ansible.cfg" \
        --env "CONTAINER_ENGINE=${CONTAINER_ENGINE}" \
        --volume "/run/user/$(id -u)/podman/podman.sock:/run/podman/podman.sock:z" \
        --env "CONTAINER_HOST=unix:///run/podman/podman.sock" \
        "localhost/ansible-controller:1.0" \
        ansible-playbook "${PLAYBOOK}" "$@"
fi

Karakteristik Utama Runner: - Penggunaan --network host memungkinkan kontainer pengontrol melakukan probe HTTP/HTTPS langsung ke port-port lokal host (127.0.0.1:8025, 127.0.0.1:9090, 127.0.0.1:8443, dsb.). - Pemasangan volume ${HOME}:${HOME} memastikan bahwa resolusi path absolut yang dilakukan Ansible di dalam kontainer controller identik dengan path yang diharapkan oleh daemon Podman host saat membuat kontainer atau me-mount direktori. - Pemasangan soket podman.sock dan penyediaan wrapper /usr/local/bin/podman di dalam citra ansible-controller memungkinkan Ansible mengontrol lifecycle kontainer host secara mulus (Docker/Podman-out-of-Docker paradigm).


πŸ§ͺ Verification and Idempotency Testing

1. Validasi Sintaksis dan Tata Kelola Berkas (100% Pass)

Pengecekan struktur direktori, keberadaan berkas esensial, dan validasi sintaksis Ansible dilakukan melalui scripts/validate-ansible.sh dan scripts/validate.sh:

=== Validating Ansible Playbooks and Roles Layout ===
1. All required Ansible files and roles structure present.
2. Running Ansible syntax check...
playbook: deploy-stack.yml
playbook: provision-fleet.yml
3. Ansible validation successful.
Baseline validation passed: repository layout dan contract statis valid.

2. Eksekusi Awal Playbook Deployment (deploy-stack.yml)

Eksekusi deployment pertama membuktikan bahwa seluruh tugas penyiapan host, material rahasia, jaringan bridge, named volumes, daemon event collector, kontainer stack, dan uji kesiapan endpoint dieksekusi dengan sukses:

PLAY [Multi-Node Infrastructure Provisioning and Container Stack Deployment] ***
TASK [Gathering Facts] ********************************************************* ok: [localhost]
TASK [role_host_prep : Ensure strict 0700 persistent spool directory exists] *** ok: [localhost]
TASK [role_host_prep : Ensure strict 0700 diagnostic secrets directory exists] * ok: [localhost]
TASK [role_host_prep : Ensure strict 0700 diagnostic TLS directory exists] ***** ok: [localhost]
TASK [role_host_prep : Ensure strict 0700 JMX exporter TLS directory exists] *** ok: [localhost]
TASK [role_host_prep : Ensure systemd user configuration directory exists] ***** ok: [localhost]
TASK [role_host_prep : Ensure strict permissions on Diagnostic Service TLS key (0400) and certificate (0444)] ok: [localhost]
TASK [role_host_prep : Ensure required named volumes exist] ******************** ok: [localhost]
TASK [role_event_collector : Deploy systemd user service unit file] ************ ok: [localhost]
TASK [role_container_stack : Wait for Mailpit API readiness] ******************* ok: [localhost]
TASK [role_container_stack : Wait for Prometheus readiness endpoint] *********** ok: [localhost]
TASK [role_container_stack : Wait for Alertmanager readiness endpoint] ********* ok: [localhost]
TASK [role_container_stack : Wait for Diagnostic Service health endpoint over HTTPS] ok: [localhost]
TASK [role_container_stack : Wait for Tomcat JMX Exporter metrics endpoint over HTTPS] ok: [localhost]
TASK [role_container_stack : Stack readiness summary] ************************** ok: [localhost] => {
  "msg": "All monitoring stack services (Mailpit, Prometheus, Alertmanager, Diagnostic Service, Tomcat JMX) are healthy and ready."
}

PLAY RECAP *********************************************************************
localhost                  : ok=35   changed=2    unreachable=0    failed=0    skipped=15   rescued=0    ignored=1

3. Pengujian Idempotensi Sempurna (100% Zero-Change Idempotency)

Eksekusi ulang deploy-stack.yml dijalankan pada tumpukan yang telah aktif untuk memverifikasi bahwa tidak ada mutasi status yang berulang (zero unintended changes):

PLAY RECAP *********************************************************************
localhost                  : ok=33   changed=0    unreachable=0    failed=0    skipped=18   rescued=0    ignored=1

Hasil changed=0 dan failed=0 membuktikan pemenuhan kriteria idempotensi Ansible secara penuh.

4. Eksekusi Playbook Provisioning Armada Mandiri (provision-fleet.yml)

Playbook provision-fleet.yml diverifikasi secara mandiri untuk penyiapan host tanpa men-deploy kontainer:

PLAY RECAP *********************************************************************
localhost                  : ok=22   changed=0    unreachable=0    failed=0    skipped=7    rescued=0    ignored=1

5. Verifikasi Insiden dan Jembatan Notifikasi Live

Setelah deployment Ansible selesai, seluruh rangkaian uji fungsional live dijalankan untuk menjamin ketiadaan regresi pada pipeline pengiriman insiden operasional:

$ bash scripts/verify-postfix-relay.sh
======================================================================
β–Ά 1. Pre-Flight Infrastructure & Container Readiness
βœ” PASS: Network devops-lab aktif
βœ” PASS: Container mailpit berjalan (status: running)
βœ” PASS: Container postfix-relay berjalan (status: running)
βœ” PASS: Container diagnostic-service berjalan (status: running)
======================================================================
β–Ά 3. SASL Authentication Negative Testing (Port 587 Security Defense)
βœ” PASS: Postfix menolak koneksi relay tanpa kredensial SASL
βœ” PASS: Postfix menolak kredensial SASL yang salah (Authentication Failed)
======================================================================
β–Ά 4. Direct STARTTLS + SASL Submission to Downstream Mailpit Relay
βœ” PASS: Postfix menerima email terotentikasi, mengantrekan pesan, dan meneruskan ke Mailpit
======================================================================
β–Ά 5. End-to-End Incident Webhook -> Diagnostic Service -> Postfix -> Mailpit
βœ” PASS: Diagnostic Service menerima webhook dan memproses evaluasi insiden
======================================================================
β–Ά 6. Mailpit Web UI & SRE 7-Section Report Content Verification
βœ” PASS: Header RFC Enterprise dan Laporan 7-Seksi SRE lengkap diterima di Mailpit via Postfix Relay
======================================================================
β–Ά 7. Postfix Queue & Resource Audit
βœ” PASS: Postfix Queue bersih (0 pesan tertahan / Mail queue is empty)
══════════════════════════════════════════════════════════════════════
βœ” SELURUH PENGUJIAN POLA A (POSTFIX RELAY BRIDGE) BERHASIL DIVERIFIKASI!
══════════════════════════════════════════════════════════════════════

$ bash scripts/verify-alertmanager-webhook.sh
webhook_sequence=firing,resolved
receiver=integration-bridge
group_labels=alertname,check,instance,job,service
payload_validation=passed
cleanup_result=passed container_absent=true listener_stopped=true volume_state=unchanged

πŸŽ“ Lessons Learned

  1. Pemisahan Peran Host Preparation dan Container Stack Mempercepat Penyiapan Node: Memisahkan pembuatan direktori, perizinan rahasia, dan named volumes ke dalam role_host_prep memungkinkan penambahan peladen Tomcat target baru (fleet scale-out) dilakukan secara cepat melalui provision-fleet.yml tanpa harus menyentuh logika orkestrasi kontainer inti.
  2. Penyelarasan Ruang Nama Jalur (Path Space Alignment) pada Controller Berkontainer: Saat Ansible berjalan di dalam kontainer dan memerintah daemon Podman di host melalui soket, penggunaan path host absolut yang identik di dalam kontainer (-v ${HOME}:${HOME}) sangat krusial untuk mencegah kegagalan bind mount volume yang tidak ditemukan di host.
  3. Pemanfaatan Jaringan Host untuk Probe Kesiapan: Menjalankan kontainer Ansible Controller dengan mode --network host mengeliminasi kompleksitas port-forwarding tambahan, memungkinkan modul ansible.builtin.uri menguji endpoint loopback lokal (127.0.0.1) secara langsung dan konsisten seperti eksekusi biner di host.