Mengatasi masalah dependency hell pada control node dengan containerized execution environments, membangun image environment yang konsisten dengan ansible-builder, menjalankan automasi berbasis container dengan ansible-navigator, dan mengenal AWX/Ansible Automation Platform untuk skala enterprise.

Setelah di episode 19 sebelumnya kita membahas integrasi Ansible ke dalam pipeline CI/CD dan kolaborasinya dengan Terraform, kalian sekarang sudah membayangkan bagaimana automasi berjalan di level organisasi. Namun ada satu masalah mendasar yang seringkali baru disadari ketika tim sudah berukuran puluhan engineer: environment yang berbeda antar mesin.
Pernahkah kalian mendengar kalimat "Di laptop saya jalan kok"? Itulah salah satu kutukan paling terkenal di dunia software engineering. Di dunia Ansible, kalimat itu biasanya berbunyi seperti ini: "Playbook ini jalan di mesin saya, kok di mesin kamu error?" Padahal penyebabnya seringkali sederhana: versi Python berbeda, versi ansible-core berbeda, collection yang belum di-install, atau library Python yang bentrok — yang dikenal sebagai dependency hell.
Episode 20 ini akan membawa kalian keluar dari masalah tersebut secara permanen. Kita akan membahas konsep Containerized Execution Environments (EE), lalu mempelajari dua tool andalan Red Hat Ansible: ansible-builder untuk membangun image container yang berisi seluruh environment Ansible, dan ansible-navigator untuk menjalankan automasi secara konsisten di dalam container. Terakhir, kita akan mengenal AWX / Ansible Automation Platform (AAP) — platform enterprise yang mengubah Ansible dari tool CLI menjadi sistem terpusat dengan web UI, REST API, RBAC, dan audit logging.
Mari kita lihat dengan jujur apa yang terjadi di tim yang mengelola infrastruktur dengan Ansible tanpa standardisasi environment.
Bayangkan tiga engineer bernama Adi, Budi, dan Cici:
ansible-core 2.14.ansible-core 2.19.community.postgresql versi tertentu, yang ternyata tidak kompatibel dengan versi yang dimiliki Adi.Ketika mereka mengerjakan playbook yang sama, hasilnya bisa berbeda-beda. Adi mendapat error deprecation, Budi malah error karena behavior berubah, Cici harus men-debug bug yang tidak bisa direproduksi. Ditambah lagi setiap engineer memakai sistem operasi berbeda — macOS, Ubuntu, Windows WSL — yang menambah variabel tak terduga.
Masalah ini bisa dirangkum dalam tiga kata: inkonsistensi, ketidakreproduksian, dan kerentanan. Playbook yang hanya diuji di satu mesin adalah bom waktu di produksi.
Pendekatan tradisional untuk menyelesaikannya adalah virtualenv per proyek. Tapi virtualenv hanya menyelesaikan isolasi Python, tidak menyelesaikan: versi sistem package, konfigurasi SSH, ketersediaan collections, atau keterbatasan library dengan dependensi native (misal psycopg2 yang butuh compiler saat instalasi).
Solusi modern yang dipakai industri adalah containerization dari seluruh environment. Ini bukan konsep baru — Docker sudah mengajarkannya untuk aplikasi — dan sekarang paradigma yang sama diterapkan ke Ansible.
Execution Environment (EE) adalah image container yang berisi semua yang dibutuhkan untuk menjalankan automasi Ansible: ansible-core, collections, library Python, dependensi sistem, dan tool pendukung. Bayangkan EE sebagai "kitchen set lengkap yang bisa dibawa bepergian": semua peralatan, bahan, dan resep sudah di dalam satu kotak. Siapa pun yang membuka kotak itu akan mendapatkan dapur yang persis sama.
Keuntungan utama EE sangat jelas:
| Keuntungan | Penjelasan |
|---|---|
| Konsistensi | Semua engineer dan CI menjalankan image yang sama, versi yang sama, dependency yang sama |
| Reproduksibilitas | Bug yang muncul di produksi bisa direproduksi di lokal dengan image yang identik |
| Onboarding cepat | Engineer baru cukup menjalankan container, tanpa install Ansible manual |
| Keamanan & audit | Image bisa di-scan kerentanannya dan di-review sebagai kode |
| Rollback mudah | Versi image yang bermasalah bisa langsung di-ganti |
Di ekosistem Red Hat, ada tiga layer tooling yang bekerja bersama: ansible-builder (membangun image), ansible-navigator (menjalankan image), dan AWX/AAP (menjadwalkan dan mengelola eksekusi image di banyak node). Kita akan bahas ketiganya satu per satu.
ansible-builder adalah tool yang mengambil definisi environment dalam YAML dan mengubahnya menjadi image container yang siap pakai. Ia membangun di atas image dasar ansible-runner dan menyuntikkan dependensi yang kalian definisikan.
pipx install ansible-builderansible-builder --versionexecution-environment.ymlInti dari ansible-builder adalah file execution-environment.yml. File ini memiliki tiga bagian utama: build_arg_defaults, dependencies, dan images:
---
version: 3
build_arg_defaults:
ANSIBLE_GALAXY_CLI_COLLECTION_OPTS: "--force"
dependencies:
galaxy: requirements.yml
python: requirements.txt
system: bindep.txt
images:
base_image:
name: quay.io/ansible/ansible-runner:latest
additional_build_steps:
prepend_final: |
RUN whoamiMari kita bedah tiap bagian:
| Bagian | Fungsi | Contoh Isi |
|---|---|---|
dependencies.galaxy | Collections Ansible yang di-install dari Galaxy | File requirements.yml |
dependencies.python | Library Python yang dibutuhkan modul | File requirements.txt |
dependencies.system | Package sistem yang dibutuhkan (dengan marker distribusi) | File bindep.txt |
images.base_image | Image dasar yang dipakai (default ansible-runner) | Registry image |
additional_build_steps | Langkah build tambahan yang disuntikkan ke Containerfile | Perintah RUN/COPY |
File dependensi yang dirujuk disimpan di direktori yang sama:
---
collections:
- name: community.postgresql
version: "3.5.0"
- name: community.general
version: "9.2.0"psycopg2-binary==2.9.9
jmespath==1.0.1libpq-devTip
Selalu pin versi di semua file dependensi — baik collection, library Python, maupun image dasar. Versi yang tidak dipin adalah sumber utama ketidakreproduksian. Image yang sama harus bisa dibangun ulang bulan depan dengan hasil yang sama persis.
Dengan file execution-environment.yml dan dependensinya di satu direktori, jalankan:
ansible-builder build \
--tag quay.io/acme/ee-devnull:latest \
--container-runtime dockerPerintah ini menghasilkan struktur direktori context/ berisi Containerfile dan semua file dependensi, lalu mengeksekusi build:
Ansible Builder is building your execution environment image.
The build context can be found at: context/
Complete! The build context can be found at: context/
Tag: quay.io/acme/ee-devnull:latestSetelah selesai, image bisa di-push ke registry:
docker push quay.io/acme/ee-devnull:latestNote
EE dibangun di atas ansible-runner, yang menyediakan runtime untuk menjalankan playbook secara terisolasi. Dengan menyimpan image di registry (misal Quay.io, Docker Hub, atau registry internal), seluruh tim dan CI bisa memakai image yang sama persis — masalah "works on my machine" hilang seketika.
Jika ansible-builder membangun "dapur", maka ansible-navigator adalah cara untuk "memasak" di dalamnya. ansible-navigator adalah CLI yang menjalankan Ansible di dalam container EE, lengkap dengan TUI (Text User Interface) untuk navigasi interaktif.
Keunggulan ansible-navigator: kalian tidak perlu menginstal Ansible sama sekali di mesin. Yang dibutuhkan hanyalah ansible-navigator dan container runtime (Docker/Podman).
pipx install ansible-navigatorMenjalankan playbook dengan ansible-navigator:
ansible-navigator run playbooks/deploy.yml -i inventory/production.ymlBukan hanya playbook, ansible-navigator juga membungkus berbagai perintah Ansible lainnya:
ansible-navigator doc ansible.builtin.aptKonfigurasi default disimpan dalam file ansible-navigator.yml. Di sini kalian menentukan image EE yang dipakai, mode output, level logging, dan environment variable yang diteruskan:
---
ansible-navigator:
execution-environment:
enabled: true
image: quay.io/acme/ee-devnull:latest
pull-policy: missing
container-engine: docker
environment-variables:
pass:
- AWS_PROFILE
- AWS_ACCESS_KEY_ID
- AWS_SECRET_ACCESS_KEY
playbook-artifact:
enable: false
logging:
level: warning
mode: stdoutPoin penting dari konfigurasi di atas:
image menunjuk EE yang kita bangun dengan ansible-builder. Semua engineer cukup memakai file ini dan image yang sama.environment-variables.pass menentukan env var yang diizinkan diteruskan dari host ke container — cara yang aman untuk menyuntikkan kredensial tanpa menyimpannya di image.mode: stdout membuat output diformat seperti CLI Ansible biasa. Mode default (interaktif) menampilkan TUI yang bisa dinavigasi dengan keyboard — sangat membantu saat menelusuri hasil task satu per satu.pull-policy: missing artinya image hanya di-pull jika belum ada di lokal, mempercepat eksekusi berulang.Warning
Perhatikan daftar environment-variables.pass — ini adalah allowlist. Env var di luar daftar tidak akan diteruskan ke container. Ini sengaja dirancang agar kredensial tidak bocor ke image atau ke proses yang tidak membutuhkannya. Prinsipnya sama dengan secrets di CI yang kita bahas di episode 19: hanya berikan akses yang benar-benar diperlukan.
Dalam mode interaktif, ansible-navigator menampilkan tampilan layar penuh dengan panel-panel:
ok/changed/failed.Fitur ini sangat berguna saat debugging playbook yang panjang: kalian tidak perlu menebak-nebak dari log teks panjang, cukup navigasi langsung ke task yang gagal dan melihat konteksnya.
| Tombol | Fungsi |
|---|---|
: + st | Tampilkan semua task beserta statusnya |
: + :h | Help untuk perintah |
Esc | Kembali ke tampilan sebelumnya |
Ctrl+C | Batalkan eksekusi |
Tip
Jangan terintimidasi oleh TUI. Untuk penggunaan sehari-hari, mode: stdout sudah cukup nyaman. Mode interaktif menjadi senjata pamungkas saat kalian perlu menelusuri hasil eksekusi yang rumit secara visual — praktik yang sering dipakai engineer saat debugging insiden.
Di level ini, kita berbicara tentang banyak engineer, banyak project, dan kebutuhan akan kontrol. ansible-navigator tetap berjalan di laptop masing-masing engineer; untuk organisasi besar, Red Hat menyediakan Ansible Automation Platform (AAP), dengan AWX sebagai versi upstream open-source-nya.
AWX/AAP mengubah Ansible dari tool CLI menjadi platform terpusat dengan Web UI dan REST API. Bayangkan AWX sebagai "gedung pusat kontrol" tempat semua eksekusi Ansible diawasi, dijadwalkan, dan diaudit — alih-alih dijalankan secara tersebar dan tak terkontrol di laptop pribadi.
| Fitur | Fungsi |
|---|---|
| Web UI & REST API | Mengelola dan mengeksekusi playbook melalui browser atau API |
| RBAC (Role-Based Access Control) | Membatasi siapa yang boleh melihat/menjalankan project, inventory, dan job template |
| Job Scheduling | Menjadwalkan eksekusi otomatis, misal backup setiap hari pukul 02.00 |
| Credentials Store | Menyimpan SSH key, cloud credentials, dan vault password secara terpusat dan terenkripsi |
| Inventory Management | Mengelola inventory terpusat, termasuk sync dari dynamic inventory cloud |
| Audit Logging | Mencatat semua aktivitas: siapa, kapan, apa yang dijalankan, dan hasilnya |
Mari kita analogikan dengan dunia nyata: kalau laptop engineer itu seperti mobil pribadi (fleksibel tapi tak terkontrol), maka AWX itu seperti sistem transportasi kota — semua kendaraan terdaftar, ada rute resmi, jadwal, dan rekaman perjalanan. Tidak ada yang bisa "membawa mobil pribadi" masuk ke jalan raya produksi tanpa izin.
Job Template adalah konsep inti AWX: sebuah paket lengkap berisi project (repo Git), inventory, credentials, dan opsi eksekusi. Alurnya:
Sebagai contoh, menjalankan job template melalui REST API (bisa dipanggil dari pipeline CI/CD):
curl -X POST https://awx.example.com/api/v2/job_templates/5/launch/ \
-H "Authorization: Bearer $AWX_TOKEN" \
-H "Content-Type: application/json" \
-d '{"extra_vars": {"environment": "production"}}'Important
Karena AWX punya REST API, ia bisa menjadi ujung akhir (executor) dari pipeline CI/CD yang kita bangun di episode 19. Alih-alih CI mengeksekusi ansible-playbook langsung, CI cukup memanggil API AWX untuk meluncurkan job template. Semua eksekusi tersentralisasi di AWX, tercatat, dan tunduk pada RBAC — ini pola yang sangat umum di organisasi besar.
AWX didesain berjalan di Kubernetes dan diinstal melalui operator. Contoh singkat setelah cluster Kubernetes siap:
kubectl create ns awx
kubectl apply -f https://raw.githubusercontent.com/ansible/awx-operator/release/deploy/awx-operator.yamlKemudian buat instance AWX dengan Custom Resource:
---
apiVersion: awx.ansible.com/v1beta1
kind: AWX
metadata:
name: awx
namespace: awx
spec:
service_type: nodeportSetelah beberapa menit, UI AWX bisa diakses dan kalian bisa mengatur admin, organisasi, lalu mulai membuat project dan job template.
Sekarang kita punya gambaran lengkap. Mari kita bandingkan ketiga pendekatan dalam satu tabel:
| Kemampuan | ansible CLI | ansible-navigator | AWX / AAP |
|---|---|---|---|
| Lokasi eksekusi | Control node lokal | Container EE (di laptop) | Container EE (job node terpusat) |
| Web UI & REST API | Tidak | Tidak | Ya |
| RBAC (hak akses per pengguna) | Tidak | Tidak | Ya |
| Credential store terpusat | Tidak (SSH/Vault manual) | Tidak (SSH/Vault manual) | Ya, terenkripsi & terkunci |
| Job scheduling | Cron / pipeline | Via pipeline | Ya, built-in |
| Audit log & approval | Terbatas | Terbatas | Ya, lengkap |
| Kolaborasi multi-tim | Sulit | Sulit | Terpusat & terisolasi |
| Cocok untuk | 1–2 engineer, lab | 1–2 engineer, konsistensi | Enterprise, banyak tim |
Note
Ini bukan perlombaan "yang terbaik", melainkan pilihan sesuai skala. Untuk proyek pribadi atau lab, ansible CLI saja sudah cukup. Untuk tim yang ingin konsistensi antar engineer, ansible-navigator + ansible-builder adalah langkah maju yang besar. Untuk organisasi yang butuh kontrol, audit, dan kolaborasi lintas tim, AWX/AAP adalah jawabannya.
Mengadopsi execution environments tidak lepas dari jebakan. Berikut yang paling sering ditemui:
1. Image yang tidak dipin versi-nya. Tanpa pin versi, EE yang dibangun hari ini dan bulan depan bisa berbeda isinya. Selalu pin versi di requirements.yml, requirements.txt, bindep.txt, dan tag image dasar.
2. Lupa menginstal dependensi sistem. Library Python seperti psycopg2 atau cryptography sering membutuhkan package sistem (misal libpq-dev). Jika tidak ada di bindep.txt, instalasi library gagal di tengah build. Uji build image secara rutin.
3. Secret yang tertanam di image. Jangan pernah meletakkan kredensial di dalam EE image. Gunakan mekanisme inject saat runtime, seperti environment-variables.pass di ansible-navigator atau credentials store di AWX.
4. Menjalankan ansible-navigator tanpa EE yang benar. Jika image salah atau pull-policy tidak tepat, eksekusi bisa memakai image yang salah secara diam-diam. Selalu verifikasi image yang dipakai sebelum menjalankan playbook produksi.
5. Menganggap AWX = install sekali jadi. AWX membutuhkan perawatan: backup database, upgrade operator, dan manajemen kredensial. Ini bukan alat yang bisa ditinggalkan begitu saja.
Pada episode 20 ini, kita telah membawa kalian dari masalah klasik dependency hell di control node menuju solusi modern yang dipakai industri. Kita sudah memahami Containerized Execution Environments sebagai cara untuk memastikan semua engineer dan CI menjalankan environment yang persis sama, lalu mempelajari ansible-builder untuk membangun image EE dari execution-environment.yml, ansible-navigator untuk menjalankan automasi di dalam container dengan TUI yang nyaman, dan terakhir AWX / Ansible Automation Platform untuk skala enterprise dengan RBAC, job scheduling, credentials store, dan audit logging.
Poin kunci yang perlu kalian bawa pulang:
ansible-core, collections, library Python, dan dependensi sistem dalam satu image yang reproducible.ansible-builder membangun image, ansible-navigator menjalankannya secara konsisten.Di episode 21 selanjutnya kita akan kembali ke level teknis yang lebih dalam dengan topik Advanced Inventory Management & Dynamic Inventory. Kita akan membedah implementasi dynamic inventory untuk AWS, Google Cloud, Azure, dan VMware, mempelajari cara memfilter instance berdasarkan tag dan region, membuat grouping otomatis, hingga menulis custom inventory script yang terintegrasi dengan CMDB seperti NetBox. Ini akan melengkapi pengetahuan kalian tentang bagaimana inventory dikelola di dunia nyata yang penuh dengan server yang lahir dan mati setiap saat. Pastikan tetap semangat!