353.1 Herramientas de Gestión Cloud

Introducción

Las herramientas de gestión cloud permiten automatizar la creación, configuración y gestión de infraestructura de forma reproducible y versionable. Este concepto se conoce como Infraestructura como Código (IaC).

Infraestructura como Código (IaC)

IaC es la práctica de gestionar infraestructura mediante archivos de configuración declarativos o imperativos, en lugar de procesos manuales.

AspectoEnfoque DeclarativoEnfoque Imperativo
DefiniciónDescribe el estado deseadoDescribe los pasos a ejecutar
EjemploTerraform, CloudFormationScripts Bash, Ansible (parcialmente)
IdempotenciaIncorporadaDebe implementarse
VentajaPredecible, reproducibleFlexible, detallado

Beneficios de IaC

  • Reproducibilidad: Misma infraestructura en cualquier entorno.
  • Versionado: Control de cambios con Git.
  • Automatización: Eliminación de errores manuales.
  • Documentación: El código es la documentación.
  • Auditoría: Historial completo de cambios.

Terraform

Terraform es la herramienta de IaC más extendida. Permite gestionar infraestructura en múltiples proveedores cloud con un lenguaje declarativo unificado (HCL).

Conceptos fundamentales

ConceptoDescripción
ProviderPlugin que interactúa con una API (AWS, Azure, GCP, libvirt, etc.)
ResourceComponente de infraestructura (VM, red, disco, etc.)
Data SourceDatos consultados de la infraestructura existente
ModuleConjunto reutilizable de recursos
StateArchivo que mapea la configuración al estado real de la infraestructura
PlanVista previa de los cambios que se aplicarán

Ejemplo de configuración

# Definir provider
terraform {
  required_providers {
    aws = {
      source  = "hashicorp/aws"
      version = "~> 5.0"
    }
  }
}
 
provider "aws" {
  region = "eu-west-1"
}
 
# Definir recurso
resource "aws_instance" "web" {
  ami           = "ami-0c55b159cbfafe1f0"
  instance_type = "t2.micro"
 
  tags = {
    Name = "WebServer"
  }
}
 
# Variables
variable "instance_type" {
  default     = "t2.micro"
  description = "Tipo de instancia EC2"
}
 
# Outputs
output "public_ip" {
  value = aws_instance.web.public_ip
}

Flujo de trabajo Terraform

# Inicializar (descargar providers y módulos)
terraform init
 
# Planificar cambios (vista previa)
terraform plan
 
# Aplicar cambios
terraform apply
 
# Aplicar sin confirmación interactiva
terraform apply -auto-approve
 
# Destruir toda la infraestructura
terraform destroy
 
# Ver estado actual
terraform show
 
# Listar recursos en el estado
terraform state list
 
# Formatear archivos HCL
terraform fmt
 
# Validar configuración
terraform validate

State (Estado)

# El estado se almacena en terraform.tfstate
# Puede almacenarse remotamente (S3, GCS, Consul, etc.)
 
# Listar recursos en el estado
terraform state list
 
# Mover recurso en el estado
terraform state mv aws_instance.old aws_instance.new
 
# Eliminar recurso del estado (sin destruirlo)
terraform state rm aws_instance.web
 
# Importar recurso existente al estado
terraform import aws_instance.web i-1234567890abcdef0

Para el examen: El archivo de estado (terraform.tfstate) es crítico. Contiene el mapeo entre configuración y recursos reales. Nunca debe editarse manualmente y debe almacenarse de forma segura (puede contener datos sensibles).

Módulos

# Usar un módulo
module "vpc" {
  source  = "terraform-aws-modules/vpc/aws"
  version = "5.0.0"
 
  name = "mi-vpc"
  cidr = "10.0.0.0/16"
}
 
# Módulo local
module "web" {
  source = "./modules/web-server"
 
  instance_type = var.instance_type
}

Ansible

Ansible es una herramienta de automatización y gestión de configuración sin agentes que usa SSH para conectarse a los hosts.

Conceptos clave

ConceptoDescripción
InventoryLista de hosts a gestionar
PlaybookArchivo YAML con tareas a ejecutar
RoleConjunto reutilizable de tareas, variables y archivos
TaskAcción individual (instalar paquete, copiar archivo, etc.)
ModuleUnidad de trabajo de Ansible (apt, copy, service, etc.)
HandlerTarea que se ejecuta solo cuando es notificada

Inventory

# /etc/ansible/hosts o inventario personalizado
[webservers]
web1.ejemplo.com
web2.ejemplo.com ansible_user=admin
 
[databases]
db1.ejemplo.com ansible_port=2222
 
[all:vars]
ansible_python_interpreter=/usr/bin/python3

Playbook

# site.yml
---
- name: Configurar servidores web
  hosts: webservers
  become: yes
  vars:
    http_port: 80
 
  tasks:
    - name: Instalar nginx
      apt:
        name: nginx
        state: present
        update_cache: yes
 
    - name: Copiar configuración
      copy:
        src: nginx.conf
        dest: /etc/nginx/nginx.conf
      notify: Reiniciar nginx
 
    - name: Asegurar que nginx está activo
      service:
        name: nginx
        state: started
        enabled: yes
 
  handlers:
    - name: Reiniciar nginx
      service:
        name: nginx
        state: restarted
# Ejecutar playbook
ansible-playbook -i inventario site.yml
 
# Verificar sin aplicar cambios (dry-run)
ansible-playbook -i inventario site.yml --check
 
# Ejecutar comando ad-hoc
ansible webservers -i inventario -m ping
ansible all -m shell -a "uptime"

Para el examen: Ansible es agentless (sin agente). Solo necesita SSH y Python en los hosts remotos. Terraform gestiona infraestructura; Ansible configura los sistemas ya creados. Son complementarias.

CloudFormation

AWS CloudFormation es el servicio nativo de IaC de Amazon Web Services:

# template.yaml
AWSTemplateFormatVersion: '2010-09-09'
Resources:
  WebServer:
    Type: AWS::EC2::Instance
    Properties:
      ImageId: ami-0c55b159cbfafe1f0
      InstanceType: t2.micro
      Tags:
        - Key: Name
          Value: WebServer
# Crear stack
aws cloudformation create-stack --stack-name mi-stack --template-body file://template.yaml
 
# Actualizar stack
aws cloudformation update-stack --stack-name mi-stack --template-body file://template.yaml
 
# Eliminar stack
aws cloudformation delete-stack --stack-name mi-stack

Pulumi

Pulumi permite definir infraestructura usando lenguajes de programación reales (Python, TypeScript, Go, etc.):

# __main__.py
import pulumi
import pulumi_aws as aws
 
server = aws.ec2.Instance("web",
    ami="ami-0c55b159cbfafe1f0",
    instance_type="t2.micro",
    tags={"Name": "WebServer"}
)
 
pulumi.export("public_ip", server.public_ip)
# Desplegar
pulumi up
 
# Destruir
pulumi destroy
 
# Vista previa
pulumi preview

OpenStack CLI

OpenStack es una plataforma de cloud privado. Su CLI permite gestionar recursos de computación, red y almacenamiento:

# Listar servidores
openstack server list
 
# Crear servidor
openstack server create --flavor m1.small --image ubuntu-22.04 \
  --network mi-red --key-name mi-clave mi-servidor
 
# Listar imágenes
openstack image list
 
# Listar redes
openstack network list
 
# Crear red
openstack network create mi-red
 
# Listar sabores (tipos de instancia)
openstack flavor list
 
# Eliminar servidor
openstack server delete mi-servidor

Para el examen: OpenStack es relevante para entornos de cloud privado. Los comandos siguen el patrón openstack <recurso> <acción>.

Resumen

HerramientaTipoEnfoqueUso principal
TerraformIaCDeclarativoProvisionar infraestructura multi-cloud
AnsibleConfiguraciónImperativo/DeclarativoConfigurar sistemas (sin agente)
CloudFormationIaCDeclarativoInfraestructura en AWS
PulumiIaCProgramáticoIaC con lenguajes reales
OpenStack CLICLIImperativoGestión de cloud privado

Trampas del examen

Errores comunes y distinciones criticas que LPI suele evaluar en este subtema:

  • Terraform plan vs applyplan solo muestra los cambios que se aplicarian sin ejecutarlos. apply ejecuta los cambios reales. apply sin un plan previo guardado pide confirmacion interactiva (a menos que se use -auto-approve). El examen puede preguntar que comando usar para ver cambios sin riesgo.
  • Terraform state es critico y contiene datos sensiblesterraform.tfstate mapea la configuracion HCL al estado real de la infraestructura. Contiene IPs, IDs, y posiblemente contraseñas. Nunca debe editarse manualmente ni almacenarse en repositorios publicos. El examen puede preguntar que sucede si se pierde el state file (respuesta: Terraform no sabe que recursos existen).
  • terraform destroy elimina TODOdestroy elimina todos los recursos gestionados por Terraform en el estado actual. No hay undo. El examen puede preguntar como eliminar un recurso especifico sin destruir todo (respuesta: terraform state rm para sacarlo del estado, o terraform destroy -target=recurso).
  • Terraform es declarativo, Ansible es (parcialmente) imperativo — Terraform describe el estado deseado y calcula los cambios. Ansible ejecuta tareas en orden. Terraform gestiona infraestructura (crear/destruir VMs, redes); Ansible configura lo que ya existe (instalar paquetes, copiar archivos). Son complementarios, no sustitutos.
  • Ansible es agentless — Ansible solo necesita SSH y Python en los hosts remotos. No instala ningun agente. Esto lo diferencia de Puppet y Chef que requieren agentes. El examen preguntara que herramienta no necesita agente (respuesta: Ansible).
  • terraform import no genera codigoterraform import solo añade un recurso existente al state file. NO genera la configuracion HCL correspondiente. El usuario debe escribir el bloque resource manualmente. El examen puede preguntar que hacer despues de importar (respuesta: escribir el recurso en HCL).
  • Ansible --check es dry-run pero no es fiable al 100%--check simula la ejecucion sin hacer cambios, pero algunos modulos no soportan check mode y las tareas que dependen de resultados anteriores pueden dar falsos negativos. El examen puede preguntar como verificar un playbook sin aplicar cambios.
  • CloudFormation es solo AWS, Terraform es multi-cloud — CloudFormation solo funciona con servicios AWS. Terraform soporta AWS, Azure, GCP, OpenStack, libvirt y cientos de providers mas via plugins. El examen puede preguntar que herramienta elegir para infraestructura multi-cloud.
  • terraform init se ejecuta siempre primeroinit descarga providers, modulos y configura el backend de estado. Debe ejecutarse antes de cualquier otro comando (plan, apply, destroy). Olvidar init tras cambiar providers o modulos causa errores. El examen puede mostrar un flujo de trabajo desordenado.
  • OpenStack sigue el patron openstack <recurso> <accion> — Todos los comandos OpenStack CLI siguen este patron: openstack server list, openstack image create, openstack network delete. El examen puede presentar comandos con sintaxis incorrecta y preguntar cual es valido.