Teknologi

Panduan Lengkap Ansible: Automasi Server dari Satu Terminal

Panduan Lengkap Ansible: Automasi Server dari Satu Terminal
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.