Saltar al contenido principal

🏗️ 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
📦 Prerrequisito

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.

Tela de acesso ao menu My Account com opção OpenStack Credentials na plataforma Nuvion


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

Botão Generate Credentials na tela de OpenStack Credentials


Completa el formulario con la información necesaria:

CampoDescripción
NombreIdentificador amigable para la credencial
ProyectoProyecto al que estará vinculada la credencial
RegiónRegión de actuación de la credencial
Fecha de expiraciónDéjalo en blanco para que la credencial nunca expire
DescripciónCampo opcional para describir el uso de la credencial

Formulário de criação de credenciais OpenStack com campos Nome, Projeto, Região, Expiração e Descrição


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
⚠️ Atención al guardar las credenciales

El Credentials Secret se muestra solo una vez. Si no lo guardas en este momento, será necesario generar un nuevo par de credenciales.

Tela com os dados gerados: Server URL, Credentials ID e Credentials Secret


📁 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"
🔒 Seguridad del terraform.tfvars

Este 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

CampoDescripción
<ssh-keypair-resource-id>Identificador lógico del recurso en Terraform (ej.: keypair_nuvion)
nameNombre del par de claves que se mostrará en la plataforma Nuvion (ej.: minha-chave-terraform)
public_keyContenido de tu clave pública (ej.: ssh-ed25519 AAAA...) — el mismo valor registrado manualmente en SSH Keys en la plataforma
💡 Obteniendo el valor de la clave pública

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.

🔗 Referenciando el keypair en la instancia

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"

CampoDescripción
<data-resource-id>Identificador lógico del recurso dentro de Terraform (ej.: ubuntu_22)
nameNombre exacto de la imagen disponible en la plataforma (ej.: Ubuntu 22.04)
most_recentCuando true, selecciona la versión más reciente de la imagen si hay múltiples coincidencias

resource "openstack_blockstorage_volume_v3"

CampoDescripción
<volume-resource-id>Identificador lógico del volumen en Terraform (ej.: vm_boot_volume)
nameNombre del volumen que se mostrará en la plataforma
sizeTamaño del volumen en GB (ej.: 50)
image_idReferencia a la imagen obtenida por el bloque data arriba

resource "openstack_compute_instance_v2"

CampoDescripción
<compute-resource-id>Identificador lógico de la instancia en Terraform (ej.: minha_vm)
nameNombre de la VM mostrado en la plataforma
flavor_nameTipo de instancia que define CPU, RAM y recursos (ej.: m1.small)
key_pairReferencia al par de claves SSH creado por el recurso openstack_compute_keypair_v2
security_groupsLista de grupos de seguridad aplicados a la instancia
network.nameNombre de la red a la que la VM estará conectada
block_device.uuidReferencia al volumen creado anteriormente
block_device.source_typeOrigen del dispositivo de arranque — volume indica un volumen en bloque
block_device.destination_typeDestino del dispositivo — volume para almacenamiento persistente
block_device.boot_indexOrden de arranque — 0 indica el disco principal
block_device.delete_on_terminationCuando 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
💡 Confirmación del apply

El 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! 🎉

🛡️ Buenas prácticas con Terraform
  • 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.tfvars con credenciales en repositorios públicos.
  • Usa el terraform plan siempre antes del apply para 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.

ℹ️ Enlaces útiles

Documentación oficial de Terraform