Teknologi
Panduan Lengkap Ansible: Automasi Server dari Satu Terminal
Baca juga
📚 Baca juga
Ansible adalah tool automasi IT tanpa agent (agentless) yang menggunakan SSH untuk mengelola remote servers. Dengan satu file konfigurasi, kamu bisa install software, configure services, deploy applications, dan manage puluhan atau bahkan ratusan server sekaligus — semua dari satu laptop.
## Mengapa Ansible?
**Agentless.** Tidak perlu install agent di server target. Cukup SSH dan Python sudah terinstall (yang mana sudah default di hampir semua Linux).
**Idempotent.** Menjalankan playbook yang sama berkali-kali hasilnya konsisten. Tidak ada perubahan yang tidak diinginkan jika kondisi sudah sesuai.
**Readable.** Ansible playbooks ditulis dalam YAML yang mudah dibaca. Non-developer pun bisa memahami apa yang dilakukan playbook.
**Ansible Galaxy.** Ribuan roles dan collections yang sudah dibuat komunitas — dari install Nginx sampai configure Kubernetes.
## Install Ansible
### Linux/macOS
```bash
pip3 install ansible
# atau
apt install ansible
```
### Cek Versi
```bash
ansible --version
```
## Konfigurasi Dasar
### Inventory File
Buat `/etc/ansible/hosts` atau `inventory.ini`:
```ini
[webserver]
web1 ansible_host=192.168.1.10 ansible_user=root
web2 ansible_host=192.168.1.11 ansible_user=root
[database]
db1 ansible_host=192.168.1.20 ansible_user=root
[all:vars]
ansible_python_interpreter=/usr/bin/python3
ansible_ssh_private_key_file=~/.ssh/id_rsa
```
### Test Koneksi
```bash
ansible all -m ping
```
## Ad-Hoc Commands
Tanpa playbook, kamu bisa langsung menjalankan perintah:
```bash
# Cek uptime semua server
ansible all -m shell -a "uptime"
# Install package
ansible webserver -m apt -a "name=nginx state=present" --become
# Copy file
ansible webserver -m copy -a "src=./nginx.conf dest=/etc/nginx/nginx.conf"
# Restart service
ansible webserver -m service -a "name=nginx state=restarted" --become
```
## Ansible Playbooks
Playbook adalah file YAML yang mendefinisikan automasi. Contoh sederhana:
### Install Web Server Stack
```yaml
# webstack.yml
---
- name: Setup Web Server Stack
hosts: webserver
become: yes
vars:
nginx_port: 80
app_name: myapp
tasks:
- name: Update apt cache
apt:
update_cache: yes
cache_valid_time: 3600
- name: Install Nginx
apt:
name: nginx
state: present
- name: Install Node.js 20
shell: |
curl -fsSL https://deb.nodesource.com/setup_20.x | bash -
apt install -y nodejs
args:
creates: /usr/bin/node
- name: Copy Nginx config
template:
src: templates/nginx.conf.j2
dest: /etc/nginx/sites-available/{{ app_name }}
notify: Restart Nginx
- name: Enable site
file:
src: /etc/nginx/sites-available/{{ app_name }}
dest: /etc/nginx/sites-enabled/{{ app_name }}
state: link
notify: Restart Nginx
- name: Remove default site
file:
dest: /etc/nginx/sites-enabled/default
state: absent
notify: Restart Nginx
handlers:
- name: Restart Nginx
service:
name: nginx
state: restarted
```
### Jalankan Playbook
```bash
ansible-playbook -i inventory.ini webstack.yml
```
## Ansible Roles
Roles adalah cara mengorganisir playbook menjadi reusable modules:
### Struktur Role
```
roles/
nginx/
tasks/
main.yml
templates/
nginx.conf.j2
handlers/
main.yml
vars/
main.yml
defaults/
main.yml
meta/
main.yml
```
### Contoh Role: nginx/tasks/main.yml
```yaml
---
- name: Install Nginx
apt:
name: nginx
state: present
- name: Copy nginx.conf
template:
src: nginx.conf.j2
dest: /etc/nginx/nginx.conf
notify: Restart Nginx
- name: Ensure Nginx is running
service:
name: nginx
state: started
enabled: yes
```
### Gunakan Role di Playbook
```yaml
---
- name: Setup Web Servers
hosts: webserver
become: yes
roles:
- nginx
- docker
- monitoring
```
## Ansible Galaxy
Install roles dari komunitas:
```bash
# Install role
ansible-galaxy install geerlingguy.docker
# Install collection
ansible-galaxy collection install community.general
# List installed
ansible-galaxy role list
```
## Ansible Vault
Simpan sensitive data (passwords, API keys) dengan enkripsi:
```bash
# Buat file terenkripsi
ansible-vault create secrets.yml
# Edit file terenkripsi
ansible-vault edit secrets.yml
# Jalankan playbook dengan vault
ansible-playbook site.yml --ask-vault-pass
# atau gunakan vault password file
ansible-playbook site.yml --vault-password-file=.vault_pass
```
### Contoh secrets.yml
```yaml
db_password: "super-secret-password"
api_key: "abc123def456"
```
Gunakan di playbook:
```yaml
- name: Configure database
template:
src: db.conf.j2
dest: /etc/app/db.conf
vars:
db_pass: "{{ db_password }}"
```
## Best Practices
**Gunakan Roles.** Pisahkan automasi ke roles yang reusable. Jangan tulis semua task di satu playbook besar.
**Idempotent Tasks.** Gunakan modules Ansible (apt, service, template) daripada shell/command. Modules Ansible idempotent, shell tidak.
**Tagging.** Gunakan tags untuk menjalankan sebagian task saja:
```bash
ansible-playbook site.yml --tags "install,config"
```
**Check Mode.** Test playbook tanpa mengubah apapun:
```bash
ansible-playbook site.yml --check --diff
```
**Limit hosts.** Jalankan di satu server dulu untuk testing:
```bash
ansible-playbook site.yml --limit web1
```
Ansible mengubah cara kita mengelola infrastructure. Dari manual SSH satu per satu, menjadi automate dengan satu perintah. Investasi waktu belajar Ansible akan terbayar berkali-kali dalam produktivitas.