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 apt untuk instalasi atau copy untuk 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:

bash
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:

other
[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 grupwebservers 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:

bash
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:

other
---
- 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

bash
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:

other
- 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:

other
- 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:

other
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:

other
---
- 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.