Terraform es la herramienta estándar de la industria para gestionar infraestructura mediante Infraestructura como Código (IaC). En OASIX Cloud, Terraform permite automatizar completamente el despliegue y gestión de recursos en nuestra plataforma OpenStack mediante un enfoque declarativo y reproducible.
Ventajas principales:
.tfstateterraform planInstancias Permanentes con NetApp: A diferencia de otros proveedores cloud, OASIX Cloud utiliza instancias permanentes donde el disco de arranque está respaldado por volúmenes Cinder sobre tecnología NetApp, garantizando persistencia, alto rendimiento y protección de datos empresarial.
Características del almacenamiento:
OASIX Cloud ofrece 5 tiers de almacenamiento NetApp para cubrir diferentes necesidades de rendimiento:
| Tipo | Tecnología | IOPS | Throughput (~) | Uso Recomendado |
|---|---|---|---|---|
| Archive | HDD | 250 fijos | ~1.9 MB/s | Backups, archivos, datos fríos |
| FlashBasic | SSD | 1,000 fijos | ~7.8 MB/s | Desarrollo, aplicaciones moderadas |
| FlashPlus | SSD | 3,000 fijos | ~23.4 MB/s | Bases de datos pequeñas/medianas |
| FlashPremium | SSD | 6,000 fijos | ~46.9 MB/s | Bases de datos productivas, apps críticas |
| FlashScalePremium | SSD | 25 IOPS/GB (max 15,000) |
~117 MB/s | Cargas variables, máximo rendimiento |
Cómo elegir el tier correcto:
OASIX Cloud ofrece una plataforma OpenStack completa con los siguientes servicios disponibles a través de Terraform:
| Servicio | Componente | Descripción | Endpoint |
|---|---|---|---|
| Compute | Nova | Gestión de instancias virtuales | https://soax-mad-eqx.oasixcloud.es:8774/v2.1 |
| Almacenamiento | Cinder | Volúmenes de bloques persistentes | https://soax-mad-eqx.oasixcloud.es:8776/v3 |
| Imágenes | Glance | Catálogo de imágenes del sistema | https://soax-mad-eqx.oasixcloud.es:9292/v2 |
| Redes | Neutron | Redes virtuales, subredes, routers | https://soax-mad-eqx.oasixcloud.es:9696/v2.0 |
| Identidad | Keystone | Autenticación y RBAC | https://soax-mad-eqx.oasixcloud.es:5000/v3 |
| Orquestación | Heat | Plantillas de infraestructura | https://soax-mad-eqx.oasixcloud.es:8004/v1 |
| Secretos | Barbican | Gestión segura de credenciales | https://soax-mad-eqx.oasixcloud.es:9311/v1 |
| Kubernetes | Magnum | Clusters de contenedores | https://soax-mad-eqx.oasixcloud.es:9511/v1 |
| Métricas | Gnocchi | Monitorización y telemetría | https://soax-mad-eqx.oasixcloud.es:8041/v1 |
| Alarmas | Aodh | Sistema de alertas | https://soax-mad-eqx.oasixcloud.es:8042/v2 |
| Backup | Commvault | Backup y Disaster Recovery | https://backup.oasixcloud.es |
OASIX Cloud proporciona un catálogo completo de 36 imágenes listas para usar, incluyendo sistemas operativos, firewalls empresariales y aplicaciones preconfiguradas.
| Nombre | Distribución | Versión | Casos de Uso |
|---|---|---|---|
Ubuntu20_04 |
Ubuntu | 20.04 LTS | Aplicaciones legacy, soporte extendido |
Ubuntu22_04 |
Ubuntu | 22.04 LTS | Recomendado - Aplicaciones generales |
Ubuntu24_04 |
Ubuntu | 24.04 LTS | Última versión LTS, aplicaciones modernas |
Ubuntu22_04-GPU |
Ubuntu | 22.04 + Drivers NVIDIA | Machine Learning, rendering, GPU workloads |
Ubuntu-22.04-Baremetal |
Ubuntu | 22.04 optimizado | Servidores bare metal |
Ubuntu-24.04-Baremetal |
Ubuntu | 24.04 optimizado | Servidores bare metal |
Rocky-8 |
Rocky Linux | 8 | Reemplazo de CentOS 8, aplicaciones empresariales |
Rocky-9 |
Rocky Linux | 9 | Última versión, RHEL-compatible |
Rocky9-GPU |
Rocky Linux | 9 + Drivers NVIDIA | GPU workloads con RHEL compatibility |
Debian-11 |
Debian | 11 (Bullseye) | Estabilidad, servidores |
Debian-12 |
Debian | 12 (Bookworm) | Última estable, aplicaciones modernas |
ArchLinux |
Arch Linux | Rolling release | Última tecnología, experimentación |
fedora-38-coreos |
Fedora CoreOS | 38 | Contenedores, Kubernetes, immutable OS |
cirros |
CirrOS | Testing | Solo para pruebas y demos |
| Nombre | Versión | Licencia | Casos de Uso |
|---|---|---|---|
WindowsServer_2019_Standard |
Server 2019 | Standard | Active Directory, File Server, SQL Server |
WindowsServer_2022_Standard |
Server 2022 | Standard | Recomendado - Apps empresariales |
Windows_Server2022-GPU |
Server 2022 | Standard + GPU | Rendering, Machine Learning en Windows |
Windows_Server_2025_Standard |
Server 2025 | Standard | Última versión, nuevas características |
Nota sobre licencias Windows: Las licencias de Windows Server están incluidas en el coste del flavor. Contactar con tickets.oasixcloud.es para cualquier duda.
| Nombre | Fabricante | Versión | Casos de Uso |
|---|---|---|---|
FortiOS_V7_2_3 |
Fortinet | v7.2.3 | Recomendado - Firewall empresarial |
FW_FortiOS-v6 |
Fortinet | v6 | Legacy FortiGate |
OPNSense_25_1 |
OPNsense | 25.1 | Más reciente - Firewall open source |
OPNSense_24_7_3 |
OPNsense | 24.7.3 | Firewall/VPN pfSense alternative |
FW_pfSense-CE-2.6.0 |
pfSense | CE 2.6.0 | Firewall open source clásico |
FW_vyos-1.2.6-S1 |
VyOS | 1.2.6-S1 | Router virtual, routing avanzado |
Mikrotik_6_48_6 |
MikroTik | RouterOS 6.48.6 | Router/Firewall MikroTik |
FW_F5 |
F5 Networks | BIG-IP | Load balancing empresarial |
| Nombre | Aplicación | Versión | Stack Incluido |
|---|---|---|---|
App_WordPress |
WordPress | Latest | LAMP Stack (Linux, Apache, MySQL, PHP) |
App_Nextcloud |
Nextcloud | Latest | Almacenamiento en la nube privado |
App_ERPNext |
ERPNext | Latest | ERP de código abierto completo |
App_SuiteCRM |
SuiteCRM | Latest | CRM open source |
App_Apache |
Apache HTTP | Latest | Servidor web preconfigurado |
App_Tomcat9 |
Tomcat | 9 | Servidor de aplicaciones Java |
App_Snorby |
Snorby | Latest | Interface web para IDS/IPS |
Aplicaciones preconfiguradas: Estas imágenes incluyen la aplicación instalada y configurada. Solo requieren configuración inicial básica (contraseñas, dominios).
| Nombre | Tipo | Uso |
|---|---|---|
systemrescue-8.05-amd64.iso |
System Rescue CD | Recuperación y diagnóstico de sistemas |
virtio-win-0.1.185.iso |
Drivers VirtIO | Drivers para instancias Windows |
Mi_Imagen |
Imagen personalizada | Tu imagen custom (si has subido alguna) |
OASIX Cloud ofrece múltiples familias de flavors optimizadas para diferentes casos de uso. Todos los flavors (excepto NVME y BM) utilizan almacenamiento permanente basado en volúmenes NetApp sin disco efímero.
Uso recomendado: Aplicaciones web, servidores de aplicaciones, microservicios, cargas de trabajo balanceadas
Flavors equilibrados con ratio CPU:RAM flexible (1:1 hasta 1:4). Total: 58 flavors
Ejemplos representativos:
| Flavor | vCPUs | RAM | Casos de uso |
|---|---|---|---|
g3.001vCPUs_001RAM |
1 | 1 GB | Microservicios, testing |
g3.002vCPUs_004RAM |
2 | 4 GB | Aplicaciones web pequeñas |
g3.004vCPUs_008RAM |
4 | 8 GB | Aplicaciones empresariales |
g3.008vCPUs_016RAM |
8 | 16 GB | Servidores de aplicaciones |
g3.016vCPUs_032RAM |
16 | 32 GB | Cargas intensivas |
g3.032vCPUs_064RAM |
32 | 64 GB | Procesamiento distribuido |
Rango completo: 1-32 vCPUs, 1-64 GB RAM
Uso recomendado: Bases de datos transaccionales, aplicaciones I/O intensivas, caching distribuido
Optimizados para alto rendimiento de CPU y velocidad de almacenamiento. Total: 55 flavors
Ejemplos representativos:
| Flavor | vCPUs | RAM | Casos de uso |
|---|---|---|---|
hs3.002vCPUs_004RAM |
2 | 4 GB | Cache Redis/Memcached |
hs3.004vCPUs_008RAM |
4 | 8 GB | PostgreSQL/MySQL pequeño |
hs3.008vCPUs_016RAM |
8 | 16 GB | Elasticsearch nodes |
hs3.016vCPUs_032RAM |
16 | 32 GB | Bases de datos OLTP |
hs3.032vCPUs_064RAM |
32 | 64 GB | Analytics en tiempo real |
Rango completo: 1-32 vCPUs, 2-64 GB RAM
Uso recomendado: Bases de datos en memoria, SAP HANA, Analytics, Big Data
Flavors con ratios CPU:RAM muy altos (hasta 1:12), ideales para cargas memory-intensive. Total: 16 flavors
| Flavor | vCPUs | RAM | Ratio | Casos de uso |
|---|---|---|---|---|
d3.002vCPUs_016RAM |
2 | 16 GB | 1:8 | Redis Enterprise |
d3.004vCPUs_032RAM |
4 | 32 GB | 1:8 | SAP Business One |
d3.008vCPUs_064RAM |
8 | 64 GB | 1:8 | MongoDB/Cassandra |
d3.008vCPUs_096RAM |
8 | 96 GB | 1:12 | SAP HANA small |
d3.016vCPUs_096RAM |
16 | 96 GB | 1:6 | In-memory analytics |
Rango completo: 2-16 vCPUs, 8-96 GB RAM
Uso recomendado: Machine Learning, Deep Learning, rendering 3D, procesamiento de video
Equipados con GPUs NVIDIA Tesla T4 y L4. Total: 6 flavors
| Flavor | vCPUs | RAM | GPU | Casos de uso |
|---|---|---|---|---|
gpu.T4.010vCPUs_026RAM |
10 | 26 GB | NVIDIA T4 | Inferencia ML |
gpu.T4.014vCPUs_058RAM |
14 | 58 GB | NVIDIA T4 | Training modelos |
gpu.T4.022vCPUs_118RAM |
22 | 118 GB | NVIDIA T4 | Deep Learning |
gpu.L4.010vCPUs_026RAM |
10 | 26 GB | NVIDIA L4 | Inferencia optimizada |
gpu.L4.014vCPUs_058RAM |
14 | 58 GB | NVIDIA L4 | AI/ML workloads |
gpu.L4.022vCPUs_118RAM |
22 | 118 GB | NVIDIA L4 | Video processing |
NVIDIA T4: 16GB VRAM, mejor precio/rendimiento inferencia
NVIDIA L4: 24GB VRAM, mejor eficiencia energética
Uso recomendado: Bases de datos ultra-rápidas, caching, procesamiento temporal de datos
Con discos NVMe de alta velocidad locales (algunos con 2 discos). Total: 8 flavors
| Flavor | vCPUs | RAM | NVMe | Casos de uso |
|---|---|---|---|---|
nvme.g3.002vCPUs_008RAM_80GBDisk |
2 | 8 GB | 80 GB | Cache local rápido |
nvme.g3.004vCPUs_016RAM_150GBDisk |
4 | 16 GB | 150 GB | Elasticsearch con almacenamiento local |
nvme.g3.012vCPUs_048RAM_500GBDisk |
12 | 48 GB | 500 GB | MongoDB con NVMe |
nvme.g3.024vCPUs_096RAM_960GBDisk |
24 | 96 GB | 960 GB | Bases de datos de alto rendimiento |
nvme.g3.032vCPUs_128RAM_2x960GBDisk |
32 | 128 GB | 2x960 GB | Storage nodes distribuidos |
nvme.g3.064vCPUs_192RAM_2x960GBDisk |
64 | 192 GB | 2x960 GB | Big Data processing |
⚠️ Nota: Almacenamiento NVMe es local y NO persistente tras eliminación de instancia
Uso recomendado: Cargas que requieren hardware dedicado, licenciamiento por socket, compliance
Servidores físicos completos sin virtualización. Total: 3 flavors
| Flavor | CPUs | RAM | Disco Local | Casos de uso |
|---|---|---|---|---|
bm.012vCPUs_032RAM |
12 | 32 GB | 900 GB | Oracle RAC, SQL Server Enterprise |
bm.016vCPUs_064RAM |
16 | 64 GB | 900 GB | Virtualización anidada, VMware on OASIX |
bm.024vCPUs_128RAM |
24 | 128 GB | 900 GB | SAP HANA, workloads de compliance |
Rendimiento predecible, aislamiento completo, sin noisy neighbors
Uso recomendado: Desarrollo, testing, CI/CD, ambientes no productivos
Flavors económicos para pruebas y desarrollo. Total: 6 flavors
| Flavor | vCPUs | RAM | Casos de uso |
|---|---|---|---|
lab.002vCPUs_002RAM |
2 | 2 GB | Testing básico |
lab.002vCPUs_004RAM |
2 | 4 GB | Desarrollo web |
lab.004vCPUs_008RAM |
4 | 8 GB | Staging applications |
lab.008vCPUs_016RAM |
8 | 16 GB | Pre-producción |
Uso recomendado: MySQL, PostgreSQL, SQL Server, MariaDB
Optimizados específicamente para bases de datos con ratio 1:4 CPU:RAM. Total: 4 flavors
| Flavor | vCPUs | RAM | Casos de uso |
|---|---|---|---|
Db.g.002vCPUs_004RAM |
2 | 4 GB | Desarrollo DB |
Db.g.002vCPUs_008RAM |
2 | 8 GB | DB pequeñas |
Db.g.004vCPUs_016RAM |
4 | 16 GB | PostgreSQL producción |
Db.g.008vCPUs_032RAM |
8 | 32 GB | MySQL cluster nodes |
Uso recomendado: HAProxy, Nginx, balanceadores de carga
Optimizados para balanceadores con ratio 1:1 CPU:RAM. Total: 3 flavors
| Flavor | vCPUs | RAM | Casos de uso |
|---|---|---|---|
lb.g.001vCPUs_001RAM |
1 | 1 GB | Load balancer simple |
lb.g.002vCPUs_002RAM |
2 | 2 GB | HAProxy/Nginx pequeño |
lb.g.004vCPUs_004RAM |
4 | 4 GB | Load balancer producción |
OASIX Cloud proporciona conectividad pública a través de la red "Externa" con dos rangos de IPs públicas disponibles.
Características:
Externac04a0a46-5d62-44f7-ae86-73564441bfd9# Obtener la red pública de OASIX
data "openstack_networking_network_v2" "external" {
name = "Externa"
}
# Crear IP flotante desde la red pública
resource "openstack_networking_floatingip_v2" "public_ip" {
pool = data.openstack_networking_network_v2.external.name
# OpenStack seleccionará automáticamente una IP disponible de cualquier subnet
}
# Asociar IP flotante a una instancia
resource "openstack_compute_floatingip_associate_v2" "fip_assoc" {
floating_ip = openstack_networking_floatingip_v2.public_ip.address
instance_id = openstack_compute_instance_v2.my_instance.id
}
output "public_ip_assigned" {
description = "IP pública asignada desde la red Externa"
value = openstack_networking_floatingip_v2.public_ip.address
}
Para comunicación interna entre instancias, debes crear redes privadas adicionales:
# Crear red privada
resource "openstack_networking_network_v2" "private" {
name = "red-privada-produccion"
admin_state_up = true
}
# Crear subnet privada
resource "openstack_networking_subnet_v2" "private_subnet" {
name = "subnet-privada-prod"
network_id = openstack_networking_network_v2.private.id
cidr = "10.0.10.0/24"
ip_version = 4
dns_nameservers = ["8.8.8.8", "1.1.1.1"]
}
# Crear router para conectar red privada con red Externa
resource "openstack_networking_router_v2" "router" {
name = "router-prod"
external_network_id = data.openstack_networking_network_v2.external.id
}
# Conectar subnet privada al router
resource "openstack_networking_router_interface_v2" "router_interface" {
router_id = openstack_networking_router_v2.router.id
subnet_id = openstack_networking_subnet_v2.private_subnet.id
}
Importante: La red "Externa" es la única red pública. Todas las instancias deben estar conectadas a redes privadas y usar IPs flotantes para acceso público.
Los Application Credentials son el método más seguro y recomendado para autenticar Terraform contra OASIX Cloud. Proporcionan credenciales específicas por aplicación sin exponer las credenciales principales del usuario.
Ventajas de Application Credentials:
Importante: Los clientes de OASIX Cloud no tienen acceso directo al panel Horizon para generar Application Credentials. Debe solicitarlos a través del sistema de tickets.
Proceso de solicitud:
Acceda al portal de tickets: tickets.oasixcloud.es
Cree un nuevo ticket con los siguientes datos:
El equipo de OASIX generará las credenciales y las proporcionará de forma segura
Ejemplo de información a incluir en el ticket:
Proyecto: production-web
Servicios requeridos: Nova (Compute), Cinder (Storage), Neutron (Network), Glance (Images)
Roles necesarios: member
Duración: Sin expiración / 90 días
Uso: Automatización de despliegue con Terraform
Para más información sobre autenticación:
Terraform instalado: Versión 1.5 o superior recomendada
terraform version
Application Credentials: Obtenidas mediante ticket en tickets.oasixcloud.es
Conectividad: Acceso de red a los endpoints de OASIX Cloud
proyecto-terraform/
├── main.tf # Recursos principales
├── variables.tf # Definición de variables
├── outputs.tf # Outputs del despliegue
├── provider.tf # Configuración del proveedor
├── terraform.tfvars # Valores de variables (no versionar si contiene secretos)
├── versions.tf # Versiones de Terraform y proveedores
└── modules/ # Módulos reutilizables
├── network/
├── compute/
└── storage/
Crear archivo versions.tf:
terraform {
required_version = ">= 1.5.0"
required_providers {
openstack = {
source = "terraform-provider-openstack/openstack"
version = "~> 3.0"
}
}
}
Crear archivo provider.tf:
# Configuración del proveedor OpenStack para OASIX Cloud
provider "openstack" {
# Datos de Application Credentials (obtenidos via tickets.oasixcloud.es)
application_credential_id = var.app_credential_id
application_credential_secret = var.app_credential_secret
# Configuración del endpoint de OASIX Cloud
auth_url = "https://soax-mad-eqx.oasixcloud.es:5000/v3"
region = "MAD_EQX"
}
Crear archivo variables.tf:
# Variables de autenticación
variable "app_credential_id" {
description = "Application Credential ID de OASIX Cloud"
type = string
sensitive = true
}
variable "app_credential_secret" {
description = "Application Credential Secret de OASIX Cloud"
type = string
sensitive = true
}
# Variables de configuración
variable "project_name" {
description = "Nombre del proyecto"
type = string
default = "mi-proyecto"
}
variable "environment" {
description = "Entorno (dev, staging, prod)"
type = string
default = "dev"
}
variable "ssh_key_name" {
description = "Nombre del keypair SSH"
type = string
}
Crear archivo terraform.tfvars (no versionar con Git):
app_credential_id = "xxxxxxxxxxxxxxxxx"
app_credential_secret = "yyyyyyyyyyyyyyyyy"
ssh_key_name = "mi-clave-ssh"
project_name = "web-app"
environment = "production"
Archivo main.tf:
# Obtener imagen disponible
data "openstack_images_image_v2" "ubuntu" {
name = "Ubuntu22_04" # Imagen oficial de OASIX Cloud
most_recent = true
}
# Crear red privada
resource "openstack_networking_network_v2" "private_network" {
name = "${var.project_name}-${var.environment}-network"
admin_state_up = true
}
# Crear subred
resource "openstack_networking_subnet_v2" "private_subnet" {
name = "${var.project_name}-${var.environment}-subnet"
network_id = openstack_networking_network_v2.private_network.id
cidr = "192.168.100.0/24"
ip_version = 4
dns_nameservers = ["8.8.8.8", "8.8.4.4"]
}
# Crear router
resource "openstack_networking_router_v2" "router" {
name = "${var.project_name}-${var.environment}-router"
external_network_id = data.openstack_networking_network_v2.public.id
}
# Obtener red pública de OASIX Cloud
data "openstack_networking_network_v2" "public" {
name = "Externa" # Red pública única con 2 subnets (88.148.31.0/24 y 89.43.76.0/24)
}
# Conectar router a la subred privada
resource "openstack_networking_router_interface_v2" "router_interface" {
router_id = openstack_networking_router_v2.router.id
subnet_id = openstack_networking_subnet_v2.private_subnet.id
}
# Crear security group
resource "openstack_networking_secgroup_v2" "web_sg" {
name = "${var.project_name}-${var.environment}-web-sg"
description = "Security group para servidor web"
}
# Regla SSH
resource "openstack_networking_secgroup_rule_v2" "ssh" {
direction = "ingress"
ethertype = "IPv4"
protocol = "tcp"
port_range_min = 22
port_range_max = 22
remote_ip_prefix = "0.0.0.0/0"
security_group_id = openstack_networking_secgroup_v2.web_sg.id
}
# Regla HTTP
resource "openstack_networking_secgroup_rule_v2" "http" {
direction = "ingress"
ethertype = "IPv4"
protocol = "tcp"
port_range_min = 80
port_range_max = 80
remote_ip_prefix = "0.0.0.0/0"
security_group_id = openstack_networking_secgroup_v2.web_sg.id
}
# Regla HTTPS
resource "openstack_networking_secgroup_rule_v2" "https" {
direction = "ingress"
ethertype = "IPv4"
protocol = "tcp"
port_range_min = 443
port_range_max = 443
remote_ip_prefix = "0.0.0.0/0"
security_group_id = openstack_networking_secgroup_v2.web_sg.id
}
# Crear instancia con boot-from-volume (INSTANCIA PERMANENTE)
# En OASIX Cloud todas las instancias usan almacenamiento persistente NetApp
resource "openstack_compute_instance_v2" "web_server" {
name = "${var.project_name}-${var.environment}-web"
flavor_name = "g3.004vCPUs_008RAM" # Flavor G3 de propósito general
key_pair = var.ssh_key_name
security_groups = [openstack_networking_secgroup_v2.web_sg.name]
# Boot from volume: disco de arranque persistente en NetApp
block_device {
uuid = data.openstack_images_image_v2.ubuntu.id
source_type = "image"
destination_type = "volume"
boot_index = 0
volume_size = 50 # GB - Volumen de arranque
delete_on_termination = true # Cambiar a false para mantener volumen tras eliminar instancia
}
network {
uuid = openstack_networking_network_v2.private_network.id
}
# Script de inicialización
user_data = <<-EOF
#!/bin/bash
apt-get update
apt-get install -y nginx
systemctl enable nginx
systemctl start nginx
echo "<h1>Servidor Web en OASIX Cloud</h1>" > /var/www/html/index.html
EOF
}
# Crear IP flotante
resource "openstack_networking_floatingip_v2" "floating_ip" {
pool = data.openstack_networking_network_v2.public.name
}
# Asociar IP flotante
resource "openstack_compute_floatingip_associate_v2" "fip_assoc" {
floating_ip = openstack_networking_floatingip_v2.floating_ip.address
instance_id = openstack_compute_instance_v2.web_server.id
}
Archivo outputs.tf:
output "instance_id" {
description = "ID de la instancia creada"
value = openstack_compute_instance_v2.web_server.id
}
output "instance_name" {
description = "Nombre de la instancia"
value = openstack_compute_instance_v2.web_server.name
}
output "private_ip" {
description = "IP privada de la instancia"
value = openstack_compute_instance_v2.web_server.access_ip_v4
}
output "public_ip" {
description = "IP pública de la instancia"
value = openstack_networking_floatingip_v2.floating_ip.address
}
output "ssh_connection" {
description = "Comando para conectar por SSH"
value = "ssh ubuntu@${openstack_networking_floatingip_v2.floating_ip.address}"
}
output "boot_volume_id" {
description = "ID del volumen de arranque persistente (NetApp)"
value = openstack_compute_instance_v2.web_server.block_device[0].volume_id
}
output "flavor_used" {
description = "Flavor utilizado"
value = openstack_compute_instance_v2.web_server.flavor_name
}
OASIX Cloud utiliza tecnología NetApp con 5 tiers de rendimiento. El tipo de volumen determina los IOPS y throughput disponibles.
# Volumen de datos con tier FlashPremium (6,000 IOPS)
resource "openstack_blockstorage_volume_v3" "data_volume" {
name = "${var.project_name}-data-volume"
description = "Volumen de datos persistentes en NetApp FlashPremium"
size = 100 # GB
volume_type = "FlashPremium" # 6,000 IOPS fijos, ~46.9 MB/s
# Metadatos opcionales
metadata = {
Environment = var.environment
Application = "database"
Tier = "premium"
}
}
# Adjuntar volumen a instancia (aparecerá como /dev/vdb)
resource "openstack_compute_volume_attach_v2" "volume_attach" {
instance_id = openstack_compute_instance_v2.web_server.id
volume_id = openstack_blockstorage_volume_v3.data_volume.id
}
# Crear snapshot del volumen (utilizando capacidades NetApp)
resource "openstack_blockstorage_volume_v3" "volume_backup" {
name = "${var.project_name}-data-snapshot-${formatdate("YYYYMMDD", timestamp())}"
description = "Snapshot automático del volumen de datos"
source_vol_id = openstack_blockstorage_volume_v3.data_volume.id
# El snapshot se crea en el mismo backend NetApp
}
# Ejemplo: Volumen con tier FlashScalePremium (escalable hasta 15,000 IOPS)
resource "openstack_blockstorage_volume_v3" "high_performance_volume" {
name = "${var.project_name}-hp-volume"
description = "Volumen de alto rendimiento con IOPS escalables"
size = 500 # GB
volume_type = "FlashScalePremium" # 25 IOPS/GB = 12,500 IOPS para 500GB
}
# Ejemplo: Volumen Archive para backups (económico)
resource "openstack_blockstorage_volume_v3" "backup_volume" {
name = "${var.project_name}-backup"
description = "Volumen para backups y datos fríos"
size = 1000 # 1TB
volume_type = "Archive" # 250 IOPS, HDD, bajo coste
}
# Output de volúmenes
output "data_volume_id" {
description = "ID del volumen de datos"
value = openstack_blockstorage_volume_v3.data_volume.id
}
output "data_volume_type" {
description = "Tier NetApp utilizado"
value = openstack_blockstorage_volume_v3.data_volume.volume_type
}
output "data_volume_device" {
description = "Device path del volumen en la instancia"
value = "/dev/vdb"
}
Selecciona el tier según tu carga de trabajo:
# Para desarrollo y testing
volume_type = "FlashBasic" # 1,000 IOPS - Coste bajo
# Para aplicaciones web y bases de datos pequeñas
volume_type = "FlashPlus" # 3,000 IOPS - Balance coste/rendimiento
# Para bases de datos productivas
volume_type = "FlashPremium" # 6,000 IOPS - Alto rendimiento
# Para cargas impredecibles o muy altas
volume_type = "FlashScalePremium" # Hasta 15,000 IOPS - Máximo rendimiento
# Para backups y archivos
volume_type = "Archive" # 250 IOPS - Mínimo coste
Comparativa de rendimiento por tier:
| Tier | IOPS | Ejemplo 100GB | Ejemplo 500GB | Mejor Para |
|---|---|---|---|---|
| Archive | 250 | 250 IOPS | 250 IOPS | Backups, archivos |
| FlashBasic | 1,000 | 1,000 IOPS | 1,000 IOPS | Dev, testing |
| FlashPlus | 3,000 | 3,000 IOPS | 3,000 IOPS | Apps web, MySQL pequeño |
| FlashPremium | 6,000 | 6,000 IOPS | 6,000 IOPS | PostgreSQL, MongoDB |
| FlashScalePremium | 25/GB | 2,500 IOPS | 12,500 IOPS | Elasticsearch, cargas variables |
### Ejemplo 3: Cluster de Base de Datos PostgreSQL con Alta Disponibilidad
```hcl
# Obtener imagen de base de datos
data "openstack_images_image_v2" "ubuntu" {
name = "Ubuntu22_04"
most_recent = true
}
# Security group para base de datos
resource "openstack_networking_secgroup_v2" "db_sg" {
name = "${var.project_name}-db-sg"
description = "Security group para cluster PostgreSQL"
}
# Permitir SSH solo desde red privada
resource "openstack_networking_secgroup_rule_v2" "db_ssh" {
direction = "ingress"
ethertype = "IPv4"
protocol = "tcp"
port_range_min = 22
port_range_max = 22
remote_ip_prefix = "192.168.100.0/24"
security_group_id = openstack_networking_secgroup_v2.db_sg.id
}
# Regla para PostgreSQL
resource "openstack_networking_secgroup_rule_v2" "postgresql" {
direction = "ingress"
ethertype = "IPv4"
protocol = "tcp"
port_range_min = 5432
port_range_max = 5432
remote_ip_prefix = "192.168.100.0/24" # Solo desde red privada
security_group_id = openstack_networking_secgroup_v2.db_sg.id
}
# Regla para replicación entre nodos
resource "openstack_networking_secgroup_rule_v2" "replication" {
direction = "ingress"
ethertype = "IPv4"
protocol = "tcp"
port_range_min = 5432
port_range_max = 5432
remote_group_id = openstack_networking_secgroup_v2.db_sg.id
security_group_id = openstack_networking_secgroup_v2.db_sg.id
}
# Crear 3 nodos de base de datos con boot-from-volume
resource "openstack_compute_instance_v2" "db_nodes" {
count = 3
name = "${var.project_name}-db-${count.index + 1}"
flavor_name = "Db.g.004vCPUs_016RAM" # Flavor optimizado para BD
key_pair = var.ssh_key_name
security_groups = [openstack_networking_secgroup_v2.db_sg.name]
# Boot from volume con NetApp
block_device {
uuid = data.openstack_images_image_v2.ubuntu.id
source_type = "image"
destination_type = "volume"
boot_index = 0
volume_size = 30 # GB para SO
delete_on_termination = true
}
network {
uuid = openstack_networking_network_v2.private_network.id
}
# Script de inicialización básico
user_data = templatefile("${path.module}/scripts/init-db.sh", {
node_id = count.index + 1
node_role = count.index == 0 ? "primary" : "replica"
})
}
# Volúmenes de datos dedicados para PostgreSQL (uno por nodo)
resource "openstack_blockstorage_volume_v3" "db_data_volumes" {
count = 3
name = "${var.project_name}-db-data-${count.index + 1}"
description = "Volumen de datos PostgreSQL - Nodo ${count.index + 1}"
size = 200 # GB para datos de BD
# volume_type = "FlashPremium" # 6,000 IOPS - Recomendado para BD productivas
}
# Adjuntar volúmenes de datos a instancias
resource "openstack_compute_volume_attach_v2" "db_volume_attach" {
count = 3
instance_id = openstack_compute_instance_v2.db_nodes[count.index].id
volume_id = openstack_blockstorage_volume_v3.db_data_volumes[count.index].id
}
# Load Balancer para distribución de lecturas (opcional)
resource "openstack_compute_instance_v2" "db_loadbalancer" {
name = "${var.project_name}-db-lb"
flavor_name = "lb.g.002vCPUs_002RAM" # Flavor para load balancer
key_pair = var.ssh_key_name
security_groups = [openstack_networking_secgroup_v2.db_sg.name]
block_device {
uuid = data.openstack_images_image_v2.ubuntu.id
source_type = "image"
destination_type = "volume"
boot_index = 0
volume_size = 20
delete_on_termination = true
}
network {
uuid = openstack_networking_network_v2.private_network.id
}
# Instalar HAProxy o PgBouncer
user_data = file("${path.module}/scripts/init-haproxy.sh")
}
# Outputs del cluster
output "db_primary_ip" {
description = "IP del nodo primario"
value = openstack_compute_instance_v2.db_nodes[0].access_ip_v4
}
output "db_replica_ips" {
description = "IPs de los nodos réplica"
value = slice(openstack_compute_instance_v2.db_nodes[*].access_ip_v4, 1, 3)
}
output "db_loadbalancer_ip" {
description = "IP del load balancer"
value = openstack_compute_instance_v2.db_loadbalancer.access_ip_v4
}
output "db_volume_ids" {
description = "IDs de los volúmenes de datos"
value = openstack_blockstorage_volume_v3.db_data_volumes[*].id
}
# Provider para región primaria (MAD_EQX)
provider "openstack" {
alias = "madrid"
application_credential_id = var.app_credential_id
application_credential_secret = var.app_credential_secret
auth_url = "https://soax-mad-eqx.oasixcloud.es:5000/v3"
region = "MAD_EQX"
}
# Instancia en región primaria
resource "openstack_compute_instance_v2" "primary_app" {
provider = openstack.madrid
name = "${var.project_name}-primary"
image_name = "Ubuntu22_04"
flavor_name = "m1.medium"
key_pair = var.ssh_key_name
network {
name = "red-privada"
}
}
# Backup automático del volumen
resource "openstack_blockstorage_volume_v3" "primary_data" {
provider = openstack.madrid
name = "${var.project_name}-primary-data"
size = 50
}
# Script para backup a Commvault
resource "null_resource" "backup_config" {
depends_on = [openstack_compute_instance_v2.primary_app]
provisioner "remote-exec" {
inline = [
"curl -X POST https://backup.oasixcloud.es/commandcenter/api/v1/backup",
"# Configurar backup automático mediante API de Commvault"
]
}
}
# Crear cluster template
data "openstack_containerinfra_clustertemplate_v1" "k8s_template" {
name = "kubernetes-v1.28"
}
# Crear cluster de Kubernetes
resource "openstack_containerinfra_cluster_v1" "k8s_cluster" {
name = "${var.project_name}-k8s"
cluster_template_id = data.openstack_containerinfra_clustertemplate_v1.k8s_template.id
master_count = 3
node_count = 5
keypair = var.ssh_key_name
labels = {
environment = var.environment
managed_by = "terraform"
}
}
# Output del kubeconfig
output "kubeconfig" {
description = "Comando para obtener kubeconfig"
value = "openstack coe cluster config ${openstack_containerinfra_cluster_v1.k8s_cluster.name}"
sensitive = true
}
# Instancia con GPU NVIDIA L4 para inferencia ML
resource "openstack_compute_instance_v2" "ml_inference" {
name = "${var.project_name}-ml-inference"
flavor_name = "gpu.L4.014vCPUs_058RAM" # NVIDIA L4, 24GB VRAM
key_pair = var.ssh_key_name
# Boot from volume
block_device {
uuid = data.openstack_images_image_v2.ubuntu.id
source_type = "image"
destination_type = "volume"
boot_index = 0
volume_size = 100 # Espacio para modelos ML
delete_on_termination = true
}
network {
uuid = openstack_networking_network_v2.private_network.id
}
# Instalar drivers NVIDIA y CUDA
user_data = <<-EOF
#!/bin/bash
# Actualizar sistema
apt-get update && apt-get upgrade -y
# Instalar drivers NVIDIA
apt-get install -y nvidia-driver-535 nvidia-utils-535
# Instalar CUDA Toolkit
wget https://developer.download.nvidia.com/compute/cuda/repos/ubuntu2204/x86_64/cuda-ubuntu2204.pin
mv cuda-ubuntu2204.pin /etc/apt/preferences.d/cuda-repository-pin-600
apt-key adv --fetch-keys https://developer.download.nvidia.com/compute/cuda/repos/ubuntu2204/x86_64/3bf863cc.pub
add-apt-repository "deb https://developer.download.nvidia.com/compute/cuda/repos/ubuntu2204/x86_64/ /"
apt-get update
apt-get install -y cuda-12-2
# Instalar PyTorch y dependencias ML
apt-get install -y python3-pip
pip3 install torch torchvision torchaudio --index-url https://download.pytorch.org/whl/cu118
pip3 install transformers accelerate bitsandbytes
# Verificar GPU
nvidia-smi
EOF
}
# Volumen adicional para datasets
resource "openstack_blockstorage_volume_v3" "ml_datasets" {
name = "${var.project_name}-ml-datasets"
size = 500 # GB para datasets
}
resource "openstack_compute_volume_attach_v2" "ml_data_attach" {
instance_id = openstack_compute_instance_v2.ml_inference.id
volume_id = openstack_blockstorage_volume_v3.ml_datasets.id
}
output "ml_instance_ip" {
value = openstack_compute_instance_v2.ml_inference.access_ip_v4
}
output "gpu_info" {
value = "NVIDIA L4 con 24GB VRAM - SSH y ejecutar 'nvidia-smi' para verificar"
}
# Instancia con NVMe local para base de datos ultra-rápida
resource "openstack_compute_instance_v2" "nvme_database" {
name = "${var.project_name}-nvme-db"
flavor_name = "nvme.g3.012vCPUs_048RAM_500GBDisk" # Con 500GB NVMe local
key_pair = var.ssh_key_name
# Boot from volume (sistema operativo)
block_device {
uuid = data.openstack_images_image_v2.ubuntu.id
source_type = "image"
destination_type = "volume"
boot_index = 0
volume_size = 30
delete_on_termination = true
}
network {
uuid = openstack_networking_network_v2.private_network.id
}
# El disco NVMe local aparece automáticamente como /dev/vdb
user_data = <<-EOF
#!/bin/bash
# Formatear disco NVMe
mkfs.ext4 /dev/vdb
# Montar NVMe en /data
mkdir -p /data
mount /dev/vdb /data
echo '/dev/vdb /data ext4 defaults 0 0' >> /etc/fstab
# Configurar PostgreSQL para usar NVMe
apt-get update
apt-get install -y postgresql-14
# Mover datos de PostgreSQL a NVMe
systemctl stop postgresql
mv /var/lib/postgresql /data/
ln -s /data/postgresql /var/lib/postgresql
systemctl start postgresql
# Optimizar para NVMe (bajas latencias)
echo "vm.swappiness=1" >> /etc/sysctl.conf
echo "vm.dirty_ratio=80" >> /etc/sysctl.conf
sysctl -p
EOF
}
output "nvme_database_ip" {
value = openstack_compute_instance_v2.nvme_database.access_ip_v4
}
output "nvme_storage_info" {
value = "500GB NVMe local montado en /dev/vdb (ultra-baja latencia)"
}
# Servidor físico dedicado para SAP HANA o cargas que requieren bare metal
resource "openstack_compute_instance_v2" "bare_metal_sap" {
name = "${var.project_name}-sap-hana"
flavor_name = "bm.024vCPUs_128RAM" # Servidor físico completo
key_pair = var.ssh_key_name
# Boot from volume (el servidor tiene 900GB local pero usamos volumen para boot)
block_device {
uuid = data.openstack_images_image_v2.ubuntu.id
source_type = "image"
destination_type = "volume"
boot_index = 0
volume_size = 50
delete_on_termination = false # Mantener volumen para disaster recovery
}
network {
uuid = openstack_networking_network_v2.private_network.id
}
# Los 900GB locales están en /dev/sda para uso temporal/cache
user_data = <<-EOF
#!/bin/bash
# El disco local de 900GB está disponible
# Formatear y usar para datos temporales o cache
mkfs.xfs /dev/sda
mkdir -p /sap/cache
mount /dev/sda /sap/cache
EOF
}
# Volumen NetApp dedicado para datos SAP HANA
resource "openstack_blockstorage_volume_v3" "sap_hana_data" {
name = "${var.project_name}-sap-data"
size = 1024 # 1TB para SAP HANA
# volume_type = "FlashPremium" # 6,000 IOPS - Alto rendimiento para SAP
}
resource "openstack_compute_volume_attach_v2" "sap_data_attach" {
instance_id = openstack_compute_instance_v2.bare_metal_sap.id
volume_id = openstack_blockstorage_volume_v3.sap_hana_data.id
}
output "bare_metal_ip" {
value = openstack_compute_instance_v2.bare_metal_sap.access_ip_v4
}
output "bare_metal_specs" {
value = "24 CPUs físicos, 128GB RAM, 900GB local + 1TB volumen NetApp"
}
Notas importantes sobre flavors especializados:
Estado Local (por defecto):
terraform.tfstate en el directorio del proyectoEstado Remoto (recomendado):
terraform {
backend "s3" {
bucket = "oasix-terraform-state"
key = "projects/${var.project_name}/terraform.tfstate"
region = "MAD_EQX"
endpoint = "https://s3.oasixcloud.es"
# Bloqueo de estado con DynamoDB
dynamodb_table = "terraform-state-lock"
encrypt = true
}
}
# Ver el estado actual
terraform state list
# Mostrar detalles de un recurso
terraform state show openstack_compute_instance_v2.web_server
# Mover un recurso en el estado
terraform state mv openstack_compute_instance_v2.old openstack_compute_instance_v2.new
# Eliminar un recurso del estado (sin destruirlo)
terraform state rm openstack_compute_instance_v2.web_server
# Importar recurso existente al estado
terraform import openstack_compute_instance_v2.existing_server <instance-id>
# Inicializar el directorio de trabajo
terraform init
# Inicializar con upgrade de proveedores
terraform init -upgrade
# Validar sintaxis
terraform validate
# Formatear archivos
terraform fmt -recursive
# Ver plan de ejecución
terraform plan
# Guardar plan para aplicar después
terraform plan -out=tfplan
# Plan para destruir recursos
terraform plan -destroy
# Aplicar cambios (requiere confirmación)
terraform apply
# Aplicar plan guardado (sin confirmación)
terraform apply tfplan
# Aplicar sin confirmación interactiva
terraform apply -auto-approve
# Aplicar solo un recurso específico
terraform apply -target=openstack_compute_instance_v2.web_server
# Destruir toda la infraestructura
terraform destroy
# Destruir recurso específico
terraform destroy -target=openstack_compute_instance_v2.web_server
# Mostrar outputs
terraform output
# Mostrar un output específico
terraform output instance_ip
# Ver el grafo de dependencias
terraform graph | dot -Tsvg > graph.svg
# Activar logs de debug
export TF_LOG=DEBUG
terraform apply
Estructura del módulo:
modules/network/
├── main.tf
├── variables.tf
├── outputs.tf
└── README.md
modules/network/main.tf:
resource "openstack_networking_network_v2" "network" {
name = var.network_name
admin_state_up = true
}
resource "openstack_networking_subnet_v2" "subnet" {
name = "${var.network_name}-subnet"
network_id = openstack_networking_network_v2.network.id
cidr = var.cidr
ip_version = 4
dns_nameservers = var.dns_servers
}
resource "openstack_networking_router_v2" "router" {
name = "${var.network_name}-router"
external_network_id = var.external_network_id
}
resource "openstack_networking_router_interface_v2" "interface" {
router_id = openstack_networking_router_v2.router.id
subnet_id = openstack_networking_subnet_v2.subnet.id
}
modules/network/variables.tf:
variable "network_name" {
description = "Nombre de la red"
type = string
}
variable "cidr" {
description = "CIDR de la subred"
type = string
default = "192.168.0.0/24"
}
variable "dns_servers" {
description = "Servidores DNS"
type = list(string)
default = ["8.8.8.8", "8.8.4.4"]
}
variable "external_network_id" {
description = "ID de la red externa"
type = string
}
modules/network/outputs.tf:
output "network_id" {
description = "ID de la red creada"
value = openstack_networking_network_v2.network.id
}
output "subnet_id" {
description = "ID de la subred creada"
value = openstack_networking_subnet_v2.subnet.id
}
output "router_id" {
description = "ID del router creado"
value = openstack_networking_router_v2.router.id
}
module "production_network" {
source = "./modules/network"
network_name = "production-network"
cidr = "10.0.0.0/16"
external_network_id = data.openstack_networking_network_v2.public.id
}
# Usar outputs del módulo
resource "openstack_compute_instance_v2" "app" {
name = "app-server"
image_name = "Ubuntu22_04"
flavor_name = "m1.medium"
network {
uuid = module.production_network.network_id
}
}
Separar configuración por entornos:
environments/
├── dev/
│ ├── main.tf
│ └── terraform.tfvars
├── staging/
│ ├── main.tf
│ └── terraform.tfvars
└── production/
├── main.tf
└── terraform.tfvars
Usar workspaces para entornos similares:
terraform workspace new dev
terraform workspace new prod
terraform workspace select dev
Nomenclatura consistente:
# Patrón: {proyecto}-{entorno}-{recurso}-{sufijo}
name = "${var.project_name}-${var.environment}-web-01"
Nunca versionar credenciales:
# .gitignore
terraform.tfvars
*.tfstate
*.tfstate.backup
.terraform/
Usar variables sensibles:
variable "app_credential_secret" {
type = string
sensitive = true
}
Rotación de credenciales:
Principio de mínimo privilegio:
# versions.tf
terraform {
required_version = ">= 1.5.0"
required_providers {
openstack = {
source = "terraform-provider-openstack/openstack"
version = "~> 3.0" # Acepta 3.x pero no 4.x
}
}
}
locals {
common_tags = {
Project = var.project_name
Environment = var.environment
ManagedBy = "Terraform"
CostCenter = var.cost_center
Owner = var.owner_email
}
}
resource "openstack_compute_instance_v2" "server" {
name = "web-server"
# ... otras configuraciones ...
metadata = local.common_tags
}
# Obtener información de recursos existentes
data "openstack_images_image_v2" "latest_ubuntu" {
name = "Ubuntu22_04"
most_recent = true
}
data "openstack_networking_network_v2" "existing_network" {
name = "red-existente"
}
# Usar en recursos
resource "openstack_compute_instance_v2" "server" {
image_id = data.openstack_images_image_v2.latest_ubuntu.id
network {
uuid = data.openstack_networking_network_v2.existing_network.id
}
}
Error: Error creating OpenStack compute client:
Failed to authenticate to Keystone
Solución:
Error: Error acquiring the state lock
Solución:
# Forzar desbloqueo (solo si estás seguro)
terraform force-unlock <LOCK_ID>
Error: Error creating compute instance:
Resource already exists
Solución:
# Importar el recurso existente
terraform import openstack_compute_instance_v2.server <instance-id>
Error: Quota exceeded for instances
Solución:
# Habilitar logs detallados
export TF_LOG=DEBUG
export TF_LOG_PATH=./terraform-debug.log
# Ejecutar comando
terraform apply
# Ver logs
tail -f terraform-debug.log
# Verificar acceso al endpoint de Keystone
curl -v https://soax-mad-eqx.oasixcloud.es:5000/v3
# Listar proyectos disponibles (requiere token)
openstack --os-auth-url https://soax-mad-eqx.oasixcloud.es:5000/v3 \
--os-application-credential-id <ID> \
--os-application-credential-secret <SECRET> \
project list
/docs y /redoc de cada servicioEjemplo completo de proyecto Terraform para OASIX Cloud disponible en:
Para problemas técnicos o solicitud de credenciales:
/docs de cada servicio# Autenticación
auth_url = "https://soax-mad-eqx.oasixcloud.es:5000/v3"
region = "MAD_EQX"
domain = "OASIX"
# Red pública
external_network_name = "Externa"
external_network_id = "c04a0a46-5d62-44f7-ae86-73564441bfd9"
# Imágenes recomendadas
ubuntu_22_image = "Ubuntu22_04"
ubuntu_24_image = "Ubuntu24_04"
rocky_9_image = "Rocky-9"
windows_2022 = "WindowsServer_2022_Standard"
# Flavors comunes
flavor_small = "g3.002vCPUs_004RAM" # 2 vCPU, 4GB RAM
flavor_medium = "g3.004vCPUs_008RAM" # 4 vCPU, 8GB RAM
flavor_large = "g3.008vCPUs_016RAM" # 8 vCPU, 16GB RAM
flavor_db = "Db.g.004vCPUs_016RAM" # 4 vCPU, 16GB RAM (DB optimizado)
flavor_lb = "lb.g.002vCPUs_002RAM" # 2 vCPU, 2GB RAM (Load Balancer)
# Tipos de volumen NetApp
volume_archive = "Archive" # 250 IOPS (HDD)
volume_basic = "FlashBasic" # 1,000 IOPS
volume_plus = "FlashPlus" # 3,000 IOPS
volume_premium = "FlashPremium" # 6,000 IOPS
volume_scale = "FlashScalePremium" # 25 IOPS/GB (max 15,000)
# DNS recomendados
dns_servers = ["8.8.8.8", "1.1.1.1"]
# provider.tf
terraform {
required_version = ">= 1.5.0"
required_providers {
openstack = {
source = "terraform-provider-openstack/openstack"
version = "~> 3.0"
}
}
}
provider "openstack" {
application_credential_id = var.app_credential_id
application_credential_secret = var.app_credential_secret
auth_url = "https://soax-mad-eqx.oasixcloud.es:5000/v3"
region = "MAD_EQX"
}
# main.tf
data "openstack_images_image_v2" "ubuntu" {
name = "Ubuntu22_04"
}
data "openstack_networking_network_v2" "external" {
name = "Externa"
}
resource "openstack_compute_instance_v2" "server" {
name = "mi-servidor"
flavor_name = "g3.002vCPUs_004RAM"
key_pair = var.ssh_key_name
block_device {
uuid = data.openstack_images_image_v2.ubuntu.id
source_type = "image"
destination_type = "volume"
boot_index = 0
volume_size = 30
delete_on_termination = true
}
network {
name = "red-privada" # Debes crear tu red privada primero
}
}
resource "openstack_networking_floatingip_v2" "public_ip" {
pool = data.openstack_networking_network_v2.external.name
}
resource "openstack_compute_floatingip_associate_v2" "fip" {
floating_ip = openstack_networking_floatingip_v2.public_ip.address
instance_id = openstack_compute_instance_v2.server.id
}
output "public_ip" {
value = openstack_networking_floatingip_v2.public_ip.address
}
| Servicio | Endpoint |
|---|---|
| Keystone (Identity) | https://soax-mad-eqx.oasixcloud.es:5000/v3 |
| Nova (Compute) | https://soax-mad-eqx.oasixcloud.es:8774/v2.1 |
| Cinder (Storage) | https://soax-mad-eqx.oasixcloud.es:8776/v3 |
| Neutron (Network) | https://soax-mad-eqx.oasixcloud.es:9696/v2.0 |
| Glance (Images) | https://soax-mad-eqx.oasixcloud.es:9292/v2 |
| Heat (Orchestration) | https://soax-mad-eqx.oasixcloud.es:8004/v1 |
| Magnum (Kubernetes) | https://soax-mad-eqx.oasixcloud.es:9511/v1 |
| Barbican (Secrets) | https://soax-mad-eqx.oasixcloud.es:9311/v1 |
| Commvault (Backup) | https://backup.oasixcloud.es |
/docs o /redoc al endpoint de cada servicioAntes de ejecutar terraform apply en producción:
terraform.tfvars (no versionado)terraform validateterraform fmt -checkterraform planTerraform proporciona una forma robusta, reproducible y escalable de gestionar infraestructura en OASIX Cloud. Esta guía cubre desde configuraciones básicas hasta patrones avanzados de arquitectura multi-región.
Próximos pasos recomendados:
Para soporte adicional o consultas sobre casos de uso específicos, contacta con el equipo de OASIX Cloud a través del sistema de tickets.