Membawa Ansible dari tim kecil ke skala enterprise: arsitektur terpusat dengan AWX/AAP/Semaphore, pola GitOps, strategi monorepo vs multi-repo, RBAC dan credential management, hingga optimasi performa ribuan host dengan callback plugin, Mitogen, serial dan forks.

Setelah di episode 28 sebelumnya kita membahas Windows automation — mengelola WinRM, IIS, Active Directory, dan Windows Update dari control node yang sama — pada episode kali ini kita naik satu level lebih tinggi: bagaimana membawa Ansible dari "bisa jalan di laptop developer" menjadi "platform automation kelas enterprise yang dikelola banyak tim".
Perjalanan Ansible itu seperti restoran. Ketika baru buka, satu juru masak bisa merangkap koki, kasir, dan pelayan — cukup satu dapur kecil dan beberapa menu. Tapi ketika pelanggan membludak dan tim bertambah, kalian butuh koki kepala yang mengatur menu, divisi yang memisahkan dapur dari ruang makan, sistem pemesanan terpusat, hingga standar kebersihan yang diaudit. Kalau tidak, chaos: menu ganda di dua cabang, resep berbeda di setiap chef, dan tidak ada yang tahu siapa yang boleh mengubah resep.
Kebanyakan tim Ansible mulai seperti dapur kecil: satu developer menjalankan ansible-playbook dari laptop, inventory di file lokal, semua orang punya akses ke production. Ini berjalan mulus sampai angka host dan anggota tim bertambah. Maka muncul pertanyaan-pertanyaan klasik: Siapa yang menjalankan playbook ke production? Bagaimana caranya memisahkan konfigurasi dev dan prod tanpa duplikasi? Bagaimana caranya satu playbook menjangkau ribuan host tanpa lambat? Bagaimana memastikan hanya orang tertentu yang boleh mengubah secret?
Pada episode ini kita akan membahas empat pilar scaling: arsitektur enterprise (AAP/AWX/Semaphore, GitOps, distributed execution), struktur repository (monorepo vs multi-repo, environment segregation), kontrol akses dan delegasi (RBAC, credential management, audit logging), serta performa di skala besar (callback plugin, Mitogen, serial/forks).
Saat Ansible dikelola tim kecil, control node adalah laptop siapa pun yang membutuhkan. Ini tidak scalable karena tiga alasan: tidak ada audit trail (siapa yang menjalankan apa), tidak ada sentralisasi kredensial (password tersebar di laptop), dan tidak ada konkurensi yang aman (dua orang bisa menjalankan playbook yang bentrok).
Solusinya adalah control node terpusat: sebuah platform yang menjalankan playbook atas nama tim, menyimpan kredensial dengan aman, dan mencatat setiap eksekusi. Berikut pilihan utamanya:
| Platform | Tipe | Fitur Kunci | Ideal Untuk |
|---|---|---|---|
| AWX | Open Source (komunitas) | Web UI, RBAC, credential store, job scheduling, REST API | Tim yang butuh full control tanpa biaya lisensi |
| Ansible Automation Platform (AAP) | Enterprise (Red Hat) | Semua fitur AWX + support SLA, execution environments, automation mesh | Perusahaan yang butuh dukungan vendor & compliance |
| Semaphore | Open Source (ringan) | Web UI sederhana, scheduling, integrasi Git | Tim kecil-menengah yang mau sederhana |
| Rundeck | Open Source | Job orchestration, RBAC, plugin ecosystem | Tim yang sudah terbiasa dengan job scheduler |
Note
Ingat episode 20 — kita sudah berkenalan dengan AWX/AAP, execution environments, dan ansible-navigator. Episode ini memperdalam: bagaimana platform tersebut menjadi pusat dari setiap eksekusi automation perusahaan, lengkap dengan RBAC dan audit logging. Prinsipnya sama untuk AWX maupun AAP: Git adalah source of truth, platform yang mengeksekusi, dan manusia tidak pernah login langsung ke server.
Pola arsitektur yang umum di enterprise:
awx / ansible-runner), atau REST API. Tidak ada playbook yang dijalankan dari laptop ke production.Pertanyaan arsitektur repository yang paling sering diperdebatkan. Masing-masing punya trade-off:
| Aspek | Monorepo | Multi-Repo |
|---|---|---|
| Kemudahan pencarian & review | Semua kode dalam satu tempat, mudah cross-reference | Harus berpindah antar repository |
| Atomic changes | Perubahan lintas komponen dalam satu commit | Butuh beberapa PR yang terkoordinasi |
| Isolasi & pembatasan akses | Akses default ke semuanya; butuh path-based auth | Akses per-repo lebih mudah dibatasi |
| Ukuran & performa CI | Satu pipeline besar, checkout lambat | Pipeline kecil dan terfokus per repo |
| Governance & audit | Satu source of truth yang rapi | Berpotensi drift antar repo |
| Cocok untuk | Tim kecil-menengah, automation monolitik, IaC satu tim | Tim besar/independen, collection publik, product dengan batas domain tegas |
Tip
Aturan praktis dari pengalaman lapangan: mulailah dengan monorepo sampai automation mulai "pecah" secara alamiah (banyak tim dengan ritme release berbeda, atau perlu mem-publish collection ke tim lain). Memecah monorepo jadi multi-repo jauh lebih mudah daripada menggabungkan multi-repo yang sudah terlanjur drift. Untuk enterprise besar, pola hibrida umum: repository utama untuk inventory/playbook + repository terpisah untuk collection internal dan role yang dipublish ke internal Galaxy.
Contoh struktur monorepo enterprise yang membagi perhatian dengan rapi — perhatikan separation of concerns: inventory, playbooks, roles, collections, dan environment config semua di tempatnya masing-masing:
ansible-platform/
├── ansible.cfg
├── requirements.yml
├── inventory/
│ ├── production/
│ │ ├── hosts.yml
│ │ └── group_vars/
│ │ ├── webservers.yml
│ │ └── dbservers.yml
│ ├── staging/
│ │ ├── hosts.yml
│ │ └── group_vars/
│ └── dev/
│ ├── hosts.yml
│ └── group_vars/
├── playbooks/
│ ├── site.yml
│ ├── security-hardening.yml
│ └── windows-patching.yml
├── roles/
│ ├── nginx-website/
│ └── postgres-cluster/
├── collections/
│ └── internal/
│ └── platform-utils/
├── vault/
│ └── prod.secrets.yml
├── .github/workflows/ci.yml
└── docs/
└── runbooks.mdImportant
Prinsip yang tidak bisa ditawar: inventory production harus berbeda secara fisik dari staging/dev, bukan sekadar variabel berbeda. Kalau kalian menggunakan satu file inventory dengan group production dan dev, satu salah ketik pada host pattern (all alih-alih dev) bisa mengirim playbook pengujian ke production. Pisahkan file inventory, pisahkan group_vars, dan pisahkan credential — di sinilah Ansible Vault dengan vault ID berbeda (episode 14) berperan besar.
Memisahkan environment bukan hanya soal folder, tapi juga soal mekanisme keamanan yang mencegah silang environment. Praktik yang direkomendasikan:
ansible-vault encrypt --vault-id prod@prod.pass dan --vault-id dev@dev.pass.- name: Site deployment
hosts: "{{ target | default('all') }}"
gather_facts: true
pre_tasks:
- name: Wajib menentukan environment target
ansible.builtin.assert:
that: env in ['dev', 'staging', 'production']
fail_msg: "Set --extra-vars 'env=production' secara eksplisit!"
when: env is definedDan contoh pemanfaatan group_vars per environment untuk memisahkan konfigurasi tanpa duplikasi playbook:
env: production
app_replicas: 8
log_level: warning
nginx_conf:
worker_processes: auto
keepalive_timeout: 65Dengan pola ini, playbook yang sama (site.yml) menghasilkan deployment yang benar di setiap environment hanya dengan mengarahkan ke inventory yang tepat:
ansible-playbook -i inventory/dev/hosts.yml playbooks/site.yml
ansible-playbook -i inventory/staging/hosts.yml playbooks/site.yml \
--vault-id staging@staging.pass
ansible-playbook -i inventory/production/hosts.yml playbooks/site.yml \
--vault-id prod@prod.pass --limit "webservers"Di perusahaan besar, tidak semua orang berhak menjalankan playbook ke production. Ini dijawab dengan RBAC (Role-Based Access Control). Di AWX/AAP, hierarki RBAC-nya adalah:
Berkat model ini, delegasi menjadi rapi: tim SRE boleh execute template patching ke staging, tapi hanya read di production; akun service CI boleh memicu template tertentu; dan tidak ada seorang pun yang perlu menyentuh SSH key mentah.
Credential management adalah titik paling kritis. Prinsipnya:
host_vars plaintext.no_log: true — pastikan task yang menangani rahasia tidak menulisnya ke output job; audit log platform akan menyimpan siapa yang memakai credential apa, bukan isinya.Audit logging & compliance: setiap job run di AWX/AAP tercatat lengkap — siapa pemicunya, template apa, credential mana, output lengkap, dan status sukses/gagal. Ini adalah fondasi compliance (ingat episode 27): kalau auditor bertanya "siapa yang mengubah konfigurasi firewall production semalam?", jawabannya ada di audit log, bukan tebakan.
Warning
RBAC hanya berarti jika execution benar-benar melalui platform. Jika engineer tetap bisa menjalankan ansible-playbook langsung ke production dari laptop mereka, seluruh RBAC dan audit logging hanyalah hiasan. Di enterprise yang sehat, kredensial production tidak pernah keluar dari credential store platform, dan jaringan production menolak koneksi SSH dari IP selain control node (ingat firewall dari episode 27).
Berurusan dengan ribuan host adalah tantangan performa. Beberapa pengaturan kunci:
forks — jumlah proses paralel default. Nilai default 5 terlalu kecil; naikkan sesuai kapasitas control node. Menaikkan forks biasanya efek pertama yang paling terasa.serial — membatasi berapa banyak host yang diproses per gelombang; untuk patching atau rollout bertahap.throttle — membatasi konkurensi pada level task, bukan play; berguna untuk API yang membatasi rate (misalnya restart satu per satu).Contoh pengaturan global di ansible.cfg:
[defaults]
forks = 50
gathering = smart
fact_caching = jsonfile
fact_caching_connection = /tmp/facts_cache
fact_caching_timeout = 3600
[ssh_connection]
pipelining = trueTip
Tiga pengaturan di atas adalah "paket hemat" standar untuk skala besar: forks = 50 untuk paralelisme, pipelining = true untuk mengurangi overhead koneksi SSH (sejak episode 15 kita sudah bahas ini), dan fact caching agar Ansible tidak menggali facts ribuan host setiap kali playbook berjalan. Bersama-sama mereka bisa memangkas waktu eksekusi hingga puluhan persen. Untuk playbook yang tidak butuh facts sama sekali, gather_facts: false di level play juga menghemat banyak.
Contoh batching yang benar untuk rollout bertahap — kombinasi serial dengan persentase dan persentase max_fail_percentage:
- name: Rolling update ribuan host
hosts: webservers
become: true
serial: "20%"
max_fail_percentage: 10
tasks:
- name: Deploy versi aplikasi terbaru
ansible.builtin.service:
name: webapp
state: restartedAtau throttle untuk kontrol per-task yang lebih halus:
- name: Restart service satu per satu
hosts: all
throttle: 1
tasks:
- name: Restart nginx (hanya 1 host pada satu waktu)
ansible.builtin.service:
name: nginx
state: restartedDefault output Ansible (default callback) cukup untuk eksperimen, tapi di enterprise sering ingin lebih: melihat durasi per task, format YAML yang lebih rapi, atau integrasi dengan sistem eksternal. Di sinilah callback plugin berperan — mereka mengubah cara Ansible melaporkan hasil eksekusi.
Callback yang umum dipakai:
| Callback Plugin | Fungsi |
|---|---|
default | Output standar (per task OK/CHANGED) |
yaml | Output gaya YAML yang lebih terbaca manusia |
timer | Menampilkan durasi tiap task & play |
junit | Menghasilkan laporan JUnit XML — untuk integrasi CI (episode 19) |
json | Output dalam format JSON — untuk pipeline & otomasi |
minimal | Output super ringkas untuk log besar |
profile_tasks | Profiling durasi per-task, berguna untuk menemukan bottleneck |
Mengaktifkan callback untuk menampilkan durasi (timer) dan output YAML yang rapi:
[defaults]
stdout_callback = yaml
callback_whitelist = timer, profile_tasks
[callback_profile_tasks]
sort_order = descendingDengan profile_tasks, di akhir playbook kalian akan melihat tabel top slowest tasks — senjata utama untuk menemukan task mana yang jadi bottleneck saat menjalankan playbook di ribuan host. Untuk integrasi laporan ke CI, gunakan junit:
ANSIBLE_STDOUT_CALLBACK=junit \
ansible-playbook -i inventory/production/hosts.yml playbooks/site.ymlOutput JUnit-nya bisa langsung dikonsumsi oleh pipeline GitLab CI / GitHub Actions untuk test report, sehingga automation Ansible menjadi bagian dari quality gate perusahaan.
Ketika Ansible sudah dioptimalkan tapi masih terasa lambat — biasanya karena overhead proses Python yang harus disalin ke remote untuk setiap task — Mitogen adalah senjata rahasia. Mitogen menggantikan mekanisme eksekusi SSH Ansible dengan eksekusi lazy berbasis memori dan streaming, yang mengurangi proses Python jarak jauh yang di-spawn per-task.
Efek yang dilaporkan oleh pengguna sangat signifikan: eksekusi playbook bisa 4–10x lebih cepat pada banyak workload, karena Mitogen mengamankan state antar task tanpa harus memulai ulang interpreter Python setiap task.
[defaults]
strategy_plugins = /usr/share/ansible/plugins/strategy
strategy = mitogen_linearCaution
Mitogen adalah proyek yang tidak lagi di-maintain secara aktif dan tidak didukung resmi oleh Red Hat — gunakan dengan bijak di environment yang stabil, dan selalu test di staging sebelum production. Bagi kebanyakan organisasi, kombinasi forks + pipelining + fact caching sudah cukup; Mitogen adalah niche tool untuk kasus ekstrim dengan ribuan host dan latency tinggi. Keputusan engineering yang baik adalah memahami keunggulannya sambil mengetahui batas dukungannya.
1. Tidak ada control node terpusat
Playbook dijalankan dari laptop banyak orang → tidak ada audit trail, kredensial bocor, dan bisa bentrok. Enterprise tanpa AWX/AAP pada dasarnya bukan enterprise-grade.
2. Satu inventory untuk semua environment
all bisa menembak production. Selalu pisahkan file inventory per environment dan pastikan kredensial production tidak keluar dari platform.
3. forks dibiarkan default 5
Untuk ratusan/ribuan host ini sangat lambat. Naikkan bertahap sambil memantau CPU/memory control node.
4. Reboot/patch semua host sekaligus
Tanpa serial, playbook restart service ke semua host serentak = outage. Selalu batching dengan serial dan max_fail_percentage.
5. RBAC hanya di UI, bukan di jaringan
Jika engineer bisa bypass platform dengan SSH langsung, RBAC tidak ada artinya. Amankan network-nya juga.
6. Mengabaikan audit logging
Tanpa log eksekusi, kalian buta terhadap "siapa melakukan apa" — audit logging di AWX/AAP adalah fitur compliance yang sering dianggap remeh sampai audit tahunan datang.
Pada episode ini kita telah membahas scaling Ansible untuk enterprise: memahami pola arsitektur terpusat dengan AWX/AAP/Semaphore dan GitOps workflow, membandingkan strategi monorepo vs multi-repo beserta struktur repository yang rapi, menerapkan environment segregation dev/staging/production dengan inventory dan vault terpisah, mengimplementasikan RBAC dan credential management yang aman dengan audit logging, serta mengoptimalkan performa ribuan host lewat forks, pipelining, fact caching, callback plugin, batching dengan serial/throttle, hingga strategi ekstrim Mitogen.
Intinya, scaling Ansible bukan hanya soal teknis — ini soal governance: memastikan kode automation terpusat, siapa yang boleh mengubah apa, dan jejak audit yang lengkap. Dengan fondasi ini, kalian siap membangun platform automation yang bisa dipertanggungjawabkan di perusahaan mana pun.
Di episode 30 selanjutnya — sebagai episode penutup dari series ini — kita akan membahas Production Deployment Checklist & Best Practices: pre-production checklist (linting, testing Molecule, dry-run, validasi inventory), operational best practices, kesalahan umum yang wajib dihindari, monitoring operasi Ansible, hingga disaster recovery dan continuous improvement. Pastikan tetap semangat!