L
Infrastructure as Code (IaC) • Literally Web ID

Automasi Infrastruktur Skala Besar dengan Terraform dan Ansible

⏱️ 15 menit baca • 📅 15 Oct 2026 • 👁️ 1 views
Automasi Infrastruktur Skala Besar dengan Terraform dan Ansible

1. Konteks Industri & Analisis Akar Masalah

Dalam lanskap arsitektur web modern, skalabilitas dan konsistensi infrastruktur adalah fondasi utama bagi kelangsungan bisnis digital. Pengelolaan server secara manual (manual provisioning melalui panel cloud atau SSH langsung ke mesin) sudah lama ditinggalkan oleh organisasi enterprise karena membawa risiko operasional yang masif: inkonsistensi lingkungan (configuration drift), waktu pemulihan bencana (Disaster Recovery) yang lambat, dan kerentanan keamanan akibat manusia (human error).

Bayangkan sebuah skenario di mana platform e-commerce berskala besar mengalami lonjakan trafik secara tiba-tiba (traffic spike). Jika tim infrastruktur harus menyiapkan 50 server backend (Node.js/Go), mengatur reverse proxy Nginx, mengkonfigurasi sinkronisasi storage S3/MinIO, memasang aturan WAF, dan memastikan Redis cluster terhubung secara manual, proses ini akan memakan waktu berjam-jam atau bahkan berhari-hari. Akibatnya, potensi pendapatan hilang dan reputasi merek tercoreng.

Pendekatan modern mengatasi hal ini melalui Infrastructure as Code (IaC) dan Configuration Management. Dengan mengombinasikan Terraform untuk provisioning sumber daya fisik/virtual dasar (Compute, VPC, Load Balancer, Storage, DNS) dan Ansible untuk orkestrasi serta konfigurasi perangkat lunak di dalam OS (Nginx, PHP-FPM, Node.js, Postfix, Fail2ban), kita mencapai otomatisasi penuh yang deterministik, dapat diulang, dan aman.

Sebelum vs Sesudah Penerapan Automasi Infrastruktur

Aspek Sebelum (Manual & Ad-hoc) Sesudah (Terraform & Ansible)
Waktu Provisioning 2-4 jam per server (intervensi manusia) 3-5 menit untuk seluruh cluster
Konsistensi Lingkungan Tinggi risiko drift, dev berbeda dengan prod 100% identik (Immutable Infrastructure approach)
Auditabilitas Tidak ada catatan perubahan yang jelas Version-controlled di Git (GitOps)
Skalabilitas Bottleneck pada ketersediaan sysadmin Skala otomatis dengan sekali eksekusi pipeline CI/CD

2. Konsep Inti & Deep Dive Arsitektur

Arsitektur automasi modern membagi tugas secara tegas menjadi dua fase: Provisioning dan Configuration Management. Terraform menangani lapisan infrastruktur (Layer 3-4 dan Layer Cloud Provider API), sementara Ansible menangani lapisan sistem operasi dan aplikasi (Layer 7 ke atas).

+-------------------------------------------------------------------------+
|                        Git Repository (GitOps)                          | 
+-------------------------------------------------------------------------+
          |                                       |
          v                                       v
+--------------------+                  +-------------------------+
|     Terraform      |                  |         Ansible         |
| (Cloud Provider API)|                  | (SSH / Agentless Engine)|
+--------------------+                  +-------------------------+
          |                                       |
          v                                       v
+-------------------------------------------------------------------------+
|                        Cloud Infrastructure                             | 
|  [ VPC -> Subnets -> Security Groups -> Compute Instances (EC2/Droplets)] |
+-------------------------------------------------------------------------+
                                          |
                                          v
+-------------------------------------------------------------------------+
|                        Software Configuration                           | 
|  [ Nginx Web Server -> PHP-FPM/Go Backend -> Redis Caching -> Firewall ]|
+-------------------------------------------------------------------------+

Alur Eksekusi Data (Under the Hood)

  1. Declarative State (Terraform): Developer mendefinisikan desired state dalam file HCL (.tf). Terraform membaca current state dari state file (remote backend seperti S3 + DynamoDB untuk locking), menghitung diff, dan mengeksekusi API calls ke penyedia cloud (AWS, GCP, DigitalOcean).
  2. Dynamic Inventory (Ansible): Begitu instance server aktif dan memiliki alamat IP publik/privat, Ansible menggunakan plugin dynamic inventory untuk mengambil daftar IP tersebut secara otomatis dari Terraform state atau Cloud API.
  3. Idempotent Playbooks (Ansible): Ansible melakukan koneksi via SSH menggunakan arsitektur agentless, mengeksekusi task secara berurutan, memastikan paket terinstal, konfigurasi file tertulis dengan benar, dan servis berjalan tanpa mengubah status jika tidak ada perubahan yang diperlukan (idempotency).

3. Perbandingan Komparatif / Analisis Pendekatan

Dalam dunia infrastruktur enterprise, pemilihan alat sering kali menjadi perdebatan arsitektural. Berikut analisis komparatif antara Terraform, Ansible, dan Cloud-Native Tools (seperti AWS CloudFormation).

Fitur Pembanding Terraform (HashiCorp) Ansible (Red Hat) CloudFormation (AWS)
Paradigma Deklaratif (Desired State) Prosedural/Deklaratif (Task-based) Deklaratif
Cakupan Utama Cloud Resource Provisioning OS & Software Configuration Cloud Resource Provisioning
Arsitektur Agentless (API Calls) Agentless (SSH/WinRM) Agent (Managed Service)
Cloud Agnostic Ya (Multi-cloud: AWS, GCP, Azure) Ya (Universal target) Tidak (Eksklusif AWS)
State Management External State File (terraform.tfstate) Stateless (Mengecek target langsung) Managed di dalam AWS

[!IMPORTANT] Jangan pernah menggunakan Ansible untuk membuat Virtual Private Cloud (VPC) atau Load Balancer tingkat cloud yang kompleks secara masif, karena Ansible tidak memiliki manajemen state yang aman untuk relasi sumber daya cloud yang rumit. Gunakan Terraform untuk infrastruktur, dan Ansible untuk konfigurasi di dalam mesin.


4. Prasyarat Sistem & Persiapan Lingkungan

Sebelum menyelam ke dalam kode implementasi, pastikan lingkungan kerja lokal atau mesin CI/CD Runner Anda telah terinstal dependensi berikut dengan versi minimum yang didukung:

  • Terraform: Versi >= 1.5.0
  • Ansible: Versi >= 2.15+
  • Git: Untuk kontrol versi
  • Cloud Provider CLI / Token: Akses API (contoh: AWS Credentials atau DigitalOcean Personal Access Token)

Verifikasi instalasi dengan perintah berikut di terminal:

terraform -version
ansible --version
git --version

Struktur direktori proyek yang akan kita gunakan adalah sebagai berikut:

infra-automation/
├── terraform/
│   ├── main.tf
│   ├── variables.tf
│   ├── outputs.tf
│   └── backend.tf
└── ansible/
    ├── inventory/
    │   └── dynamic_inventory.gcp.yml (atau aws_ec2.yml)
    ├── playbooks/
    │   └── site.yml
    └── roles/
        ├── common/
        ├── nginx/
        └── php-backend/

5. Panduan Implementasi Langkah demi Langkah

Langkah 1: Provisioning Infrastruktur dengan Terraform

Kita mulai dengan mendefinisikan infrastruktur dasar pada penyedia cloud (misalnya DigitalOcean atau AWS). Berikut adalah konfigurasi lengkap untuk membuat sebuah VPS, Virtual Private Cloud (VPC), dan Firewall.

Simpan kode berikut sebagai terraform/main.tf:

terraform {
  required_version = ">= 1.5.0"
  required_providers {
    digitalocean = {
      source  = "digitalocean/digitalocean"
      version = "~> 2.30"
    }
  }
}

provider "digitalocean" {
  token = var.do_token
}

resource "digitalocean_vpc" "web_vpc" {
  name     = "production-vpc"
  region   = "sgp1"
  ip_range = "10.10.0.0/16"
}

resource "digitalocean_firewall" "web_fw" {
  name = "web-server-firewall"

  droplet_ids = [digitalocean_droplet.web_node.id]

  inbound_rule {
    protocol         = "tcp"
    port_range       = "22"
    source_addresses = ["0.0.0.0/0", "::/0"]
  }

  inbound_rule {
    protocol         = "tcp"
    port_range       = "80"
    source_addresses = ["0.0.0.0/0", "::/0"]
  }

  inbound_rule {
    protocol         = "tcp"
    port_range       = "443"
    source_addresses = ["0.0.0.0/0", "::/0"]
  }

  outbound_rule {
    protocol              = "tcp"
    port_range            = "1-65535"
    destination_addresses = ["0.0.0.0/0", "::/0"]
  }
}

resource "digitalocean_droplet" "web_node" {
  image    = "ubuntu-22-04-x64"
  name     = "web-node-01"
  region   = "sgp1"
  size     = "s-2vcpu-4gb"
  vpc_uuid = digitalocean_vpc.web_vpc.id
  ssh_keys = [var.ssh_key_fingerprint]

  connection {
    type        = "ssh"
    user        = "root"
    private_key = file(var.private_key_path)
    host        = self.ipv4_address
  }

  provisioner "remote-exec" {
    inline = [
      "export DEBIAN_FRONTEND=noninteractive",
      "apt-get update && apt-get upgrade -y",
      "apt-get install -y python3 python3-pip"
    ]
  }
}

output "server_ip" {
  value       = digitalocean_droplet.web_node.ipv4_address
  description = "Alamat IP Publik Server Web Produksi"
}

Simpan variabel yang diperlukan pada terraform/variables.tf:

variable "do_token" {
  type        = string
  sensitive   = true
  description = "DigitalOcean API Token"
}

variable "ssh_key_fingerprint" {
  type        = string
  description = "Fingerprint SSH Key di Cloud Provider"
}

variable "private_key_path" {
  type        = string
  default     = "~/.ssh/id_rsa"
  description = "Path ke SSH Private Key lokal"
}

Inisialisasi dan terapkan Terraform:

terraform init
terraform apply -auto-approve

Langkah 2: Konfigurasi Otomatis dengan Ansible

Setelah server aktif, kita gunakan Ansible untuk menginstal Nginx, PHP-FPM, Redis, dan Fail2ban.

Buat file Ansible Playbook ansible/playbooks/site.yml:

---
- name: Konfigurasi Web Server Enterprise
  hosts: all
  become: true
  vars:
    app_user: "www-data"
  tasks:
    - name: Update apt cache dan pastikan paket dasar terinstal
      apt:
        update_cache: yes
        cache_valid_time: 3600
        state: present

    - name: Instal Nginx, PHP-FPM, dan Redis
      apt:
        name:
          - nginx
          - php8.2-fpm
          - php8.2-cli
          - php8.2-mbstring
          - php8.2-xml
          - php8.2-mysql
          - redis-server
          - fail2ban
        state: present

    - name: Pastikan Nginx dan PHP-FPM aktif dan berjalan
      service:
        name: "{{ item }}"
        state: started
        enabled: yes
      loop:
        - nginx
        - php8.2-fpm
        - redis-server
        - fail2ban

    - name: Salin konfigurasi virtual host Nginx kustom
      copy:
        dest: "/etc/nginx/sites-available/default"
        content: |
          server {
              listen 80;
              server_name _;
              root /var/www/html;
              index index.php index.html index.htm;

              location / {
                  try_files $uri $uri/ /index.php?$query_string;
              }

              location ~ \.php$ {
                  include snippets/fastcgi-php.conf;
                  fastcgi_pass unix:/run/php/php8.2-fpm.sock;
              }

              location ~* \.(jpg|jpeg|png|gif|ico|css|js)$ {
                  expires 30d;
                  add_header Cache-Control "public, no-transform";
              }
          }
      notify: Restart Nginx

    - name: Buat halaman uji PHP
      copy:
        dest: "/var/www/html/index.php"
        content: "<?php echo '<h1>Enterprise Infrastructure Automasi Berhasil!</h1>'; phpinfo(); ?>"
        owner: "{{ app_user }}"
        group: "{{ app_user }}"
        mode: '0644'

  handlers:
    - name: Restart Nginx
      service:
        name: nginx
        state: restarted

Jalankan Ansible Playbook dengan menyertakan IP server yang dihasilkan Terraform (ambil dari output terraform atau file inventory statis):

# Ambil IP server dari output Terraform secara otomatis
SERVER_IP=$(terraform -chdir=terraform output -raw server_ip)

# Jalankan playbook
ansible-playbook -i "$SERVER_IP,", --private-key=~/.ssh/id_rsa -u root ansible/playbooks/site.yml

6. Bedah Kode & Penjelasan Detail Baris Kunci

  1. provisioner "remote-exec" di Terraform: Blok ini bertindak sebagai jembatan antara fase provisioning dan configuration. Sebelum Ansible mengambil alih, blok ini memastikan bahwa Python (yang menjadi prasyarat eksekusi modul Ansible via SSH) sudah terinstal di dalam mesin Linux baru.
  2. connection { type = "ssh" ... }: Memungkinkan Terraform melakukan koneksi aman ke mesin yang baru dibuat untuk menjalankan perintah bootstrap awal sebelum resource dinyatakan complete.
  3. cache_valid_time: 3600 di Ansible: Baris ini mencegah Ansible melakukan pembaruan indeks apt berulang kali jika pembaruan terakhir dilakukan kurang dari 1 jam yang lalu, menghemat waktu eksekusi pipeline secara signifikan.
  4. Idempotency pada Handler Nginx: Blok handlers di Ansible memastikan perintah service nginx restarted hanya dieksekusi jika file konfigurasi virtual host benar-benar berubah (changed). Jika file tidak berubah, Nginx tidak akan mengalami downtime restart yang tidak perlu.

7. Skenario Produksi & Studi Kasus Dunia Nyata

Dalam lingkungan produksi berbeban tinggi (High Concurrency), satu server web tunggal pasti akan mengalami titik jenuh. Arsitektur produksi harus menggunakan Auto Scaling Group (ASG) di belakang Application Load Balancer (ALB).

Pola Arsitektur Skala Enterprise:

  • Terraform mendefinisikan Launch Template dan Auto Scaling Group dengan kapasitas minimum 3 instance dan maksimum 50 instance berdasarkan metrik CPU Utilization > 75%.
  • Ansible dikombinasikan dengan teknik Packer (HashiCorp Packer) untuk membuat Golden AMI (Amazon Machine Image) atau Snapshots. Server tidak dikonfigurasi saat pertama kali boot secara langsung (runtime configuration), melainkan image server sudah matang berisi Nginx, PHP, dan pustaka aplikasi sebelum VM dinyalakan. Ini mempercepat waktu cold start dari 10 menit menjadi kurang dari 30 detik.

8. Common Pitfalls, Anti-Patterns & Solusi

[!WARNING] Simpan State File secara Lokal di Mesin Pribadi (Anti-Pattern Fatal). Menyimpan file terraform.tfstate di mesin lokal atau melakukan commit file tersebut ke Git adalah kesalahan fatal. Jika dua engineer menjalankan terraform apply secara bersamaan, state akan korup, dan kunci rahasia yang tersimpan di dalam state akan bocor ke repositori publik. Solusi: Selalu gunakan Remote Backend dengan enkripsi dan state locking, seperti AWS S3 dengan DynamoDB locking, Terraform Cloud, atau MinIO privat.

[!WARNING] Mengabaikan Idempotency pada Task Ansible. Menulis task kustom di Ansible menggunakan modul shell atau command (misalnya shell: echo "data" >> /etc/config) tanpa parameter creates akan membuat task tersebut berjalan terus-menerus setiap kali playbook dijalankan, merusak sifat idempotensi. Solusi: Selalu gunakan modul bawaan Ansible (seperti copy, template, lineinfile, apt) atau gunakan parameter creates pada modul command.


9. Benchmark, Metrik Kinerja & Tuning Performa

Setelah infrastruktur otomatis selesai dideploy, penting untuk menguji performa web server menggunakan tool benchmark seperti wrk atau k6.

Contoh pengujian beban HTTP menggunakan wrk dengan 12 koneksi paralel selama 30 detik:

wrk -t12 -c400 -d30s http://<SERVER_IP>/

Tuning Kernel Linux untuk High Concurrency (/etc/sysctl.conf):

Tambahkan pengaturan berikut via Ansible untuk mengoptimalkan penanganan koneksi jaringan TCP:

# Tingkatkan batas file descriptor sistem
fs.file-max = 2097152

# Optimalkan antrean koneksi TCP (SYN backlog)
net.ipv4.tcp_max_syn_backlog = 65535
net.core.somaxconn = 65535

# Aktifkan reuse dan recycle port TIME_WAIT
net.ipv4.tcp_reuse = 1

10. Checklist Penerapan Produksi & Kesimpulan

Sebelum merilis infrastruktur hasil automasi ini ke lingkungan Live Production, pastikan Anda telah melalui checklist validasi berikut:

  • State Security: Backend Terraform menggunakan enkripsi at-rest dan state locking aktif.
  • Secret Management: Tidak ada hardcoded token/password di dalam file .tf atau playbook Ansible (gunakan HashiCorp Vault atau Environment Variables).
  • Firewall Hardening: Hanya port 80, 443, dan 22 (atau port VPN khusus) yang terbuka ke publik; database dan Redis diisolasi di private subnet.
  • Idempotency Test: Ansible playbook telah diuji minimal 2 kali berturut-turut tanpa menghasilkan changed tasks yang tidak diinginkan pada eksekusi kedua.
  • Monitoring & Alerting: Integrasi Agen Prometheus/Node Exporter otomatis terpasang melalui Ansible role.

Dengan menguasai Terraform dan Ansible secara terintegrasi, Anda tidak lagi mengelola server sebagai hewan peliharaan (pets) yang harus dirawat secara manual, melainkan sebagai ternak (cattle) yang dapat dibuat, dimusnahkan, dan ditingkatkan skalanya secara instan, aman, dan dapat diandalkan.

🏷️ Tags: #Nginx #High Concurrency #Performance #Sysadmin #Web Server