Tool Imperative #
Ketika bicara Infrastructure as Code, ada dua cara berpikir yang sangat berbeda: imperatif dan deklaratif. Terraform menggunakan pendekatan deklaratif, tapi banyak tool populer lain — Ansible, Chef, Puppet — menggunakan pendekatan imperatif. Memahami perbedaan ini bukan soal mana yang lebih bagus secara absolut, tapi soal memilih tool yang tepat untuk masalah yang tepat. Artikel ini menjelaskan cara kerja tool imperatif dan mengapa Terraform memilih jalan yang berbeda.
Imperatif vs Deklaratif #
Perbedaan mendasarnya ada di cara kamu mengekspresikan keinginanmu kepada sistem.
IMPERATIF — "Bagaimana caranya"
Kamu menentukan langkah-langkah eksekusi secara eksplisit.
Langkah 1: Buat security group
Langkah 2: Buka port 80
Langkah 3: Launch instance EC2
Langkah 4: Attach security group ke instance
Langkah 5: Assign Elastic IP
...dan seterusnya
DEKLARATIF — "Apa yang diinginkan"
Kamu mendefinisikan kondisi akhir yang diinginkan.
resource "aws_instance" "web" {
ami = "ami-abc123"
instance_type = "t3.micro"
security_groups = [aws_security_group.web.name]
}
Tool yang menentukan langkah-langkahnya.
Contoh Tool Imperatif #
Ansible adalah contoh tool imperatif yang paling populer di ekosistem DevOps. Ansible menggunakan playbook berisi tasks yang dieksekusi secara berurutan.
# ANSIBLE PLAYBOOK — Pendekatan Imperatif
# Kamu mendefinisikan setiap langkah secara eksplisit
- name: Setup web server
hosts: all
tasks:
- name: Install nginx
apt:
name: nginx
state: present
- name: Start nginx service
service:
name: nginx
state: started
enabled: yes
- name: Copy config file
copy:
src: nginx.conf
dest: /etc/nginx/nginx.conf
- name: Reload nginx
service:
name: nginx
state: reloaded
Setiap task dieksekusi berurutan. Kamu, sebagai penulis playbook, bertanggung jawab memastikan urutan yang benar dan menangani kondisi-kondisi edge case.
Masalah Idempotency di Tool Imperatif #
Salah satu tantangan terbesar tool imperatif adalah idempotency — kemampuan menjalankan script yang sama berkali-kali tanpa efek samping yang tidak diinginkan.
# ANTI-PATTERN: Task yang tidak idempoten
- name: Add user to sudoers
shell: echo "deploy ALL=(ALL) NOPASSWD:ALL" >> /etc/sudoers
# Masalah: Setiap kali dijalankan, baris ini ditambahkan lagi.
# Jalankan 5 kali → 5 baris duplikat di /etc/sudoers
# BENAR: Menggunakan module yang idempoten
- name: Add user to sudoers
lineinfile:
path: /etc/sudoers
line: "deploy ALL=(ALL) NOPASSWD:ALL"
state: present
# Module lineinfile cek dulu apakah baris sudah ada
# sebelum menambahkannya.
Tool imperatif bisa dibuat idempoten, tapi butuh disiplin ekstra dari penulisnya. Terraform menjamin idempotency secara built-in karena selalu membandingkan kondisi aktual dengan kondisi yang diinginkan sebelum melakukan perubahan apapun.
Masalah State Tracking #
Tool imperatif pada umumnya tidak menyimpan state tentang infrastruktur yang sudah dibuat. Ini menciptakan masalah ketika kamu perlu menghapus atau mengubah resource.
SKENARIO — Menghapus resource yang sudah tidak diperlukan:
Dengan tool imperatif (misal: script bash atau Ansible):
1. Kamu harus ingat apa saja yang sudah dibuat
2. Tulis task/perintah penghapusan secara manual
3. Pastikan urutan penghapusan benar (dependency)
4. Jalankan — dan berharap tidak ada yang terlewat
Dengan Terraform:
1. Hapus blok resource dari file .tf
2. terraform apply
3. Terraform membandingkan state dengan konfigurasi baru
4. Terraform menghapus semua resource yang tidak lagi ada
di konfigurasi, dengan urutan yang benar secara otomatis
Kekuatan Tool Imperatif #
Bukan berarti tool imperatif buruk. Ada area di mana mereka lebih unggul dari Terraform.
KAPAN TOOL IMPERATIF LEBIH TEPAT:
✓ Konfigurasi dalam server (install package, copy file, set permissions)
✓ Orkestrasi proses (deploy aplikasi, jalankan migration database)
✓ Task ad-hoc (restart service, gather facts dari banyak server)
✓ Environment yang sangat heterogen (mix OS, legacy systems)
KAPAN TERRAFORM LEBIH TEPAT:
✓ Provisioning infrastruktur cloud (VM, network, storage, database)
✓ Mengelola resource yang punya lifecycle panjang
✓ Multi-cloud atau multi-provider
✓ Infrastruktur yang butuh audit trail dan review
Di praktik nyata, Terraform dan Ansible sering dipakai bersama-sama: Terraform untuk provisioning infrastruktur, Ansible untuk konfigurasi dalam server yang sudah dibuat.
Perbandingan Singkat #
| Aspek | Imperatif (Ansible, Chef) | Deklaratif (Terraform) |
|---|---|---|
| Cara berpikir | “Lakukan ini, lalu itu” | “Ini yang saya inginkan” |
| Idempotency | Harus dijaga manual | Built-in |
| State tracking | Tidak ada (umumnya) | Ada (terraform.tfstate) |
| Cocok untuk | Konfigurasi server | Provisioning infrastruktur |
| Dependency | Harus ditentukan manual | Dihitung otomatis |
| Rollback | Butuh playbook terpisah | Hapus dari config + apply |
Ringkasan #
- Imperatif = cara kerjanya, deklaratif = kondisi akhirnya — perbedaan mendasar ini menentukan bagaimana kamu berpikir saat menulis konfigurasi.
- Tool imperatif seperti Ansible unggul untuk konfigurasi dalam server dan orkestrasi proses — bukan untuk provisioning infrastruktur cloud.
- Idempotency di tool imperatif harus dijaga secara manual oleh penulisnya — Terraform menjaminnya secara built-in.
- State tracking adalah keunggulan utama Terraform — tool imperatif umumnya tidak tahu apa yang sudah ada sebelumnya.
- Terraform dan Ansible sering dipakai bersama — Terraform untuk infra, Ansible untuk konfigurasi di dalam server.