Performance #
Playbook yang berjalan 30 menit untuk 50 server adalah hambatan nyata — tim menunggu, deployment memblok pekerjaan lain, dan feedback loop yang lambat membuat iterasi menjadi menyakitkan. Sebagian besar playbook Ansible bisa dipercepat secara signifikan dengan konfigurasi yang tepat tanpa mengubah satu baris logika pun. Artikel ini membahas teknik-teknik optimasi yang memberikan dampak terbesar.
Forks: Paralelisme Lebih Tinggi #
Default forks Ansible adalah 5 — Ansible hanya akan mengelola 5 host secara paralel sekaligus. Untuk infrastruktur yang lebih besar, naikkan nilai ini:
# ansible.cfg
[defaults]
forks = 20 # Eksekusi di 20 host secara paralel
# Atau override saat runtime
ansible-playbook site.yml -f 30
Nilai yang tepat tergantung pada spesifikasi control node dan kapasitas jaringan. Mulai dari 20, pantau penggunaan CPU dan RAM control node, naikan secara bertahap.
SSH Pipelining #
Secara default, Ansible mengirim module Python ke managed node via SFTP, kemudian mengeksekusinya via SSH terpisah. SSH pipelining menggabungkan kedua langkah ini menjadi satu koneksi, menghilangkan round-trip tambahan:
# ansible.cfg
[ssh_connection]
pipelining = true
SSH pipelining membutuhkan
requirettydinonaktifkan di sudoers managed node. Pastikan baris berikut ada di/etc/sudoers:Defaults !requirettyAtau tambahkan via Ansible sebelum mengaktifkan pipelining.
Dampaknya bisa signifikan — pipelining bisa memangkas waktu eksekusi 20–50% untuk play dengan banyak task pendek.
SSH Multiplexing (ControlMaster) #
SSH multiplexing memungkinkan beberapa koneksi SSH menggunakan satu TCP connection yang sudah ada, menghilangkan overhead handshake SSH di setiap koneksi baru:
# ansible.cfg
[ssh_connection]
pipelining = true
ssh_args = -o ControlMaster=auto -o ControlPersist=60s -o ControlPath=/tmp/ansible-ssh-%h-%p-%r
ControlPersist=60s menjaga koneksi master tetap aktif 60 detik setelah sesi terakhir ditutup — koneksi berikutnya ke host yang sama akan langsung menggunakan multiplexed connection.
Fact Caching #
Gathering facts membutuhkan koneksi SSH ke setiap host dan mengeksekusi module setup. Untuk infrastruktur besar, ini bisa memakan 1-3 detik per host:
# ansible.cfg
[defaults]
gathering = smart # Hanya kumpulkan jika belum di-cache
fact_caching = jsonfile
fact_caching_connection = /tmp/ansible_facts_cache
fact_caching_timeout = 3600 # Cache berlaku 1 jam
Dengan gathering = smart, Ansible hanya menjalankan gathering facts jika:
- Host belum pernah di-cache, atau
- Cache untuk host tersebut sudah expired
# Refresh cache manual jika diperlukan
ansible -i inventory/ all -m setup --tree /tmp/ansible_facts_cache
Nonaktifkan Gathering Facts untuk Play yang Tidak Memerlukannya #
Jika play tidak menggunakan facts (tidak ada referensi ke ansible_* variables), nonaktifkan gathering:
- name: Quick deployment task
hosts: webservers
gather_facts: false # Hemat 1-3 detik per host
tasks:
- name: Restart service
systemd:
name: myapp
state: restarted
Free Strategy #
Secara default, Ansible menunggu semua host menyelesaikan satu task sebelum melanjutkan ke task berikutnya. Free strategy membiarkan setiap host berjalan secepat mungkin:
- name: Deployment paralel penuh
hosts: webservers
strategy: free # Setiap host berjalan independen
tasks:
- name: Pull kode
git:
repo: https://github.com/company/app.git
dest: /opt/app
version: "{{ version }}"
- name: Install dependencies
pip:
requirements: /opt/app/requirements.txt
virtualenv: /opt/app/venv
Gunakan free strategy dengan hati-hati — ia cocok saat task tidak bergantung satu sama lain dan urutan penyelesaian tidak penting.
Profiling: Temukan Bottleneck #
Sebelum mengoptimasi, ukur dulu di mana waktu dihabiskan:
# ansible.cfg — aktifkan callback profiling
[defaults]
callbacks_enabled = profile_tasks, profile_roles, timer
Dengan profile_tasks, Ansible akan menampilkan waktu eksekusi untuk setiap task di akhir run:
Thursday 15 March 2024 14:30:00 +0700 (0:00:00.015) 0:05:43.456 ****
===============================================================================
Gathering Facts -------------------------------------------------- 45.23s
Deploy konfigurasi nginx ----------------------------------------- 12.44s
Install semua package -------------------------------------------- 38.19s
...
Dari output ini, kamu bisa melihat task mana yang paling lambat dan fokus optimasi di sana.
Ringkasan #
- Naikkan
forksdari default 5 ke 20-50 tergantung kapasitas control node — ini adalah optimasi dengan dampak paling besar untuk infrastruktur besar.- SSH pipelining (
pipelining = true) memangkas 20-50% waktu eksekusi — aktifkan segera, tapi pastikanrequirettydinonaktifkan di sudoers.- SSH multiplexing (
ControlMaster=auto) menghilangkan overhead handshake SSH berulang — sangat efektif untuk play dengan banyak task pendek.- Fact caching (
gathering = smart) menghindari pengumpulan ulang facts yang sama — efektif untuk playbook yang sering dijalankan.gather_facts: falseuntuk play yang tidak menggunakan facts sama sekali — penghematan langsung tanpa trade-off.profile_taskscallback untuk mengukur sebelum mengoptimasi — jangan tebak, ukur dulu di mana bottleneck-nya.
← Sebelumnya: Delegation & Local Action Berikutnya: Testing →