> For the complete documentation index, see [llms.txt](https://docs.verge.io/llms.txt). Markdown versions of documentation pages are available by appending `.md` to page URLs; this page is available as [Markdown](https://docs.verge.io/learn-the-platform/es/modulo-8-desarrollador-y-devops/lab.md).

# Laboratorio: Automatización de infraestructura

## Objetivo

Automatiza las operaciones de infraestructura de VergeOS usando la API REST, el proveedor de Terraform y herramientas de scripting (pyvergeos o PowerShell). Al finalizar este laboratorio, habrás aprovisionado VMs e inquilinos de forma programática y comprenderás cómo integrar VergeOS en flujos de trabajo de CI/CD y automatización.

## Requisitos previos

* Módulo 1 completado: Fundamentos de la arquitectura
* Módulo 6 completado: Máquinas virtuales
* Módulo 7 completado: Multiinquilinato
* Lectura del Módulo 8 completada (API REST, Terraform, Python/PowerShell, Cloud-Init)
* Un clúster de VergeOS en ejecución con acceso a la API habilitado
* Terraform instalado localmente (v1.5+)
* Python 3.9+ o PowerShell 7+ instalado localmente
* Acceso al [vergeos-terraform-playground](https://github.com/verge-io/vergeos-terraform-playground) repositorio

## Dificultad

**Intermedio** -- Requiere familiaridad con las API REST, conceptos de infraestructura como código y scripting básico

## Tiempo estimado

**2 horas**

## Pasos

### Parte 1: Exploración de la API REST

Autentícate con la API de VergeOS y realiza operaciones básicas.

1. Obtén una clave de API desde la interfaz de VergeOS (Sistema > Usuarios > \[tu usuario] > Claves de API)
2. Usa `curl` o un cliente REST para autenticarte:

   ```bash
   curl -X GET https://<tu-host-vergeos>/api/v4/vms \
     -H "Authorization: Bearer <tu-clave-api>"
   ```
3. Enumera todas las VMs usando el `/api/v4/vms` endpoint
4. Crea una nueva VM a través de la API:
   * POST a `/api/v4/vms` con un cuerpo JSON que especifique nombre, CPU, memoria y disco
5. Inicia y detén la VM usando la API
6. Elimina la VM a través de la API
7. Explora endpoints adicionales: redes (`/api/v4/vnets` — la tabla se llama `vnets` mientras que el nombre en la UI/objeto es "Networks"), inquilinos (`/api/v4/tenants`)

### Parte 2: Proveedor de Terraform

Usa el proveedor de Terraform de VergeOS para gestionar la infraestructura de forma declarativa.

1. Clona el repositorio vergeos-terraform-playground:

   ```bash
   git clone https://github.com/verge-io/vergeos-terraform-playground.git
   cd vergeos-terraform-playground
   ```
2. Revisa la configuración del proveedor en `main.tf`
3. Copia y personaliza un archivo de ejemplo `.tfvars` para tu entorno
4. Ejecuta `terraform init` para descargar el proveedor de VergeOS
5. Ejecuta `terraform plan` para previsualizar los cambios de infraestructura
6. Ejecuta `terraform apply` para aprovisionar recursos
7. Verifica los recursos creados en la interfaz de VergeOS
8. Modifica un recurso en la configuración de Terraform y vuelve a aplicar
9. Ejecuta `terraform destroy` para limpiar

### Parte 3: Automatización con scripting

Automatiza un flujo de trabajo usando pyvergeos (Python) o el módulo de PowerShell.

1. Instala pyvergeos:

   ```bash
   pip install pyvergeos
   ```
2. Escribe un script que:
   * Se conecte a tu clúster de VergeOS
   * Enumere todas las VMs y su estado actual
   * Cree una nueva VM a partir de una receta/plantilla
   * Espere a que la VM esté en ejecución
   * Devuelva la dirección IP de la VM y los detalles de conexión
3. Amplía el script para:
   * Crear un inquilino con asignaciones de recursos predefinidas
   * Desplegar una VM dentro del inquilino
   * Verificar el aislamiento del inquilino comprobando la conectividad de red

### Parte 4: Cloud-Init

Configura el aprovisionamiento desatendido de VMs usando cloud-init.

1. Crea un archivo de configuración de cloud-init con:
   * Configuración de nombre de host y de red
   * Cuentas de usuario y claves SSH
   * Comandos de instalación de paquetes
   * Scripts posteriores al arranque
2. Adjunta la configuración de cloud-init a una nueva VM a través de la API o la UI
3. Arranca la VM y verifica que la configuración de cloud-init se haya aplicado:
   * Comprueba el nombre de host y la configuración de red
   * Verifica que existan las cuentas de usuario
   * Confirma que se instalaron los paquetes

## Verificación

Tu laboratorio de automatización de infraestructura está completo cuando puedas responder **sí** a todo lo siguiente:

* [ ] Se autenticó correctamente con la API REST de VergeOS y realizó operaciones CRUD en VMs
* [ ] Aprovisionó infraestructura usando el proveedor de Terraform desde el repositorio playground
* [ ] Modificó y volvió a aplicar la configuración de Terraform, observando cambios incrementales
* [ ] Creó un script (Python o PowerShell) que automatiza el aprovisionamiento de VMs y/o inquilinos
* [ ] Configuró una VM con cloud-init para una configuración desatendida y verificó que se aplicó la configuración
* [ ] Limpié todos los recursos del laboratorio (VMs, inquilinos, estado de Terraform)


---

# Agent Instructions
This documentation is published with GitBook. GitBook is the documentation platform designed so that both humans and AI agents can read, navigate, and reason over technical content effectively. Learn more at gitbook.com.

## Querying This Documentation
If you need additional information that is not directly available in this page, you can query the documentation dynamically by asking a question.

Perform an HTTP GET request on the current page URL with the `ask` query parameter, and the optional `goal` query parameter:

```
GET https://docs.verge.io/learn-the-platform/es/modulo-8-desarrollador-y-devops/lab.md?ask=<question>&goal=<endgoal>
```

`ask` is the immediate question: it should be specific, self-contained, and written in natural language.
`goal` is optional and describes the broader end goal you are ultimately trying to accomplish on behalf of the user. GitBook uses it to tailor the answer towards what is most useful for that goal.

The response will contain a direct answer to the question and relevant excerpts and sources from the documentation.

Use this mechanism when the answer is not explicitly present in the current page, you need clarification or additional context, or you want to retrieve related documentation sections.
