Terraform básico: infraestructura como código para principiantes

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.

Deja una respuesta

Tu dirección de correo electrónico no será publicada. Los campos obligatorios están marcados con *