# Esquema de Batalla: Tema 17 - Automatización y Orquestación TIC (FOSS) 1. **Conceptos Fundamentales (La diferencia vital)** - **Automatización**: Hacer que un sistema ejecute una tarea repetitiva sin intervención humana (ej. un script en Bash que hace un backup a las 3 AM). - **Orquestación**: Coordinar múltiples tareas automatizadas, en varios sistemas y con un orden lógico (ej. desplegar una base de datos, luego los servidores web, conectarlos y avisar por email de que todo está listo). 2. **Infraestructura como Código (IaC - Infrastructure as Code)** - **Concepto**: Tratar los servidores, redes y bases de datos como si fueran líneas de código fuente. - **Herramienta Rey**: **Terraform** (o su fork libre OpenTofu). - *Paradigma*: Declarativo (tú dices "quiero 3 servidores", y Terraform se busca la vida para crearlos en AWS, Proxmox o VMware). 3. **Gestión de la Configuración (Configuration Management)** - **Concepto**: Una vez que el servidor existe, ¿cómo me aseguro de que tiene instalado Apache, PHP y los puertos abiertos correctos en los 50 servidores a la vez? - **Herramientas Libres Principales**: - **Ansible**: El favorito moderno. *Agentless* (no requiere instalar un agente en el cliente, usa SSH). Trabaja en modo Push (empuja la configuración desde el nodo de control). Ficheros YAML (Playbooks). - **Puppet / Chef**: Más clásicos. Requieren agente instalado en las máquinas cliente. Trabajan en modo *Pull* (el cliente pregunta al servidor "¿qué configuración debo tener?"). 4. **Orquestación de Contenedores (El hermano mayor de Docker)** - *Concepto*: Si tengo cientos de contenedores Docker, ¿qué pasa si uno se cae? ¿Cómo reparto la carga? - **Herramienta Rey**: **Kubernetes (K8s)**. Automatiza el despliegue, el escalado y el manejo de aplicaciones en contenedores. - **Alternativa más ligera**: **Docker Swarm** (orquestador nativo de Docker, más sencillo pero menos potente). 5. **Integración y Despliegue Continuo (CI/CD)** - **Concepto**: Automatizar el ciclo de vida del software (el código se sube al repositorio, se testea automáticamente y se despliega en producción). - **Herramientas**: **Jenkins** (el clásico, enorme ecosistema de plugins) y **GitLab CI/CD** (integrado directamente con el repositorio de código). # Ansible Ansible es una herramienta de automatización de TI de código abierto, sin agentes ("agentless") y fácil de usar, diseñada para gestionar la configuración, el aprovisionamiento, el despliegue de aplicaciones y la orquestación de tareas en infraestructura, servidores y redes. Utiliza archivos YAML (Playbooks) para definir el estado deseado, facilitando tareas repetitivas mediante SSH. **Aspectos clave de Ansible:** - **Sin agentes (Agentless)**: No requiere instalar software adicional en los nodos gestionados, ya que se conecta por SSH o CQR Shell. - **Idempotencia**: Garantiza que el sistema alcance el estado deseado sin importar su estado inicial, evitando cambios innecesarios. - **YAML (Playbooks)**: Utiliza un lenguaje sencillo basado en YAML, lo que hace que los scripts sean legibles y fáciles de entender. - **Módulos y Roles**: Se basa en módulos para ejecutar tareas específicas (gestión de paquetes, usuarios, servicios) y utiliza roles para organizar y reutilizar la automatización. - **Usos principales**: Aprovisionamiento de servidores, gestión de configuraciones, despliegue de aplicaciones y seguridad. Es una herramienta fundamental para equipos DevOps y administradores de sistemas que buscan estandarizar y automatizar la infraestructura, incluyendo entornos en la nube y dispositivos de red. # Terraform Terraform es una herramienta de Infraestructura como Código (IaC) de código abierto, creada por HashiCorp, que permite definir, aprovisionar y gestionar infraestructuras en la nube (AWS, Azure, GCP) y locales mediante archivos de configuración declarativos. Utiliza el lenguaje HCL (HashiCorp Configuration Language) para automatizar el ciclo de vida de los recursos de manera segura, eficiente y reproducible. ## Características y Beneficios Principales - **Enfoque Declarativo**: Tú defines el estado deseado de la infraestructura ("qué" quieres), y Terraform se encarga de determinar cómo lograrlo ("cómo" crearlo). - **Agnóstico a la Nube (Multi-cloud)**: Permite gestionar recursos en múltiples proveedores de nube como AWS, Azure, Google Cloud, Oracle Cloud, y más, usando el mismo flujo de trabajo. - **Infraestructura como Código (IaC)**: La infraestructura se define en archivos de texto, lo que permite el control de versiones (ej. Git), la colaboración y la reutilización. - **Inmutabilidad y Automatización**: Facilita la creación de infraestructuras reproducibles y evita la "deriva de configuración" (configuration drift). ## Flujo de Trabajo de Terraform 1. **Escribir** (`terraform init / plan`): Se definen los recursos en archivos de configuración (.tf) y se genera un plan de ejecución para visualizar los cambios antes de aplicarlos. 2. **Planificar** (`terraform plan`): Compara el estado deseado con el estado actual y muestra qué recursos se crearán, actualizarán o eliminarán. 3. **Aplicar** (`terraform apply`): Ejecuta las acciones necesarias para alcanzar el estado deseado. ## Componentes Clave - **HashiCorp Configuration Language (HCL)**: Lenguaje diseñado para ser legible y fácil de escribir por humanos. - **Proveedores (Providers)**: Plugins que Terraform utiliza para interactuar con las APIs de los proveedores de nube (por ejemplo, el proveedor de AWS). - **Estado (State)**: Archivo que rastrea el estado real de la infraestructura gestionada, permitiendo a Terraform saber qué recursos existen. ## Diferencias Clave - **Terraform vs. Ansible**: Terraform se especializa en el aprovisionamiento de infraestructura (servidores, redes), mientras que Ansible se centra más en la configuración de software dentro de esos servidores. - **Terraform vs. Kubernetes**: Terraform aprovisiona la infraestructura (como los clústeres), mientras que Kubernetes gestiona las aplicaciones en contenedores dentro de ellos. # Puppet Puppet es una herramienta de gestión de configuración y automatización de software de código abierto, utilizada por administradores de sistemas para configurar, implementar y administrar infraestructuras de TI complejas. Utiliza un lenguaje declarativo para definir el estado deseado de servidores y automatiza el mantenimiento de esa configuración. **Características principales de Puppet:** - **Modelo Cliente-Servidor (Agent-Master)**: Funciona mediante un servidor central (Puppet Master) y agentes que se ejecutan en los sistemas configurados. - **Gestión Declarativa**: Permite al administrador definir "qué" configuración debe tener el sistema (estado final), en lugar de "cómo" lograrlo. - **Automatización de Infraestructura**: Automatiza la instalación, gestión de archivos, usuarios, servicios y despliegue de máquinas. - **Autocorrección (Idempotencia)**: Puppet se ejecuta regularmente (por defecto cada 30 minutos) para asegurar que la configuración actual coincida con la deseada, corrigiendo cualquier desviación automáticamente. - **Lenguaje propio (DSL)**: Utiliza su propio lenguaje de dominio específico (Puppet DSL) para definir las configuraciones. Es una herramienta esencial en entornos DevOps para gestionar cientos o miles de servidores de manera eficiente, popularizada por Puppet Labs. # GitLab CI/CD GitLab CI/CD es una herramienta integrada en GitLab que automatiza el ciclo de vida del desarrollo de software, incluyendo la integración (compilación/pruebas) y la entrega continua (despliegue). Utiliza un archivo .gitlab-ci.yml para definir flujos de trabajo (pipelines) que se ejecutan automáticamente en cada cambio de código, facilitando pruebas y despliegues rápidos, seguros y consistentes. **Características principales y funcionamiento:** - **Integración continua (CI)**: Automatiza la construcción y las pruebas de cada cambio en el código fuente, permitiendo detectar errores tempranamente. - **Entrega/Despliegue continuo (CD)**: Automatiza el lanzamiento de aplicaciones, permitiendo que el software se despliegue automáticamente a producción o entornos de pruebas. - **.gitlab-ci.yml**: Archivo YAML donde se configuran las etapas (stages), trabajos (jobs) y dependencias del flujo de trabajo. - **GitLab Runners**: Son agentes o servidores dedicados que ejecutan los trabajos definidos en el pipeline, permitiendo que los procesos no ocurran localmente. - **Pipeline automatizado**: Cada vez que se realiza un push o un merge request, GitLab inicia automáticamente el pipeline, ejecutando tareas como compilación, pruebas y despliegue. **Ventajas de usar GitLab CI/CD:** - **Plataforma única**: Evita la necesidad de herramientas externas para la gestión de repositorios y automatización. - **Visibilidad**: Ofrece una interfaz para ver el estado de los trabajos y los registros (logs). - **Eficiencia**: Acelera el ciclo de desarrollo y entrega de software.