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 #

AspekImperatif (Ansible, Chef)Deklaratif (Terraform)
Cara berpikir“Lakukan ini, lalu itu”“Ini yang saya inginkan”
IdempotencyHarus dijaga manualBuilt-in
State trackingTidak ada (umumnya)Ada (terraform.tfstate)
Cocok untukKonfigurasi serverProvisioning infrastruktur
DependencyHarus ditentukan manualDihitung otomatis
RollbackButuh playbook terpisahHapus 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.

← Sebelumnya: Infrastruktur Manual   Berikutnya: Alternatif →

About | Author | Content Scope | Editorial Policy | Privacy Policy | Disclaimer | Contact