Mengelola satu server mungkin masih bisa dilakukan manual lewat SSH. Tapi begitu jumlah server bertambah — lima, sepuluh, atau puluhan — menginstal paket, menyesuaikan konfigurasi, dan memastikan semuanya seragam secara manual berubah menjadi mimpi buruk. Di sinilah Ansible berperan: alat otomatisasi konfigurasi yang memungkinkan kamu mendeskripsikan kondisi server dalam file YAML yang mudah dibaca, lalu menerapkannya ke seluruh server sekaligus. Kalau kamu sebelumnya sudah mengenal Terraform untuk menyiapkan infrastruktur, Ansible adalah pelengkap alaminya: Terraform membuat server-nya, Ansible mengonfigurasi isinya.
Apa Itu Ansible dan Kenapa Kamu Perlu Memakainya?
Ansible adalah tool open-source untuk configuration management, application deployment, dan orchestration. Keunggulan utamanya: Ansible bersifat agentless. Kamu cukup menginstalnya di satu mesin (disebut control node), lalu Ansible terhubung ke server tujuan (managed node) lewat SSH — protokol yang hampir pasti sudah tersedia di setiap server Linux. Tidak ada agen tambahan yang harus dipasang di tiap server.
Ada tiga alasan Ansible begitu populer. Pertama, sintaksnya berupa YAML yang manusiawi dan mudah dibaca bahkan oleh pemula. Kedua, Ansible bersifat idempoten: menjalankan playbook yang sama berkali-kali hanya akan mengubah bagian yang memang perlu diubah. Ketiga, kamu tidak perlu belajar bahasa pemrograman baru — jika sudah paham dasar bash scripting di Linux, kamu akan cepat akrab dengan konsep Ansible.
Konsep Dasar yang Wajib Dipahami
Sebelum menulis playbook, kenali lima istilah kunci ini:
- Control Node — mesin tempat Ansible diinstal dan tempat kamu menjalankan perintah.
- Managed Node — server tujuan yang dikelola Ansible lewat SSH.
- Inventory — file daftar server beserta pengelompokannya.
- Playbook — file YAML berisi langkah-langkah (task) yang dijalankan terhadap server.
- Module — unit kerja kecil Ansible, misalnya
aptuntuk instalasi ataucopyuntuk menyalin file.
Langkah 1: Instal Ansible di Control Node
Kita akan menginstal Ansible di komputer lokal atau server kecil yang menjadi control node. Cara paling konsisten lintas distro adalah lewat pip:
python3 -m venv ansible-env
source ansible-env/bin/activate
pip install ansible
# Verifikasi instalasi
ansible --version
Jika kamu memakai Ubuntu/Debian, tersedia juga sudo apt install ansible, tetapi versi di repository resmi sering tertinggal dari rilisan terbaru. Control node harus berjalan di Linux atau macOS (di Windows gunakan WSL).
Selalu pakai virtual environment agar Ansible tidak bercampur dengan paket Python sistem di mesinmu.
Langkah 2: Menyiapkan Inventory
Inventory adalah daftar server yang akan dikelola. Bentuk paling sederhana adalah file INI. Buat file bernama inventory.ini seperti berikut:
[webservers]
web1 ansible_host=192.168.1.10 ansible_user=deploy
web2 ansible_host=192.168.1.11 ansible_user=deploy
[dbservers]
db1 ansible_host=192.168.1.20 ansible_user=deploy
Di sini server dibagi ke dalam dua grup — webservers dan dbservers — sehingga nanti kamu bisa menargetkan perintah hanya ke grup tertentu. Ganti alamat IP dan ansible_user dengan data server milikmu.
Langkah 3: Uji Koneksi dengan Ad-Hoc Command
Sebelum membuat playbook, pastikan Ansible mampu terhubung ke server lewat SSH. Gunakan ad-hoc command — perintah sekali jalan tanpa perlu menulis file:
ansible all -i inventory.ini -m ping
Modul ping menguji konektivitas SSH dari ujung ke ujung (bukan ping jaringan biasa). Jika berhasil, setiap host akan mengembalikan status SUCCESS. Jika muncul error autentikasi, pastikan kunci SSH sudah disalin ke server dengan ssh-copy-id deploy@192.168.1.10.
Belum punya server kedua? Kamu tetap bisa berlatih dengan menargetkan localhost menggunakan koneksi lokal — seluruh contoh di artikel ini bisa dijalankan di mesinmu sendiri.
Langkah 4: Menulis Playbook Pertamamu
Ad-hoc command cocok untuk tugas satu baris, tetapi untuk otomatisasi yang bisa diulang dan dibagikan, gunakan playbook. Playbook adalah file YAML berisi play (target host) dan task (langkah kerja). Buat file first-playbook.yml:
---
- name: Update semua paket di server web
hosts: webservers
become: true
tasks:
- name: Update cache apt
ansible.builtin.apt:
update_cache: true
cache_valid_time: 3600
- name: Upgrade semua paket
ansible.builtin.apt:
upgrade: dist
Mari bedah: hosts: webservers berarti playbook hanya menyasar grup webservers. become: true membuat Ansible menjalankan task sebagai root (setara sudo). Setiap task memiliki name (deskripsi yang tampil saat dieksekusi) dan satu modul — di sini apt untuk mengelola paket di Debian/Ubuntu.
Langkah 5: Menjalankan Playbook
ansible-playbook -i inventory.ini first-playbook.yml
Ansible akan menampilkan progres setiap task dengan status changed (ada perubahan) atau ok (sudah sesuai). Jalankan sekali lagi dan perhatikan: status berubah menjadi ok karena sistem sudah dalam kondisi yang diinginkan. Inilah wujud nyata sifat idempoten Ansible.
Modul Penting yang Sering Dipakai
Modul adalah jantung Ansible. Berikut beberapa yang paling sering kamu butuhkan saat mengelola server:
- name: Instal Nginx
ansible.builtin.apt:
name: nginx
state: present
- name: Pastikan service berjalan
ansible.builtin.service:
name: nginx
state: started
enabled: true
- name: Salin file konfigurasi
ansible.builtin.copy:
src: files/nginx.conf
dest: /etc/nginx/nginx.conf
owner: root
mode: "0644"
- name: Buat user deploy
ansible.builtin.user:
name: deploy
groups: sudo
shell: /bin/bash
apt untuk instalasi paket, service untuk mengelola service systemd, copy untuk menyalin file dari control node, dan user untuk membuat pengguna. Ada ratusan modul bawaan lainnya — misalnya untuk memasang Docker di banyak server sekaligus, tersedia modul community.docker.docker_compose_v2 yang bisa langsung dipakai.
Variabel, Handler, dan Template
Playbook yang baik tidak mengulang nilai yang sama di banyak tempat. Gunakan variabel untuk menyimpan nilai yang dipakai lintas task:
- name: Deploy aplikasi
hosts: webservers
become: true
vars:
app_user: deploy
app_dir: /opt/myapp
http_port: 8080
tasks:
- name: Buat direktori aplikasi
ansible.builtin.file:
path: "{{ app_dir }}"
state: directory
owner: "{{ app_user }}"
Variabel didefinisikan di bawah vars: dan dipanggil dengan sintaks Jinja2 {{ nama_variabel }}. Sementara itu, handler adalah task khusus yang hanya dieksekusi ketika ada task lain yang melaporkan perubahan — sangat berguna untuk me-restart service hanya saat konfigurasinya benar-benar berubah:
tasks:
- name: Salin konfigurasi Nginx
ansible.builtin.copy:
src: files/nginx.conf
dest: /etc/nginx/nginx.conf
notify: restart nginx
handlers:
- name: restart nginx
ansible.builtin.service:
name: nginx
state: restarted
Perhatikan kata kunci notify pada task dan blok handlers di bawahnya. Jika file konfigurasi tidak berubah (sudah identik), handler tidak akan dipanggil — mencegah restart yang tidak perlu.
Contoh Nyata: Menyiapkan Web Server Lengkap dalam Satu Playbook
Mari rangkai semuanya. Berikut playbook lengkap yang menyiapkan server web dengan Nginx, membuat user aplikasi, menyalin file, dan memastikan service aktif:
---
- name: Setup web server lengkap
hosts: webservers
become: true
vars:
app_user: deploy
app_dir: /var/www/html
tasks:
- name: Update cache apt
ansible.builtin.apt:
update_cache: true
cache_valid_time: 3600
- name: Instal Nginx
ansible.builtin.apt:
name: nginx
state: present
- name: Buat user aplikasi
ansible.builtin.user:
name: "{{ app_user }}"
groups: www-data
shell: /bin/bash
- name: Salin index.html
ansible.builtin.copy:
src: files/index.html
dest: "{{ app_dir }}/index.html"
owner: www-data
mode: "0644"
notify: restart nginx
- name: Pastikan Nginx aktif dan auto-start
ansible.builtin.service:
name: nginx
state: started
enabled: true
handlers:
- name: restart nginx
ansible.builtin.service:
name: nginx
state: restarted
Simpan file index.html di folder files/ di samping playbook, lalu jalankan ansible-playbook -i inventory.ini setup-webserver.yml. Satu perintah ini menyiapkan server secara konsisten — dan aman dijalankan ulang kapan pun tanpa efek samping.
Ini baru permulaan. Dari playbook ini kamu bisa naik level ke roles (struktur folder yang bisa dipakai ulang antar proyek), Ansible Vault untuk mengenkripsi data sensitif, dan integrasi ke pipeline CI/CD. Pola dasarnya tetap sama: tulis task, jalankan playbook, biarkan Ansible menjaga konsistensi.
Kesimpulan
Ansible mengubah pengelolaan server dari pekerjaan manual yang rawan salah menjadi proses yang dapat diulang, terdokumentasi lewat kode, dan diskalakan ke banyak server sekaligus. Kamu sudah belajar instalasi, inventory, ad-hoc command, playbook, modul, variabel, dan handler. Langkah selanjutnya: terapkan ke server milikmu dan pelajari roles untuk mengorganisasi playbook yang lebih besar.
Apa bedanya Ansible dengan Terraform?
Terraform fokus pada provisioning infrastruktur (membuat VM, VPC, atau database di cloud) dan menyimpan state-nya. Ansible fokus pada konfigurasi di dalam server (instalasi paket, file, service). Keduanya sering dipakai bersama: Terraform membuat sumber dayanya, lalu Ansible mengonfigurasinya.
Apakah Ansible bisa dipakai untuk Windows?
Managed node Windows bisa dikelola Ansible lewat WinRM menggunakan modul berawalan win_. Namun control node (tempat kamu menjalankan perintah) harus berjalan di Linux/macOS, atau WSL pada Windows.
Berapa server minimal untuk mulai belajar Ansible?
Cukup satu mesin. Kamu bisa menargetkan localhost dengan koneksi lokal sehingga bisa berlatih menulis dan menjalankan playbook tanpa server tambahan sama sekali.