Cloud

Terraform Guida Italiana Linux: Infrastruttura come Codice in 30 Minuti (2026)

Terraform Guida Italiana Linux: Infrastruttura come Codice in 30 Minuti (2026)

L’infrastruttura IT è il cuore pulsante di qualsiasi organizzazione moderna. Per anni, la gestione di server, network e servizi cloud è stata un’attività manuale, soggetta a errori, difficile da replicare e ancor più da documentare. Ricordo un caso in un’organizzazione con 2.000 endpoint dove un ingegnere chiave lasciò l’azienda, portando con sé anni di conoscenza implicita su come era configurata l’infrastruttura cloud. Il risultato fu un blocco operativo di giorni per decifrare configurazioni e dipendenze. Questo scenario, purtroppo comune, ha spinto verso l’adozione di metodologie più robuste e automatizzate, come l’Infrastructure as Code (IaC). Terraform, uno strumento open-source di HashiCorp, è emerso come leader in questo campo, permettendo di definire, provisionare e gestire l’intera infrastruttura attraverso un semplice codice dichiarativo. Con Terraform, la tua infrastruttura non è più un insieme di configurazioni ad-hoc, ma un asset versionabile, replicabile e auditabile.

In questa guida completa, esploreremo come iniziare a usare Terraform su Linux, partendo dall’installazione fino alla gestione di risorse complesse, con un focus pratico che ti permetterà di deployare la tua prima infrastruttura in meno di 30 minuti. Vedremo i comandi essenziali, le best practice e come affrontare gli errori comuni, trasformando la gestione della tua infrastruttura da un’arte oscura a una scienza precisa e automatizzata.

Prerequisiti / Ambiente di test

Per seguire questa guida, avrai bisogno di un sistema operativo Linux (preferibilmente Ubuntu o Debian, ma i comandi sono facilmente adattabili ad altre distribuzioni). Non sono richieste conoscenze pregresse di Terraform, ma una familiarità con la riga di comando Linux e concetti base di cloud computing sarà utile. Useremo un provider generico (ad esempio, DigitalOcean o Hetzner) per i nostri esempi, ma i principi sono applicabili a qualsiasi provider supportato da Terraform, inclusi AWS, Azure e Google Cloud.

Cos’è Terraform e perché l’Infrastructure as Code è diventata necessaria

Terraform è uno strumento di Infrastructure as Code (IaC) che ti permette di definire le tue risorse infrastrutturali (server, database, network, load balancer) in file di configurazione leggibili dall’uomo, solitamente in formato HashiCorp Configuration Language (HCL). Anziché fare clic su interfacce web o eseguire script manuali, descrivi lo stato desiderato della tua infrastruttura e Terraform si occupa di raggiungerlo. Questo approccio dichiarativo porta a numerosi vantaggi:

  • Consistenza: L’infrastruttura è sempre nello stato definito, eliminando le derive di configurazione (configuration drift).
  • Ripetibilità: Puoi ricreare ambienti identici (sviluppo, staging, produzione) in modo rapido e affidabile, riducendo il “funziona sulla mia macchina”.
  • Versionamento: I file di configurazione possono essere gestiti con sistemi di controllo versione come Git, permettendo di tracciare ogni modifica, tornare indietro a versioni precedenti e collaborare in team.
  • Auditabilità: Ogni cambiamento all’infrastruttura è registrato nel codice, facilitando l’analisi e la conformità alle normative (es. ISO 27001:2022 richiede controllo sulle modifiche infrastrutturali).

Secondo un report di HashiCorp del 2024, il 78% delle aziende enterprise ha adottato l’IaC per la gestione del cloud, con un aumento del 15% rispetto all’anno precedente. Questo dimostra la crescente necessità di automazione e controllo in ambienti complessi.

Installazione su Linux

L’installazione di Terraform su Linux è un processo semplice. Seguiremo i passaggi per i sistemi basati su Debian/Ubuntu, ma il metodo è simile per altre distribuzioni.

  1. Aggiorna il sistema e installa le dipendenze:
    sudo apt update
    sudo apt install -y software-properties-common wget gnupg
  1. Aggiungi la chiave GPG di HashiCorp:
    wget -O- https://apt.releases.hashicorp.com/gpg | \n        gpg --dearmor | \n        sudo tee /usr/share/keyrings/hashicorp-archive-keyring.gpg
  1. Aggiungi il repository HashiCorp APT:
    echo "deb [signed-by=/usr/share/keyrings/hashicorp-archive-keyring.gpg] \n        https://apt.releases.hashicorp.com $(lsb_release -cs) main" | \n        sudo tee /etc/apt/sources.list.d/hashicorp.list
  1. Aggiorna l’elenco dei pacchetti e installa Terraform:
    sudo apt update
    sudo apt install terraform
  1. Verifica l’installazione:
    terraform --version

Dovresti vedere una risposta simile a Terraform v1.x.x. L’installazione è completa!

Il primo provider: DigitalOcean/Hetzner/AWS in 5 minuti

Ogni configurazione Terraform inizia con la definizione di un provider. Un provider è un plugin che Terraform usa per interagire con un’API del servizio cloud o della piattaforma on-premise. Creiamo un file main.tf e definiamo un provider, ad esempio DigitalOcean. Avrai bisogno di un token API per il provider scelto.

Crea un file chiamato main.tf:

# main.tf

terraform {
  required_providers {
    digitalocean = {
      source = "digitalocean/digitalocean"
      version = "~> 2.0"
    }
  }
}

provider "digitalocean" {
  token = var.do_token
}

variable "do_token" {
  description = "Il token API di DigitalOcean"
  type        = string
  sensitive   = true
}

resource "digitalocean_droplet" "web" {
  image = "ubuntu-22-04-x64"
  name = "web-server-01"
  region = "fra1"
  size = "s-1vcpu-1gb"
  ssh_keys = [
    data.digitalocean_ssh_key.my_key.id
  ]
}

data "digitalocean_ssh_key" "my_key" {
  name = "my_ssh_key_name" # Sostituisci con il nome della tua chiave SSH su DigitalOcean
}

output "web_server_ip" {
  value = digitalocean_droplet.web.ipv4_address
  description = "Indirizzo IP pubblico del web server"
}

Questo codice definisce un provider DigitalOcean, crea una variabile per il token API (che non va mai codificato direttamente nel file!), un droplet (VM) Ubuntu e un output per il suo IP. Per evitare di esporre il token API, definiscilo come variabile d’ambiente: export TF_VAR_do_token="YOUR_DO_TOKEN" (sostituisci YOUR_DO_TOKEN con il tuo token reale).

Risorse, variabili e output — la grammatica di Terraform

Il linguaggio HCL di Terraform si basa su pochi blocchi fondamentali:

  • resource: è il blocco più importante. Rappresenta un componente dell’infrastruttura (es. digitalocean_droplet, aws_instance, azurerm_virtual_machine). Definisce lo stato desiderato di una risorsa.
  • variable: permette di parametrizzare le configurazioni, rendendole riutilizzabili e flessibili. Le variabili possono essere passate tramite CLI (-var), file (.tfvars) o variabili d’ambiente (TF_VAR_name).
  • output: espone valori specifici da un modulo o una configurazione. Utile per recuperare informazioni come IP, nomi DNS, ID di risorse dopo un deploy.
  • data: permette di leggere informazioni su risorse esistenti gestite all’esterno di Terraform o da un altro modulo Terraform. Nell’esempio sopra, data "digitalocean_ssh_key" recupera l’ID di una chiave SSH già presente su DigitalOcean.

Questi blocchi, combinati con funzioni e espressioni HCL, permettono di descrivere infrastrutture di qualsiasi complessità.

terraform init, plan, apply, destroy — il workflow

Il ciclo di vita di Terraform segue un workflow ben definito:

  1. terraform init: Questo comando inizializza la directory di lavoro, scaricando i plugin dei provider necessari e configurando il backend per lo state file. È il primo comando da eseguire in una nuova directory Terraform.
    terraform init
  1. terraform plan: Genera un piano di esecuzione, mostrando esattamente quali azioni Terraform intraprenderà per raggiungere lo stato desiderato. Non apporta modifiche reali, ma è fondamentale per prevedere l’impatto del terraform apply.
    terraform plan
  1. terraform apply: Esegue le azioni definite nel piano di esecuzione, creando, modificando o eliminando le risorse. Richiede conferma manuale per prevenire modifiche accidentali. Puoi bypassare la conferma con -auto-approve (sconsigliato in produzione senza un processo CI/CD robusto).
    terraform apply
  1. terraform destroy: Rimuove tutte le risorse gestite dalla configurazione Terraform. Estremamente potente e potenzialmente distruttivo, usalo con cautela e sempre dopo un terraform plan -destroy.
    terraform destroy

Altri comandi utili includono:

  • terraform fmt: formatta i file .tf secondo le convenzioni standard di HCL, migliorando la leggibilità e la consistenza del codice.
    terraform fmt
  • terraform validate: verifica la sintassi dei file di configurazione e la validità delle configurazioni, senza interagire con alcun provider remoto.
    terraform validate
  • terraform state list: elenca le risorse gestite nello state file corrente.
    terraform state list

State file — cos’è e come gestirlo in team (remote backend S3)

Lo state file (terraform.tfstate) è il cuore di Terraform. Contiene un mappaggio delle risorse reali alla tua configurazione, inclusi attributi e metadati. Terraform lo usa per determinare le modifiche da apportare. Senza uno state file, Terraform non saprebbe cosa esiste già e cercherebbe di ricreare tutto da zero.

In ambienti di team, lo state file deve essere gestito in modo centralizzato e sicuro per evitare conflitti e corruzioni. Questo si ottiene configurando un remote backend. I backend remoti bloccano lo state file durante le operazioni per prevenire modifiche concorrenti e offrono versionamento dello state per ripristini in caso di errore.

Un esempio comune è l’utilizzo di un bucket S3 (o storage compatibile come MinIO) come backend:

# backend.tf

terraform {
  backend "s3" {
    bucket = "my-tfstate-bucket-unique-name"
    key    = "prod/terraform.tfstate"
    region = "eu-west-1"
    encrypt = true
    dynamodb_table = "terraform-locks" # Per il locking dello state
  }
}

Dopo aver definito il backend, esegui nuovamente terraform init. Ti chiederà se vuoi migrare lo state locale a quello remoto. La gestione remota dello state è una best practice fondamentale per qualsiasi ambiente di produzione.

Moduli — riusare codice tra progetti

I moduli sono contenitori riutilizzabili di configurazioni Terraform. Permettono di astrarre e incapsulare parti dell’infrastruttura, promuovendo il riuso del codice e la modularità. Immagina di dover deployare più volte un’istanza web con le stesse caratteristiche: invece di copiare e incollare il codice, puoi creare un modulo webserver e richiamarlo più volte.

Esempio di utilizzo di un modulo (qui un modulo locale, ma possono essere anche remoti da registri pubblici o Git):

# main.tf (nel progetto principale)

module "web_server_prod" {
  source = "./modules/webserver"
  instance_name = "prod-web-01"
  region = "eu-central-1"
  instance_type = "t3.medium"
}

module "web_server_dev" {
  source = "./modules/webserver"
  instance_name = "dev-web-01"
  region = "eu-west-1"
  instance_type = "t2.micro"
}

Esempio di definizione del modulo (modules/webserver/main.tf):

# modules/webserver/main.tf

resource "aws_instance" "app_server" {
  ami           = "ami-0abcdef1234567890"
  instance_type = var.instance_type
  tags = {
    Name = var.instance_name
    Environment = "production" # Esempio di tagging
  }
}

variable "instance_name" {
  description = "Nome dell'istanza EC2"
  type        = string
}

variable "region" {
  description = "Regione AWS"
  type        = string
}

variable "instance_type" {
  description = "Tipo di istanza EC2"
  type        = string
  default = "t2.micro"
}

Questa capacità di riuso è cruciale per mantenere un’infrastruttura scalabile e gestibile, riducendo la duplicazione e migliorando la manutenzione. Un’organizzazione con 300+ VM gestite tramite Terraform ha ridotto i tempi di provisioning del 70% grazie a una libreria di moduli ben strutturata.

Provisioners — eseguire script dopo il deploy

I provisioners consentono di eseguire script o comandi su una risorsa locale o remota dopo che è stata creata o modificata da Terraform. Sono utili per configurazioni post-deploy che non possono essere gestite direttamente dal provider stesso. Esistono due tipi principali:

  • local-exec: esegue un comando sulla macchina locale dove viene eseguito Terraform.
  • remote-exec: esegue uno script su una risorsa remota (es. un server appena creato) tramite SSH o WinRM.

Esempio di remote-exec per installare Nginx su un droplet DigitalOcean appena creato:

resource "digitalocean_droplet" "web" {
  # ... configurazione del droplet ...

  provisioner "remote-exec" {
    inline = [
      "sudo apt update",
      "sudo apt install -y nginx",
      "sudo systemctl enable nginx",
      "sudo systemctl start nginx"
    ]

    connection {
      type        = "ssh"
      user        = "root"
      private_key = file("~/.ssh/id_rsa") # Assicurati che questa chiave esista
      host        = self.ipv4_address
    }
  }
}

Sebbene i provisioners siano potenti, è buona pratica limitarli e preferire strumenti di gestione della configurazione come Ansible, Chef o Puppet per compiti più complessi, o usare immagini pre-configurate (AMIs, Docker images) quando possibile. I provisioners dovrebbero essere un’ultima risorsa per compiti specifici e semplici.

Best practice per ambienti produzione

Per utilizzare Terraform in produzione in modo efficace e sicuro, è fondamentale seguire alcune best practice:

  1. Versiona il tuo codice: Usa Git per tutti i tuoi file Terraform. Ogni modifica dovrebbe passare attraverso un processo di code review.
  2. Usa un backend remoto: Come discusso, lo state file deve essere gestito in un backend remoto sicuro (S3, Azure Blob Storage, Google Cloud Storage, HashiCorp Consul/Terraform Cloud) con locking e versionamento.
  3. Variabili e sensibilità: Non hardcodare mai credenziali o informazioni sensibili. Usa variabili d’ambiente (TF_VAR_) o strumenti come HashiCorp Vault. Marca le variabili sensibili con sensitive = true.
  4. Moduli riutilizzabili: Crea moduli per astrazioni comuni e riutilizzali tra progetti. Questo riduce la duplicazione e migliora la coerenza.
  5. Ambienti separati: Usa workspace o directory separate per ambienti diversi (dev, staging, prod) per isolare gli state file e prevenire modifiche accidentali.
  6. Test: Integra Terraform in una pipeline CI/CD per eseguire terraform validate e terraform plan automaticamente prima di ogni apply.
  7. Limitare i provisioners: Preferisci la gestione della configurazione con strumenti dedicati o immagini pre-build rispetto all’uso eccessivo di provisioners.
  8. Least Privilege: Configura i permessi degli utenti e delle service account in modo che abbiano solo le autorizzazioni minime necessarie per operare con Terraform.

Errori comuni e troubleshooting

  • Error: Provider "..." requires a variable named "...": Hai dimenticato di definire una variabile o di passarla. Controlla il file .tfvars o le variabili d’ambiente.
  • State file corrotto o bloccato: Se Terraform si blocca durante un apply o destroy, lo state file potrebbe rimanere bloccato. Usa terraform force-unlock (con cautela!) o ripristina da un backup del backend remoto. Un backend con locking (es. DynamoDB per S3) previene la maggior parte di questi problemi.
  • Error: Resource "..." not found: Spesso accade quando si tenta di riferirsi a una risorsa che non esiste più o che non è stata ancora creata. Controlla la dipendenza tra le risorse.
  • Dipendenze cicliche: Terraform non può risolvere dipendenze dove la risorsa A dipende da B e B dipende da A. Ristruttura la tua configurazione per eliminare i cicli.
  • terraform apply non fa nulla: Se il piano mostra No changes. Your infrastructure matches the configuration., significa che lo stato attuale corrisponde a quello desiderato. O non ci sono modifiche, o il tuo state file è obsoleto (raro con backend remoto).

FAQ — Domande Frequenti

Terraform è solo per il cloud?

No. Sebbene sia ampiamente utilizzato per il cloud (AWS, Azure, GCP), Terraform supporta anche provider per infrastrutture on-premise (VMware vSphere, OpenStack), SaaS (Kubernetes, GitHub) e persino hardware di rete (Cisco, FortiGate). La sua flessibilità lo rende uno strumento versatile per gestire quasi qualsiasi tipo di risorsa tramite API.

Qual è la differenza tra Terraform e Ansible?

Terraform è uno strumento di provisioning dell’infrastruttura (cosa creare e configurare), mentre Ansible è uno strumento di gestione della configurazione (come configurare il software all’interno delle risorse già provisionate). Spesso vengono usati insieme: Terraform crea i server, Ansible li configura con software e servizi. Un’integrazione comune prevede l’uso di provisioners in Terraform per avviare playbook Ansible.

Posso importare infrastruttura esistente in Terraform?

Sì, Terraform offre il comando terraform import che ti permette di importare risorse esistenti nel tuo state file. Questo è utile per iniziare a gestire infrastrutture legacy con IaC senza doverle ricreare da zero. Tuttavia, il processo richiede attenzione per mappare correttamente le risorse esistenti alla configurazione HCL.

Terraform Cloud è obbligatorio?

No, Terraform può essere usato in modalità CLI gratuita. Terraform Cloud offre funzionalità aggiuntive come un backend remoto gestito, UI per piani e apply, gestione delle variabili, e run remoti, migliorando l’esperienza collaborativa e di automazione. Per piccoli team o progetti personali, la CLI è perfettamente adeguata.

Conclusioni con takeaway operativi

Terraform è uno strumento potente e indispensabile per la gestione dell’infrastruttura moderna. Abbracciare l’Infrastructure as Code significa non solo automatizzare il provisioning, ma anche migliorare la consistenza, la sicurezza e l’auditabilità dei tuoi sistemi. Con un investimento iniziale di tempo per imparare i concetti e le best practice, i benefici a lungo termine in termini di efficienza operativa e riduzione degli errori sono enormi. Inizia oggi stesso a definire la tua infrastruttura come codice: la tua organizzazione ti ringrazierà.

Takeaway operativi:

  • Inizia piccolo: non cercare di convertire tutta l’infrastruttura in un colpo solo. Inizia con un piccolo progetto o una singola risorsa.
  • Usa Git: versiona sempre i tuoi file Terraform. Ogni modifica è un commit.
  • Backend remoto: configura subito un backend remoto per lo state file, anche per progetti personali.
  • Impara il workflow: padroneggia init, plan, apply, destroy prima di avventurarti in configurazioni complesse.

Leggi anche: GitHub Actions Deploy Server Linux: Guida Automatica in 20 Minuti (2026)

Leggi anche: Docker Tutorial Sysadmin: Primo Container in Produzione (2026)

Leggi anche: Hardening Linux Server Produzione: Checklist Completa (2026)

Per approfondire, consulta la documentazione ufficiale di Terraform: https://developer.hashicorp.com/terraform/docs

Aggiornato: maggio 2026

Condividi questo articolo:

Scritto da

Rosario Giordano

Rosario Giordano è System Administrator e consulente IT specializzato in cybersecurity e cloud, con oltre 20 anni di esperienza nella gestione di infrastrutture Linux enterprise. Le sue aree di competenza includono hardening di SSH, piattaforme Kubernetes, database PostgreSQL, ambient i virtualizzati VMware e Proxmox, nonché la conformità ai framework di sicurezza NIS2 e ISO 27001.