Konfigurasi yang baik tidak pernah hardcode. Episode ini membahas input variables untuk parameterisasi, local values untuk ekspresi DRY, dan output values untuk mengekstrak informasi pasca-apply. Inilah fondasi menulis kode OpenTofu yang reusable di tim dan multi-environment.

Di episode 3 kita mendeklarasikan provider, resource, dan data source. Ada satu masalah yang sengaja ditanam di contoh itu: nilai seperti region dan instance type tertulis keras di dalam kode. Sekarang bayangkan project dengan 20 resource dan dua environment — menghardcode semua nilai adalah resep bencana.
Episode 4 ini menjawab masalah tersebut dengan tiga alat HCL: input variables untuk parameter, local values untuk perhitungan perantara, dan output values untuk hasil akhir. Ketiganya adalah fondasi menulis kode OpenTofu yang reusable, bisa dipakai di environment berbeda, dan tetap mudah direview tim.
Block variable adalah cara memberi "lubang pengisi" pada konfigurasi. Deklarasinya:
variable "region" {
type = string
default = "ap-southeast-1"
description = "AWS region tempat resource dibuat"
}
variable "instance_type" {
type = string
description = "Tipe instance untuk web server"
validation {
condition = contains(["t3.micro", "t3.small", "t3.medium"], var.instance_type)
error_message = "instance_type harus salah satu dari t3.micro, t3.small, t3.medium."
}
}Empat atribut yang paling sering dipakai:
| Atribut | Fungsi |
|---|---|
type | Tipe data: string, number, bool, list, map, object |
default | Nilai fallback bila pemanggil tidak memberi nilai |
description | Dokumentasi untuk manusia dan tofu console |
validation | Aturan kustom; plan gagal bila kondisi tidak terpenuhi |
Lalu var.region dan var.instance_type direferensikan di resource:
resource "aws_instance" "web" {
ami = data.aws_ami.ubuntu.id
instance_type = var.instance_type
tags = {
Name = "${var.region}-web"
}
}Perhatikan bahwa referensi variabel menyebar ke banyak resource, tapi nilai hanya ditetapkan sekali — di sinilah parameterisasi bekerja.
Nilai variabel bisa datang dari banyak sumber. OpenTofu memilih berdasarkan urutan prioritas, dari yang paling rendah ke paling tinggi:
| Urutan | Sumber |
|---|---|
| 1 | Nilai default di deklarasi |
| 2 | Environment variable TF_VAR_<nama> |
| 3 | File terraform.tfvars |
| 4 | File terraform.tfvars.json |
| 5 | File *.auto.tfvars (urut abjad) |
| 6 | Argumen -var / -var-file di command line |
File .tfvars menyimpan nilai dalam format HCL tanpa deklarasi variable:
region = "ap-southeast-1"
instance_type = "t3.micro"Lalu dipakai dengan tofu apply -var-file=dev.tfvars. Ini pola dasar yang memungkinkan satu kode untuk banyak environment — cukup tukar file -var-file-nya.
Tip
Kombinasikan dengan file *.auto.tfvars (misal prod.auto.tfvars) agar terbaca otomatis tanpa menulis flag -var-file. Dengan pola penamaan per environment, satu codebase bisa dipakai untuk dev, staging, dan prod.
locals adalah variabel sementara yang dihitung dari nilai lain, dipakai sebagai perantara. Ia tidak bisa di-set dari luar — hanya hasil kalkulasi di dalam modul. Gunanya menghindari pengulangan ekspresi panjang yang sama di banyak resource.
locals {
name_prefix = "devvnull-${var.region}"
common_tags = {
Project = "learn-opentofu"
Env = var.environment
}
}Lalu dipakai sebagai local.name_prefix dan local.common_tags:
resource "aws_instance" "web" {
ami = data.aws_ami.ubuntu.id
instance_type = var.instance_type
tags = local.common_tags
}Aturan emasnya: kalau satu ekspresi dipakai lebih dari dua kali, jadikan locals. Ini prinsip DRY yang menjaga konfigurasi tetap konsisten dan mudah diubah di satu tempat.
Block output mengekspos informasi penting setelah tofu apply selesai — misalnya IP public, ID resource, atau URL endpoint. Bayangkan IP instance yang hanya bisa diketahui setelah dibuat; tanpa output, kalian harus membuka konsol cloud untuk mencarinya.
output "public_ip" {
value = aws_instance.web.public_ip
description = "Alamat IP public dari web server"
}
output "db_password" {
value = aws_db_instance.main.password
sensitive = true
description = "Password database (sensitive)"
}Setelah apply, tofu output menampilkan semua nilai dan tofu output public_ip menampilkan satu nilai. Atribut sensitive = true menyembunyikan nilai dari tampilan normal, mencegahnya bocor ke log CI.
Warning
Output sensitive menyembunyikan nilai dari tampilan, tapi nilai tetap tersimpan di state file. Jangan menganggapnya proteksi penuh — untuk rahasia sejati, kombinasikan dengan state encryption yang dibahas di episode 6.
Ringkasan episode 4:
variable memparameterisasi konfigurasi lengkap dengan atribut type, default, description, dan validation.TF_VAR, terraform.tfvars, *.auto.tfvars, lalu flag -var..tfvars menyimpan nilai per environment; satu codebase untuk banyak environment.locals untuk ekspresi DRY dan konstanta perhitungan.output untuk mengekstrak nilai pasca-apply, dengan sensitive = true untuk menyembunyikan rahasia.Kode kalian sekarang sudah parameterized dan reusable. Di episode 5 berikutnya kita membahas bagian paling penting untuk kolaborasi: remote state management dan state locking — cara menyimpan opentofu.tfstate di backend terpusat seperti S3, GCS, dan Azure Blob agar seluruh tim bekerja di state yang sama dan aman dari konflik. Sampai jumpa!