Terraform permite describir tu infraestructura (servidores, redes, DNS, balanceadores) en archivos de texto HCL y desplegarla de forma reproducible con un único comando. En vez de hacer clic en la consola web de AWS o crear VMs manualmente, escribes código que crea, modifica y destruye la infraestructura de forma declarativa.
Instalación
git clone https://github.com/tfutils/tfenv.git ~/.tfenv
echo 'export PATH="$HOME/.tfenv/bin:$PATH"' >> ~/.bashrc
source ~/.bashrc
tfenv install latest
tfenv use latest
wget https://releases.hashicorp.com/terraform/1.8.0/terraform_1.8.0_linux_amd64.zip
unzip terraform_1.8.0_linux_amd64.zip
sudo mv terraform /usr/local/bin/
winget install Hashicorp.Terraform
terraform --version
Conceptos fundamentales
- Provider: plugin que se conecta a una plataforma (AWS, Azure, GCP, Proxmox, Cloudflare…)
- Resource: elemento de infraestructura a crear (VM, subred, DNS record…)
- Data source: leer datos existentes sin crear nada
- Variable: parametrizar la configuración
- Output: exportar valores del despliegue
- State: archivo que registra qué recursos ha creado Terraform
Ejemplo práctico: VM en Proxmox
terraform {
required_providers {
proxmox = {
source = "telmate/proxmox"
version = "~> 2.9"
}
}
}
provider "proxmox" {
pm_api_url = "https://proxmox.miempresa.local:8006/api2/json"
pm_user = "terraform@pam"
pm_password = var.proxmox_password
pm_tls_insecure = true
}
resource "proxmox_vm_qemu" "web_server" {
count = 2 # crear 2 VMs
name = "web-${count.index + 1}"
target_node = "pve01"
clone = "ubuntu-24.04-template" # plantilla base
full_clone = true
cores = 2
memory = 2048
os_type = "cloud-init"
disk {
slot = 0
size = "20G"
type = "scsi"
storage = "local-lvm"
}
network {
model = "virtio"
bridge = "vmbr0"
}
ipconfig0 = "ip=10.0.0.${10 + count.index}/24,gw=10.0.0.1"
nameserver = "10.0.0.1"
sshkeys = file("~/.ssh/id_ed25519.pub")
tags = "web,production,terraform"
}
output "vm_ips" {
value = proxmox_vm_qemu.web_server[*].default_ipv4_address
}
Ejemplo: registro DNS en Cloudflare
terraform {
required_providers {
cloudflare = {
source = "cloudflare/cloudflare"
version = "~> 4.0"
}
}
}
provider "cloudflare" {
api_token = var.cloudflare_token
}
variable "cloudflare_token" {
sensitive = true
}
variable "zone_id" {
default = "tu-zone-id-de-cloudflare"
}
resource "cloudflare_record" "web" {
zone_id = var.zone_id
name = "www"
value = "93.184.216.34"
type = "A"
ttl = 300
proxied = true
}
resource "cloudflare_record" "mail" {
zone_id = var.zone_id
name = "@"
value = "mail.miempresa.com"
type = "MX"
priority = 10
ttl = 3600
}
Variables y archivos .tfvars
variable "proxmox_password" {
description = "Contraseña del usuario terraform en Proxmox"
type = string
sensitive = true
}
variable "vm_count" {
description = "Número de VMs a crear"
type = number
default = 2
validation {
condition = var.vm_count >= 1 && var.vm_count <= 10
error_message = "El número de VMs debe estar entre 1 y 10."
}
}
proxmox_password = "mi-password-seguro"
vm_count = 3
Flujo de trabajo básico
# 1. Inicializar el directorio (descarga los providers)
terraform init
# 2. Ver qué va a crear/modificar/destruir (SIEMPRE antes de apply)
terraform plan
# 3. Aplicar los cambios
terraform apply
# Pide confirmación; para automatizar: terraform apply -auto-approve
# 4. Ver el estado actual
terraform show
terraform state list
# 5. Destruir toda la infraestructura creada
terraform destroy
Estado remoto (trabajo en equipo)
El estado de Terraform debe estar centralizado para que todo el equipo trabaje con la misma versión:
terraform {
backend "s3" {
bucket = "mi-terraform-state"
key = "produccion/terraform.tfstate"
region = "eu-west-1"
encrypt = true
dynamodb_table = "terraform-lock" # para bloqueo de estado
}
}
También puedes usar Terraform Cloud (gratis hasta 5 usuarios) o GitLab-managed state.
Módulos: reutilizar código
module "servidores_web" {
source = "./modules/vm"
count = 3
vm_name = "web-${count.index}"
vm_memory = 2048
vm_cores = 2
}
Conclusión
Terraform convierte la infraestructura en código versionable, revisable y reproducible. El mismo archivo que crea 2 VMs en tu lab puede crear 20 en producción cambiando una variable. La curva de aprendizaje inicial de HCL se amortiza en la primera vez que necesitas recrear un entorno completo o revertir un cambio destructivo. Empieza con un provider que conoces (Proxmox, Cloudflare, DigitalOcean) y un recurso simple, y ve añadiendo complejidad.
