Paket 2 · Praktik LanjutanModul I — Infrastructure Automation

Infrastructure as Code dengan Terraform

Mengelola infrastruktur secara deklaratif dengan Terraform: provider, state, plan, module, variable, dan remote backend.

Terraform mendefinisikan infrastruktur sebagai kode deklaratif. Anda menyatakan kondisi yang diinginkan, lalu Terraform menghitung langkah untuk mencapainya.

Konsep utama

KonsepArti
ProviderPlugin untuk platform (Proxmox, AWS, Cloudflare)
ResourceObjek yang dikelola (VM, network, DNS)
StateCatatan kondisi infrastruktur
PlanRencana perubahan
ApplyEksekusi perubahan
ModuleKumpulan resource reusable
VariableInput konfigurasi
OutputNilai hasil

Alur kerja

terraform init
terraform fmt
terraform validate
terraform plan -out=tfplan
terraform apply tfplan
terraform destroy

Selalu review plan sebelum apply.

Struktur project

terraform/
├─ main.tf
├─ variables.tf
├─ outputs.tf
├─ providers.tf
├─ backend.tf
├─ terraform.tfvars
└─ modules/
   └─ vm/
      ├─ main.tf
      ├─ variables.tf
      └─ outputs.tf

Provider Proxmox

terraform {
  required_version = ">= 1.8"

  required_providers {
    proxmox = {
      source  = "bpg/proxmox"
      version = "~> 0.66"
    }
  }
}

provider "proxmox" {
  endpoint  = var.proxmox_endpoint
  api_token = var.proxmox_token
  insecure  = true
}

Jangan simpan token di file yang di-commit. Gunakan environment variable atau secret manager.

Resource VM

resource "proxmox_virtual_environment_vm" "web" {
  name      = "web-01"
  node_name = "pve"
  vm_id     = 110

  clone {
    vm_id = 9000
  }

  cpu {
    cores = 2
  }

  memory {
    dedicated = 2048
  }

  network_device {
    bridge = "vmbr0"
  }
}

Variable dan output

variables.tf:

variable "proxmox_endpoint" {
  type      = string
  sensitive = true
}

variable "proxmox_token" {
  type      = string
  sensitive = true
}

variable "vm_count" {
  type    = number
  default = 1
}

outputs.tf:

output "vm_ids" {
  value = [for vm in proxmox_virtual_environment_vm.web : vm.vm_id]
}

Module

modules/vm/main.tf:

variable "name" { type = string }
variable "cores" { type = number }
variable "memory" { type = number }

resource "proxmox_virtual_environment_vm" "this" {
  name      = var.name
  node_name = "pve"

  cpu { cores = var.cores }
  memory { dedicated = var.memory }
}

Pemakaian:

module "app" {
  source = "./modules/vm"
  name   = "app-01"
  cores  = 2
  memory = 2048
}

State

State menyimpan pemetaan resource ke infrastruktur nyata.

  • Jangan commit state ke Git (bisa berisi data sensitif).
  • Gunakan remote backend dengan locking.
  • Backup state.

Contoh backend S3:

terraform {
  backend "s3" {
    bucket         = "org-terraform-state"
    key            = "devops/proxmox.tfstate"
    region         = "ap-southeast-1"
    dynamodb_table = "terraform-locks"
    encrypt        = true
  }
}

Untuk Proxmox, state bisa disimpan di S3/MinIO atau backend lain yang mendukung locking.

State adalah sumber kebenaran

Kehilangan state membuat Terraform tidak tahu resource mana yang sudah ada. Selalu gunakan backend remote dan backup.

Workspace dan environment

terraform workspace new staging
terraform workspace new production
terraform workspace select production
terraform plan

Atau pisahkan direktori/state per environment agar isolasi lebih jelas.

Drift

Drift terjadi saat infrastruktur berubah di luar Terraform.

terraform plan -refresh-only
terraform apply -refresh-only

Jangan biarkan perubahan manual permanen; kembalikan ke kode atau perbarui kode.

Rahasia

  • Tandai variable sensitive = true.
  • Gunakan environment variable TF_VAR_*.
  • Simpan state di storage terenkripsi.
  • Gunakan secret manager untuk kredensial.
  • Jangan menaruh token di output.

Praktik: provisioning VM

  1. Siapkan token API Proxmox.
  2. Buat template VM.
  3. Tulis konfigurasi provider dan resource.
  4. terraform init.
  5. terraform plan dan review.
  6. terraform apply.
  7. Verifikasi VM di Proxmox.
  8. Simpan state remote.

Ringkasan

  • Terraform mengelola infrastruktur deklaratif dan idempotent.
  • Plan sebelum apply; review perubahan.
  • State harus remote, terkunci, dan terbackup.
  • Module dan variable membuat konfigurasi reusable.
  • Rahasia tidak boleh masuk kode/state terbuka.

Selanjutnya

Konfigurasi server di Server Automation dengan Ansible.

On this page