Saltar al contenido principal

Conceptos de Terraform dans el proveedor Cloud Temple

Esta página presenta los conceptos fundamentales necesarios para comprender y utilizar eficazmente el proveedor Terraform Cloud Temple.

Infrastructure as Code (IaC)​

Infrastructure as Code es un enfoque que consiste en gestionar y aprovisionar la infraestructura informática mediante archivos de configuración legibles por humanos, en lugar de una configuración manual o herramientas interactivas.

Ventajas de IaC con Terraform​

  • Control de versiones: La infraestructura se define en archivos que pueden ser controlados con Git
  • Colaboración: Los equipos pueden trabajar juntos sobre la misma infraestructura
  • Automatización: Reducción de errores humanos y ahorro de tiempo
  • Documentación: El código describe explícitamente la infraestructura
  • Reproducibilidad: Despliegue de entornos idénticos en unos pocos minutos

Terraform Provider​

A Terraform provider is a plugin that enables Terraform to interact with a specific API. The Cloud Temple provider acts as an abstraction layer between your Terraform configuration files and the Cloud Temple APIs.

Declaración del provider​

El provider debe declararse dentro de un bloque terraform con required_providers:

terraform {
required_providers {
cloudtemple = {
source = "Cloud-Temple/cloudtemple"
version = "~> 1.0"
}
}
}

provider "cloudtemple" {
client_id = var.cloudtemple_client_id
secret_id = var.cloudtemple_secret_id
}

Autenticación​

El proveedor se autentica ante las APIs de Cloud Temple utilizando:

  1. Client ID: Identificador único de su aplicación
  2. Secret ID: Clave secreta asociada al Client ID

Estos identificadores se generan desde la Consola de Cloud Temple y permiten al proveedor realizar operaciones en su nombre.

Buenas prácticas

Almacene sus credenciales en variables de entorno o en un gestor de secretos, nunca directamente en el código.

Recursos​

Un recurso representa un componente de infraestructura que puede crearse, leerse, actualizarse o eliminarse (operaciones CRUD).

resource "cloudtemple_compute_virtual_machine" "web" {
name = "web-server-01"
memory = 8 * 1024 * 1024 * 1024
cpu = 4
datacenter_id = data.cloudtemple_compute_virtual_datacenter.dc.id
host_cluster_id = data.cloudtemple_compute_host_cluster.cluster.id
guest_operating_system_moref = "ubuntu64Guest"
}

Types de recursos Cloud Temple​

IaaS VMware​

  • cloudtemple_compute_virtual_machine : Máquina virtual
  • cloudtemple_compute_virtual_disk : Disco virtual
  • cloudtemple_compute_network_adapter : Adaptador de red
  • cloudtemple_compute_virtual_controller : Controlador de dispositivo

IaaS OpenSource​

  • cloudtemple_compute_iaas_opensource_virtual_machine : Máquina virtual
  • cloudtemple_compute_iaas_opensource_virtual_disk : Disco virtual
  • cloudtemple_compute_iaas_opensource_network_adapter : Adaptador de red
  • cloudtemple_compute_iaas_opensource_replication_policy : Política de replicación

Almacenamiento de objetos​

  • cloudtemple_object_storage_bucket : Bucket S3
  • cloudtemple_object_storage_storage_account : Cuenta de almacenamiento
  • cloudtemple_object_storage_acl_entry : ACL de un bucket
  • cloudtemple_object_storage_global_access_key: Clave de acceso global al namespace

Atributos y argumentos​

Cada recurso posee:

  • Argumentos: Valores que usted configura (entradas)
  • Atributos: Valores devueltos por el recurso (salidas)
resource "cloudtemple_compute_virtual_machine" "example" {
# Argumentos (configuración)
name = "my-vm"
memory = 8 * 1024 * 1024 * 1024
cpu = 4

# Atributos (calculados automáticamente)
# id, moref, machine_manager_id, etc.
}

# Reference to an attribute
output "vm_id" {
value = cloudtemple_compute_virtual_machine.example.id
}

Datasources​

Las datasources permiten recuperar información sobre recursos existentes sin gestionarlos. Son de solo lectura.

Uso de los datasources​

# Recuperación de un datacenter existente
data "cloudtemple_compute_virtual_datacenter" "dc" {
name = "DC-EQX6"
}

# Recuperación de un clúster
data "cloudtemple_compute_host_cluster" "cluster" {
name = "clu002-ucs01"
}

# Uso en un recurso
resource "cloudtemple_compute_virtual_machine" "web" {
name = "web-server"
datacenter_id = data.cloudtemple_compute_virtual_datacenter.dc.id
host_cluster_id = data.cloudtemple_compute_host_cluster.cluster.id
# ...
}

Principales fuentes de datos​

Puede encontrar la lista completa de las fuentes de datos disponibles en el proveedor Terraform Cloud Temple en la documentación de Terraform

Infraestructura Compute​

DatasourceDescripción
cloudtemple_compute_virtual_datacenterCentro de datos virtual
cloudtemple_compute_host_clusterCluster de hosts
cloudtemple_compute_datastore_clusterCluster de datastores
cloudtemple_compute_datastoreDatastore individual
cloudtemple_compute_networkRed (VLAN, VXLAN)
cloudtemple_compute_machine_managerMachine Manager (vCenter)

Plantillas y Marketplace​

DatasourceDescripción
cloudtemple_compute_content_libraryBiblioteca de contenido
cloudtemple_compute_content_library_itemElemento de la biblioteca
cloudtemple_marketplace_itemElemento del Marketplace Cloud Temple
cloudtemple_compute_iaas_opensource_templatePlantilla en el catálogo del IaaS OpenSource

Backup​

DatasourceDescription
cloudtemple_backup_sla_policyVMware backup SLA policy
cloudtemple_backup_iaas_opensource_policyOpenSource backup policy

Almacenamiento de objetos​

Origen de datosDescripción
cloudtemple_object_storage_roleRoles disponibles para las ACL
cloudtemple_object_storage_bucket_filesArchivos en un bucket
cloudtemple_object_storage_storage_accountCuenta de almacenamiento existente

Estado de Terraform (State)​

El estado de Terraform es un archivo que mantiene la correspondencia entre su configuración y los recursos reales en la nube.

Archivo terraform.tfstate​

{
"version": 4,
"terraform_version": "1.5.0",
"resources": [
{
"mode": "managed",
"type": "cloudtemple_compute_virtual_machine",
"name": "web",
"provider": "provider[\"registry.terraform.io/Cloud-Temple/cloudtemple\"]",
"instances": [...]
}
]
}

Backend remoto​

Para un trabajo en equipo, almacena el estado en un backend remoto:

terraform {
backend "s3" {
bucket = "terraform-state"
key = "prod/terraform.tfstate"
region = "eu-west-1"
}
}
aviso

El archivo terraform.tfstate contiene información sensible. Nunca lo commits en Git y utiliza un backend seguro para su almacenamiento.

info

OpenTofu ofrece cifrado del estado por defecto (OpenTofu - State and Plan Encryption)

Ciclo de vida de Terraform​

1. Inicialización (terraform init)​

Inicializa el directorio de trabajo y descarga el provider Cloud Temple:

terraform init

Este comando:

  • Descarga el provider desde el Terraform Registry
  • Inicializa el backend (si está configurado)
  • Crea el directorio .terraform/

2. Planificación (terraform plan)​

Genera un plan de ejecución que muestra los cambios que se aplicarán:

terraform plan

El plan indica:

  • Recursos que se crearán (+)
  • Recursos que se modificarán (~)
  • Recursos que se destruirán (-)
  • Recursos que se recrearán (-/+)

3. Aplicación (terraform apply)​

Aplica los cambios para alcanzar el estado deseado:

terraform apply

Terraform:

  1. Genera un plan
  2. Solicita confirmación (excepto con --auto-approve)
  3. Aplica los cambios
  4. Actualiza el estado

4. Destrucción (terraform destroy)​

Elimina todas las recursos gestionados:

terraform destroy
Atención

Este comando elimina definitivamente todos los recursos. Úsalo con precaución.

5. Otras órdenes útiles​

# Mostrar el estado actual
terraform show

# Listar los recursos
terraform state list

# Verificar la configuración
terraform validate

# Formate los archivos
terraform fmt

# Mostrar las salidas
terraform output

Dependencias y orden de ejecución​

Terraform analiza automáticamente las dependencias entre recursos.

Dependencias implícitas​

Terraform detecta las referencias entre recursos:

# La datasource se evalúa en primer lugar
data "cloudtemple_compute_virtual_datacenter" "dc" {
name = "DC-EQX6"
}

# Then the VM is created (implicit dependency via datacenter_id)
resource "cloudtemple_compute_virtual_machine" "web" {
name = "web-server"
datacenter_id = data.cloudtemple_compute_virtual_datacenter.dc.id
# ...
}

# Finally, the disk is attached (dependency via virtual_machine_id)
resource "cloudtemple_compute_virtual_disk" "data" {
name = "data-disk"
virtual_machine_id = cloudtemple_compute_virtual_machine.web.id
capacity = 100 * 1024 * 1024 * 1024
}

Dependencias explícitas​

Para forzar un orden específico, utilice depends_on:

resource "cloudtemple_compute_virtual_machine" "web" {
name = "web-server"
# ...

depends_on = [
cloudtemple_compute_network_adapter.eth0
]
}

Variables y outputs​

Variables de entrada​

Haga que su configuración sea reutilizable:

variable "vm_name" {
description = "Nombre de la máquina virtual"
type = string
default = "my-vm"
}

variable "vm_memory" {
description = "Memoria en GB"
type = number
default = 8
}

resource "cloudtemple_compute_virtual_machine" "example" {
name = var.vm_name
memory = var.vm_memory * 1024 * 1024 * 1024
# ...
}

Outputs​

Expose information after the application:

output "vm_id" {
description = "ID of the virtual machine"
value = cloudtemple_compute_virtual_machine.example.id
}

output "vm_moref" {
description = "VMware Managed Object Reference"
value = cloudtemple_compute_virtual_machine.example.moref
}

Módulos​

Los módulos permiten agrupar y reutilizar configuraciones:

# modules/vm/main.tf
resource "cloudtemple_compute_virtual_machine" "vm" {
name = var.name
memory = var.memory
cpu = var.cpu
# ...
}

# main.tf
module "web_server" {
source = "./modules/vm"

name = "web-01"
memory = 8 * 1024 * 1024 * 1024
cpu = 4
}

module "db_server" {
source = "./modules/vm"

name = "db-01"
memory = 16 * 1024 * 1024 * 1024
cpu = 8
}

Buenas prácticas​

Organización de archivos​

.
├── main.tf # Recursos principales
├── variables.tf # Declaraciones de variables
├── outputs.tf # Declaraciones de outputs
├── versions.tf # Versiones de Terraform y providers
├── terraform.tfvars # Valores de las variables (no commitear)
└── modules/ # Módulos reutilizables
└── vm/
├── main.tf
├── variables.tf
└── outputs.tf

Gestión de secretos​

# ❌ To avoid
provider "cloudtemple" {
client_id = "12345678-1234-1234-1234-123456789abc"
secret_id = "secret-en-clair"
}

# ✅ Recomendado
provider "cloudtemple" {
client_id = var.cloudtemple_client_id
secret_id = var.cloudtemple_secret_id
}

Uso de etiquetas​

resource "cloudtemple_compute_virtual_machine" "web" {
name = "web-server"
# ...

tags = {
environment = "production"
managed_by = "terraform"
team = "platform"
cost_center = "engineering"
}
}

Próximos pasos​