🏗️ Creando una VM con Terraform
Terraform es una herramienta de Infraestructura como Código (IaC — Infrastructure as Code) desarrollada por HashiCorp. Con ella, describes toda tu infraestructura en archivos de configuración declarativos, permitiendo aprovisionar, modificar y destruir recursos de forma automatizada, versionable y reproducible.
Al utilizar Terraform con la plataforma Nuvion, obtienes beneficios como:
- 🔁 Reproducibilidad — recrea entornos idénticos con un solo comando
- 📋 Versionado — controla cambios en la infraestructura con Git
- ⚡ Agilidad — aprovisiona múltiples recursos en paralelo de forma automática
- 🔍 Auditabilidad — todo el estado de la infraestructura queda registrado en código
Antes de comenzar, asegúrate de que Terraform está instalado en tu máquina. Puedes descargarlo en https://developer.hashicorp.com/terraform/downloads.
Verifica la instalación con:
terraform -version
🔑 Paso 1 — Generando las credenciales OpenStack
El provider utilizado es OpenStack, que posee compatibilidad nativa con la plataforma Nuvion. Para que Terraform pueda autenticarse y gestionar recursos, es necesario generar credenciales de aplicación (Application Credentials).
Accede a tu cuenta y navega hasta My Account > OpenStack Credentials.

Haz clic en Generate Credentials para iniciar la creación de las credenciales de acceso.

Completa el formulario con la información necesaria:
| Campo | Descripción |
|---|---|
| Nombre | Identificador amigable para la credencial |
| Proyecto | Proyecto al que estará vinculada la credencial |
| Región | Región de actuación de la credencial |
| Fecha de expiración | Déjalo en blanco para que la credencial nunca expire |
| Descripción | Campo opcional para describir el uso de la credencial |

Después de generar, guarda inmediatamente los siguientes datos — serán utilizados en la configuración de Terraform:
- 🔗 Server URL — endpoint de autenticación de la API OpenStack
- 🪪 Credentials ID — identificador único de la credencial
- 🔐 Credentials Secret — secreto asociado a la credencial
El Credentials Secret se muestra solo una vez. Si no lo guardas en este momento, será necesario generar un nuevo par de credenciales.

📁 Paso 2 — Estructura de los archivos de configuración
La configuración básica de Terraform se divide en tres archivos principales. Esta separación es una buena práctica que facilita el mantenimiento, el versionado y la reutilización de las configuraciones.
.
├── provider.tf # Configuração do provider OpenStack
├── terraform.tfvars # Valores das variáveis (credenciais e endpoints)
├── 00-variables.tf # Declaração das variáveis utilizadas
├── ssh-keypair.tf # Gerenciamento do par de chaves SSH via Terraform
└── instance.tf # Definição da VM e dos recursos associados
📄 provider.tf
Define la versión mínima de Terraform y configura el provider OpenStack, informando las credenciales y la región mediante variables.
terraform {
required_version = ">= 0.14.0"
required_providers {
openstack = {
source = "terraform-provider-openstack/openstack"
version = "~> 1.53.0"
}
}
}
provider "openstack" {
application_credential_id = var.application_credential_id
application_credential_secret = var.application_credential_secret
auth_url = var.os_auth_url
region = var.os_region
}
📄 terraform.tfvars
Archivo donde se definen los valores reales de las variables. Sustituye los campos entre < > por los datos obtenidos al generar las credenciales OpenStack.
application_credential_id = "<credentials-id>"
application_credential_secret = "<credentials-secret>"
os_auth_url = "https://cmp.console.saveincloud.io/openstack/2"
os_region = "RegionOne"
terraform.tfvarsEste archivo contiene información sensible. Agrégalo al .gitignore de tu repositorio para evitar que las credenciales se expongan accidentalmente en sistemas de control de versiones.
# .gitignore
terraform.tfvars
*.tfstate
*.tfstate.backup
.terraform/
📄 00-variables.tf
Declara las variables utilizadas por el provider, sin asignar valores — estos se leen del terraform.tfvars en tiempo de ejecución.
variable "application_credential_id" {}
variable "application_credential_secret" {}
variable "os_auth_url" {}
variable "os_region" {}
🔑 Paso 3 — Gestionando el par de claves SSH con ssh-keypair.tf
El archivo ssh-keypair.tf permite que el par de claves SSH utilizado para acceso a la VM sea gestionado directamente por Terraform, centralizando toda la infraestructura en código y eliminando la necesidad de registrar la clave manualmente en la plataforma.
resource "openstack_compute_keypair_v2" "<ssh-keypair-resource-id>" {
name = "<name>"
public_key = "<chave-publica>"
}
📖 Descripción de los campos
| Campo | Descripción |
|---|---|
<ssh-keypair-resource-id> | Identificador lógico del recurso en Terraform (ej.: keypair_nuvion) |
name | Nombre del par de claves que se mostrará en la plataforma Nuvion (ej.: minha-chave-terraform) |
public_key | Contenido de tu clave pública (ej.: ssh-ed25519 AAAA...) — el mismo valor registrado manualmente en SSH Keys en la plataforma |
El valor de public_key es el contenido del archivo .pub generado por ssh-keygen o PuTTYgen. Para mostrarlo en la terminal, utiliza:
cat ~/.ssh/id_ed25519.pub
Copia la salida completa, incluyendo el prefijo ssh-ed25519 y el comentario al final.
Después de declarar el recurso openstack_compute_keypair_v2, refiérelo en el instance.tf por el atributo name del recurso creado:
key_pair = openstack_compute_keypair_v2.<ssh-keypair-resource-id>.name
Esto garantiza que Terraform aplique las dependencias en el orden correcto — creando el keypair antes de aprovisionar la VM.
🖥️ Paso 4 — Definiendo la VM con instance.tf
El archivo instance.tf declara todos los recursos necesarios para aprovisionar la máquina virtual: la imagen del sistema operativo, el volumen de almacenamiento y la instancia de cómputo en sí.
# -------------------------------------------------------
# 1. Busca a imagem do sistema operacional mais recente
# -------------------------------------------------------
data "openstack_images_image_v2" "<data-resource-id>" {
name = "<nome-da-imagem>"
most_recent = true
}
# -------------------------------------------------------
# 2. Cria o volume de armazenamento (disco da VM)
# -------------------------------------------------------
resource "openstack_blockstorage_volume_v3" "<volume-resource-id>" {
name = "<nome-do-volume>"
size = <tamanho-do-volume>
image_id = data.openstack_images_image_v2.<data-resource-id>.id
}
# -------------------------------------------------------
# 3. Provisiona a instância de computação (VM)
# -------------------------------------------------------
resource "openstack_compute_instance_v2" "<compute-resource-id>" {
name = "<nome-vm>"
flavor_name = "<flavor>"
key_pair = openstack_compute_keypair_v2.<ssh-keypair-resource-id>.name
security_groups = ["default"]
network {
name = "<nome-da-rede>"
}
block_device {
uuid = openstack_blockstorage_volume_v3.<volume-resource-id>.id
source_type = "volume"
destination_type = "volume"
boot_index = 0
delete_on_termination = true
}
}
📖 Descripción de los campos
data "openstack_images_image_v2"
| Campo | Descripción |
|---|---|
<data-resource-id> | Identificador lógico del recurso dentro de Terraform (ej.: ubuntu_22) |
name | Nombre exacto de la imagen disponible en la plataforma (ej.: Ubuntu 22.04) |
most_recent | Cuando true, selecciona la versión más reciente de la imagen si hay múltiples coincidencias |
resource "openstack_blockstorage_volume_v3"
| Campo | Descripción |
|---|---|
<volume-resource-id> | Identificador lógico del volumen en Terraform (ej.: vm_boot_volume) |
name | Nombre del volumen que se mostrará en la plataforma |
size | Tamaño del volumen en GB (ej.: 50) |
image_id | Referencia a la imagen obtenida por el bloque data arriba |
resource "openstack_compute_instance_v2"
| Campo | Descripción |
|---|---|
<compute-resource-id> | Identificador lógico de la instancia en Terraform (ej.: minha_vm) |
name | Nombre de la VM mostrado en la plataforma |
flavor_name | Tipo de instancia que define CPU, RAM y recursos (ej.: m1.small) |
key_pair | Referencia al par de claves SSH creado por el recurso openstack_compute_keypair_v2 |
security_groups | Lista de grupos de seguridad aplicados a la instancia |
network.name | Nombre de la red a la que la VM estará conectada |
block_device.uuid | Referencia al volumen creado anteriormente |
block_device.source_type | Origen del dispositivo de arranque — volume indica un volumen en bloque |
block_device.destination_type | Destino del dispositivo — volume para almacenamiento persistente |
block_device.boot_index | Orden de arranque — 0 indica el disco principal |
block_device.delete_on_termination | Cuando true, el volumen se elimina junto con la VM al destruir el recurso |
🚀 Paso 4 — Ejecutando Terraform
Con todos los archivos configurados, ejecuta los siguientes comandos en el directorio del proyecto:
# Inicializa o projeto e baixa o provider OpenStack
terraform init
# Exibe um plano detalhado de todos os recursos que serão criados
terraform plan
# Aplica as configurações e provisiona os recursos na plataforma
terraform apply
applyEl comando terraform apply solicitará una confirmación antes de crear los recursos. Escribe yes para continuar. Usa la flag -auto-approve para entornos CI/CD donde no se desea confirmación manual.
✅ Resumen del flujo
1. Gerar credenciais OpenStack na plataforma Nuvion
↓
2. Criar os arquivos provider.tf, terraform.tfvars e 00-variables.tf
↓
3. Declarar o par de chaves SSH no arquivo ssh-keypair.tf
↓
4. Definir os recursos da VM no arquivo instance.tf
↓
5. Executar terraform init → terraform plan → terraform apply
↓
6. VM provisionada e disponível na plataforma! 🎉
- Utiliza workspaces para separar entornos de desarrollo, homologación y producción.
- Almacena el state remotamente (ej.: en un bucket S3 o en Terraform Cloud) para trabajo en equipo.
- Nunca hagas commit del
terraform.tfvarscon credenciales en repositorios públicos. - Usa el
terraform plansiempre antes delapplypara revisar los cambios que se aplicarán. - Versiona tus módulos para garantizar estabilidad a lo largo del tiempo.
🧠 ¿Dudas?
Contacta con el soporte técnico y envía tu consulta, estaremos disponibles para ayudarte.