Terraform vs. Ansible: Mana yang Benar-Benar Anda Butuhkan?
Uraian praktis tentang Terraform dan Ansible, apa yang benar-benar baik dilakukan oleh setiap alat, dan cara menggabungkannya dalam pipeline IaC yang nyata.
Orang yang baru mengenal Infrastructure as Code biasanya menanyakan ini dengan salah satu dari dua cara: "alat mana yang harus saya pelajari terlebih dahulu" atau "mengapa tim menggunakan keduanya." Jawaban singkatnya adalah bahwa Terraform dan Ansible memecahkan masalah yang berbeda, dan sebagian besar setup produksi menggunakan keduanya sekaligus daripada memilih satu.
Apa yang sebenarnya dilakukan Terraform
Terraform adalah alat provisioning. Ini mendeklarasikan infrastruktur apa yang harus ada: VPC, tiga instance EC2, database RDS, bucket S3 dengan kebijakan tertentu. Anda menulis HCL yang menggambarkan keadaan akhir, jalankan terraform plan untuk melihat apa yang akan berubah, kemudian terraform apply untuk mewujudkannya. Terraform menyimpan state file (secara lokal atau di backend seperti bucket S3 dengan locking DynamoDB) yang memetakan konfigurasi Anda ke ID resource nyata di penyedia cloud.
Kekuatan di sini adalah resolusi dependency lintas penyedia. Jika Anda memberi tahu Terraform untuk membuat security group dan kemudian melampirkannya ke instance EC2, Terraform menentukan urutan secara otomatis. Ini juga bekerja di AWS, Azure, GCP, Cloudflare, Datadog, dan puluhan penyedia lainnya melalui workflow yang sama, yang penting setelah infrastruktur Anda mencakup lebih dari satu vendor.
Terraform buruk dalam apa pun yang terjadi di dalam mesin setelah mesin itu ada. Ini tidak menginstal paket, mengedit file config, atau me-restart service dengan cara yang bermakna secara berkelanjutan. Provisioner seperti remote-exec ada tetapi HashiCorp sendiri merekomendasikan menghindarinya untuk apa pun di luar bootstrapping.
Apa yang sebenarnya dilakukan Ansible
Ansible adalah alat configuration management. Ini terhubung melalui SSH (atau WinRM untuk Windows) dan menjalankan task terhadap mesin yang sudah ada: instal nginx, template file config, buat user, restart service, pastikan bahwa cron job ada. Playbook adalah YAML, dan modul dirancang idempotent, jadi menjalankan playbook yang sama dua kali seharusnya tidak mengubah apa pun di waktu kedua jika sistem sudah sesuai dengan keadaan yang diinginkan.
Ansible tidak perlu agent terinstal di host target, hanya Python dan akses SSH, yang membuatnya mudah untuk ditambahkan ke infrastruktur yang sudah ada. Ini juga baik untuk task orchestration yang bukan secara ketat "provisioning" — rolling restart di seluruh fleet, blue-green deploy step, menjalankan database migration di satu host dan kemudian memperbarui load balancer.
Tempat mereka tumpang tindih dan di mana orang kebingungan
Kedua alat secara teknis dapat melakukan sedikit pekerjaan satu sama lain. Ansible memiliki cloud module (amazon.aws.ec2_instance, azure.azcollection.azure_rm_virtualmachine) yang dapat memutar infrastruktur. Terraform memiliki provisioner yang dapat menjalankan shell command di instance baru. Tetapi menggunakan Ansible untuk provisioning berarti memberikan up Terraform's state tracking dan plan/diff workflow, dan menggunakan Terraform provisioner untuk configuration berarti memberikan up idempotent, repeatable config management.
Pemisahan praktis yang kebanyakan tim lakukan:
- Terraform membangun infrastruktur: network, compute instance, load balancer, managed database, IAM role.
- Ansible mengonfigurasi apa yang ada di atasnya: software install, user, config file, service state, application deployment step.
Contoh konkret dari handoff
Katakan Anda sedang membangun tiga web server di belakang load balancer di AWS.
resource "aws_instance" "web" {
count = 3
ami = data.aws_ami.ubuntu.id
instance_type = "t3.medium"
tags = { Name = "web-${count.index}" }
}
output "web_ips" {
value = aws_instance.web[*].public_ip
}
Terraform membuat instance dan menampilkan IP mereka. Anda dapat feed output itu ke dynamic Ansible inventory (plugin inventory amazon.aws.aws_ec2 membaca EC2 tag secara langsung, tidak perlu copy-paste manual) dan kemudian jalankan:
ansible-playbook -i aws_ec2.yml site.yml
di mana site.yml menginstal nginx, menjatuhkan app config, dan memulai service. Terraform tidak pernah menyentuh nginx. Ansible tidak pernah menyentuh VPC. Setiap alat tetap di jalurnya, dan setiap alat memiliki model state/idempotency sendiri yang tidak berkonflik dengan yang lain.
Kesalahan umum yang perlu dihindari
Menyimpan Terraform state di git adalah kesalahan awal paling umum — state file dapat berisi secret dalam plaintext dan menyebabkan merge conflict yang merusak model infrastruktur Anda. Gunakan remote backend dari hari pertama.
Dengan Ansible, kesalahannya adalah menulis playbook yang tidak benar-benar idempotent — menggunakan modul shell atau command untuk hal-hal yang memiliki modul yang tepat (ansible.builtin.apt, ansible.builtin.copy, ansible.builtin.systemd) yang sudah menangani check-then-act logic dengan benar.
Jika Anda memutuskan apa yang harus dipelajari terlebih dahulu: pelajari Terraform jika Anda melakukan cloud provisioning dan multi-environment setup, pelajari Ansible jika Anda mengelola config drift di server yang sudah Anda miliki. Sebagian besar role DevOps mengharapkan keakraban dengan keduanya dalam tahun pertama.
Untuk informasi lebih lanjut tentang state management, dynamic inventory, dan membangun full CI/CD pipeline di sekitar alat-alat ini, periksa segmen DevOps dan Cloud terkait di Korra Studio.
Ditulis dengan bantuan AI, ditinjau dan dipublikasikan oleh Michal Pilch (CISSP), Korra Studio.
Ini satu catatan dari basis pengetahuan Korra Studio — platform ini memasangkan setiap topik dengan bimbingan privat.
Mulai gratisarrow_forward