Passa al contenuto principale

Concetti di Terraform nel provider Cloud Temple

Questa pagina presenta i concetti fondamentali necessari per comprendere e utilizzare efficacemente il provider Terraform Cloud Temple.

Infrastructure as Code (IaC)

Infrastructure as Code è un approccio che consiste nel gestire e provisioning l'infrastruttura informatica tramite file di configurazione leggibili dall'uomo, piuttosto che tramite configurazioni manuali o strumenti interattivi.

Vantaggi dell'IaC con Terraform

  • Controllo delle versioni: L'infrastruttura è definita in file che possono essere tracciati (Git)
  • Collaborazione: I team possono lavorare insieme sulla stessa infrastruttura
  • Automazione: Riduzione degli errori umani e risparmio di tempo
  • Documentazione: Il codice descrive esplicitamente l'infrastruttura
  • Riproducibilità: Distribuzione di ambienti identici in pochi minuti

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.

Dichiarazione del provider

Il provider deve essere dichiarato all'interno di un blocco 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
}

Autenticazione

Il provider si autentica presso le API di Cloud Temple utilizzando:

  1. Client ID: Identificativo univoco della tua applicazione
  2. Secret ID: Chiave segreta associata al Client ID

Questi identificativi vengono generati dalla Console di Cloud Temple e consentono al provider di eseguire operazioni a tuo nome.

Best practice

Memorizza le tue credenziali in variabili d'ambiente o in un gestore di segreti, mai direttamente nel codice.

Risorse

Una risorsa rappresenta un componente dell'infrastruttura che può essere creato, letto, aggiornato o eliminato (operazioni 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"
}

Tipi di risorse Cloud Temple

IaaS VMware

  • cloudtemple_compute_virtual_machine : Macchina virtuale
  • cloudtemple_compute_virtual_disk : Disco virtuale
  • cloudtemple_compute_network_adapter : Interfaccia di rete
  • cloudtemple_compute_virtual_controller : Controller per dispositivi

IaaS OpenSource

  • cloudtemple_compute_iaas_opensource_virtual_machine : Macchina virtuale
  • cloudtemple_compute_iaas_opensource_virtual_disk : Disco virtuale
  • cloudtemple_compute_iaas_opensource_network_adapter : Interfaccia di rete
  • cloudtemple_compute_iaas_opensource_replication_policy : Politica di replica

Archiviazione oggetti

  • cloudtemple_object_storage_bucket : Bucket S3
  • cloudtemple_object_storage_storage_account : Account di archiviazione
  • cloudtemple_object_storage_acl_entry : ACL di un bucket
  • cloudtemple_object_storage_global_access_key: Chiave di accesso globale allo spazio dei nomi

Attributi e argomenti

Ogni risorsa possiede:

  • Argomenti: Valori che configurate (input)
  • Attributi: Valori restituiti dalla risorsa (output)
resource "cloudtemple_compute_virtual_machine" "example" {
# Argomenti (configurazione)
name = "my-vm"
memory = 8 * 1024 * 1024 * 1024
cpu = 4

# Attributi (calcolati automaticamente)
# id, moref, machine_manager_id, ecc.
}

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

Datasources

I datasources consentono di recuperare informazioni su risorse esistenti senza gestirle. Sono in sola lettura.

Utilizzo dei datasources

# Recupero di un datacenter esistente
data "cloudtemple_compute_virtual_datacenter" "dc" {
name = "DC-EQX6"
}

# Recupero di un cluster
data "cloudtemple_compute_host_cluster" "cluster" {
name = "clu002-ucs01"
}

# Uso in una risorsa
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
# ...
}

Principali fonti dati

Puoi trovare l'elenco completo delle fonti dati disponibili nel provider Terraform Cloud Temple nella documentazione Terraform

Infrastruttura Compute

DatasourceDescrizione
cloudtemple_compute_virtual_datacenterDatacenter virtuale
cloudtemple_compute_host_clusterCluster di host
cloudtemple_compute_datastore_clusterCluster di datastore
cloudtemple_compute_datastoreDatastore singolo
cloudtemple_compute_networkRete (VLAN, VXLAN)
cloudtemple_compute_machine_managerMachine Manager (vCenter)

Template e Marketplace

DatasourceDescrizione
cloudtemple_compute_content_libraryLibreria di contenuti
cloudtemple_compute_content_library_itemElemento della libreria
cloudtemple_marketplace_itemElemento del Marketplace Cloud Temple
cloudtemple_compute_iaas_opensource_templateTemplate nel catalogo del IaaS OpenSource

Backup

DatasourceDescrizione
cloudtemple_backup_sla_policyPolitica SLA di backup VMware
cloudtemple_backup_iaas_opensource_policyPolitica di backup OpenSource

Object Storage

DatasourceDescrizione
cloudtemple_object_storage_roleRuoli disponibili per le ACL
cloudtemple_object_storage_bucket_filesFile in un bucket
cloudtemple_object_storage_storage_accountAccount di archiviazione esistente

Stato Terraform

Lo stato Terraform è un file che mantiene il collegamento tra la tua configurazione e le risorse effettive nel cloud.

File 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

Per un lavoro di squadra, memorizza lo stato in un backend remoto:

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

Il file terraform.tfstate contiene informazioni sensibili. Non committerlo mai su Git e utilizza un backend sicuro per il suo archiviazione.

informazioni

OpenTofu abilita il cifratura dello stato per impostazione predefinita (OpenTofu - State and Plan Encryption)

Ciclo di vita di Terraform

1. Inizializzazione (terraform init)

Inizializza il repository di lavoro e scarica il provider Cloud Temple:

terraform init

Questo comando:

  • Scarica il provider dal Terraform Registry
  • Inizializza il backend (se configurato)
  • Crea la directory .terraform/

2. Pianificazione (terraform plan)

Genera un piano di esecuzione che mostra le modifiche che verranno applicate:

terraform plan

Il piano indica:

  • Risorse da creare (+)
  • Risorse da modificare (~)
  • Risorse da eliminare (-)
  • Risorse da ricreare (-/+)

3. Applicazione (terraform apply)

Applica le modifiche per raggiungere lo stato desiderato:

terraform apply

Terraform:

  1. Genera un piano
  2. Richiede conferma (tranne con --auto-approve)
  3. Applica le modifiche
  4. Aggiorna lo stato

4. Distruzione (terraform destroy)

Elimina tutte le risorse gestite:

terraform destroy
Attenzione

Questo comando elimina definitivamente tutte le risorse. Utilizzarlo con cautela.

5. Altre comandi utili

# Mostra lo stato attuale
terraform show

# Elencare le risorse
terraform state list

# Verificare la configurazione
terraform validate

# Formattare i file
terraform fmt

# Visualizzare gli output
terraform output

Dipendenze e ordine di esecuzione

Terraform analizza automaticamente le dipendenze tra le risorse.

Dipendenze implicite

Terraform rileva le riferimenti tra le risorse:

# La datasource viene valutata per prima
data "cloudtemple_compute_virtual_datacenter" "dc" {
name = "DC-EQX6"
}

# Quindi la VM viene creata (dipendenza implicita tramite 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
}

Dipendenze esplicite

Per impostare un ordine specifico, utilizza depends_on:

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

depends_on = [
cloudtemple_compute_network_adapter.eth0
]
}

Variabili e output

Input variables

Make your configuration reusable:

variable "vm_name" {
description = "Nome della macchina virtuale"
type = string
default = "my-vm"
}

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

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

Outputs

Espongono informazioni dopo l'applicazione:

output "vm_id" {
description = "ID della macchina virtuale"
value = cloudtemple_compute_virtual_machine.example.id
}

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

Moduli

I moduli consentono di raggruppare e riutilizzare configurazioni:

# 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
}

Best practices

Organizzazione dei file

.
├── main.tf # Risorse principali
├── variables.tf # Dichiarazioni delle variabili
├── outputs.tf # Dichiarazioni degli output
├── versions.tf # Versioni di Terraform e dei provider
├── terraform.tfvars # Valori delle variabili (non da committare)
└── modules/ # Moduli riutilizzabili
└── vm/
├── main.tf
├── variables.tf
└── outputs.tf

Gestione dei segreti

# ❌ Da evitare
provider "cloudtemple" {
client_id = "12345678-1234-1234-1234-123456789abc"
secret_id = "segreto-in-chiaro"
}

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

Uso di tag

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

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

Passi successivi