# 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. 