Problema

Los ingenieros recién contratados en equipos de DevOps suelen recibir una lista de tecnologías sin saber por dónde empezar. La presión es alta: se espera que automatices despliegues, mantengas pipelines y entregues infraestructura reproducible en pocos meses. Sin una hoja de ruta clara, el aprendizaje se vuelve caótico y el rendimiento inicial sufre.

Causa

  1. Expectativas amplias y poco definidas – Los managers suelen mencionar “automatizar todo” sin especificar herramientas.
  2. Superposición de conceptos – CI/CD, IaC y scripting se presentan como bloques independientes, aunque en la práctica se solapan.
  3. Falta de experiencia práctica – La mayoría de los recién graduados solo ha jugado con Kubernetes en laboratorio; carecen de exposición a entornos corporativos (Azure, PowerShell, Azure DevOps).
  4. Entorno de contrato corto – Con tres meses para demostrar valor, no hay tiempo para explorar tecnologías marginales.

Solución

Adoptar un enfoque por capas que combine infraestructura como código (IaC), automatización de procesos (scripting) y orquestación de pipelines (CI/CD). Cada capa tiene una herramienta principal que cubre la mayor parte de los casos reales:

Capa Herramienta principal Por qué
IaC Terraform Proveedor multi‑cloud, sintaxis declarativa, fácil de versionar.
Scripting PowerShell (para Windows/Azure) Integrado en Azure, acceso a módulos de AzureRM y Az, ideal para tareas ad‑hoc.
CI/CD Azure DevOps Pipelines Soporta YAML, se integra nativamente con repositorios Git y Azure Resource Manager.

Paso 1: Domina Terraform

  1. Instala y configura el CLI.
  2. Aprende la estructura de un proyecto: main.tf, variables.tf, outputs.tf, terraform.tfvars.
  3. Practica con el provider azurerm: crea un resource group, una red virtual y una máquina virtual.
  4. Versiona con Git y usa terraform fmt / terraform validate en cada commit.

Paso 2: Automatiza con PowerShell

  1. Familiarízate con los módulos Az (Install-Module -Name Az -Scope CurrentUser).
  2. Escribe funciones reutilizables que reciban parámetros y devuelvan objetos.
  3. Integra scripts en pipelines mediante la tarea PowerShell@2 de Azure DevOps.

Paso 3: Construye pipelines en Azure DevOps

  1. Crea un repositorio Git y habilita la rama main.
  2. Define un pipeline YAML que ejecute terraform init, plan y apply en etapas separadas.
  3. Añade un job de PowerShell para tareas post‑deploy (configuración de DNS, validaciones).
  4. Configura políticas de rama (pull request, revisiones, build obligatorio).

Paso 4: Cierra el bucle con pruebas y observabilidad

  • Usa Terraform plan como prueba de idempotencia.
  • Añade tests de PowerShell Pester para validar scripts.
  • Configura Azure Monitor y Log Analytics para observar cambios de infraestructura.

Cuándo aplicar esta solución

  • Entornos Azure: la combinación de Terraform + Az PowerShell + Azure DevOps cubre el 80 % de los casos.
  • Plazos cortos (1‑3 meses): la curva de aprendizaje de Terraform y PowerShell es rápida comparada con herramientas más complejas.
  • Equipos que ya usan Git: la integración nativa de Azure DevOps con repositorios Git facilita la adopción.

No es adecuada si:

  • La infraestructura está totalmente en AWS o GCP (cambia el provider y el CLI de scripting).
  • El proyecto requiere herramientas de orquestación de contenedores avanzadas (por ejemplo, Argo CD) sin soporte directo en Azure DevOps.

Código

# terraform/main.tf – ejemplo mínimo de Azure VM
terraform {
  required_version = ">= 1.0"
  required_providers {
    azurerm = {
      source  = "hashicorp/azurerm"
      version = "~>3.0"
    }
  }
}

provider "azurerm" {
  features {}
}

resource "azurerm_resource_group" "rg" {
  name     = "rg-devops-demo"
  location = "East US"
}

resource "azurerm_virtual_network" "vnet" {
  name                = "vnet-demo"
  address_space       = ["10.0.0.0/16"]
  location            = azurerm_resource_group.rg.location
  resource_group_name = azurerm_resource_group.rg.name
}
# scripts/Set-AzVmExtension.ps1 – PowerShell para agregar una extensión
param(
  [Parameter(Mandatory)] [string] $ResourceGroup,
  [Parameter(Mandatory)] [string] $VmName,
  [Parameter(Mandatory)] [string] $ExtensionName,
  [Parameter(Mandatory)] [string] $Publisher,
  [Parameter(Mandatory)] [string] $Type,
  [Parameter(Mandatory)] [string] $Version
)

Import-Module Az.Compute

$null = Set-AzVMExtension `
  -ResourceGroupName $ResourceGroup `
  -VMName $VmName `
  -Name $ExtensionName `
  -Publisher $Publisher `
  -ExtensionType $Type `
  -TypeHandlerVersion $Version `
  -Location (Get-AzResourceGroup -Name $ResourceGroup).Location

Verificación

  1. Terraform

    • Ejecuta terraform init && terraform plan.
    • Asegúrate de que el plan muestre solo recursos nuevos o modificados esperados.
    • Corre terraform apply -auto-approve y verifica en el portal Azure que el resource group y la VNet existan.
  2. PowerShell

    • Ejecuta .\Set-AzVmExtension.ps1 -ResourceGroup rg-devops-demo -VmName myVM -ExtensionName CustomScript -Publisher Microsoft.Compute -Type CustomScriptExtension -Version 1.10.
    • Confirma en Azure que la extensión aparece bajo la VM.
  3. Pipeline

    • Commitea los archivos y abre un Pull Request.
    • Azure DevOps debe disparar el pipeline, pasar todas las etapas y dejar el entorno desplegado.

Notas adicionales

  • Estado remoto: usa Azure Storage como backend para Terraform (azurerm backend) y evita conflictos cuando varios miembros editan la infraestructura.
  • Variables sensibles: almacena claves y contraseñas en Azure Key Vault y referencia los secretos en el pipeline mediante la tarea AzureKeyVault@2.
  • Reutilización: crea módulos Terraform (modules/network, modules/vm) para que el código sea escalable y fácil de versionar.
  • Documentación ligera: incluye un README.md en cada carpeta de módulo con ejemplos de uso; el tiempo invertido ahorra revisiones posteriores.
  • Iteración rápida: en entornos de prueba, habilita -target en Terraform para aplicar cambios parciales y validar scripts sin destruir toda la infraestructura.

Con este enfoque estructurado, un ingeniero junior puede demostrar valor en semanas, no en meses, y sentar las bases para una carrera sólida en DevOps.