Nozioni di base
Flusso di lavoro principale
terraform init # install providers & modules terraform plan # preview changes terraform apply # apply changes terraform destroy # tear down all resources
Comandi essenziali
terraform initInizializza la directory di lavoro, scarica i provider
terraform planMostra il piano di esecuzione senza applicarlo
terraform applyApplica le modifiche all'infrastruttura
terraform destroyElimina tutte le risorse gestite
terraform fmtFormatta i file .tf secondo lo stile canonico
terraform validateControlla la sintassi della configurazione
terraform showMostra lo stato corrente o il piano
terraform outputStampa i valori di output
Provider
Configurazione del provider
terraform { required_providers { aws = { source = "hashicorp/aws", version = "~> 5.0" } } } provider "aws" { region = "us-east-1" }
Note sui provider
sourceIndirizzo nel registry (hashicorp/aws, hashicorp/google)
versionVincolo di versione (~> 5.0, >= 3.0, < 4.0)
.terraform.lock.hclFile di lock — da committare nel controllo versione
aliasUsa più configurazioni per lo stesso provider
Risorse
Blocchi di risorse
resource "aws_instance" "web" { ami = "ami-0c55b159cbfafe1f0" instance_type = "t3.micro" tags = { Name = "web-server" } }
Meta-argomenti delle risorse
depends_onDipendenza esplicita da un'altra risorsa
countCrea più istanze (count = 3)
for_eachCrea istanze da una mappa o set
providerSeleziona un alias di provider non predefinito
lifecyclePersonalizza il comportamento di creazione/aggiornamento/distruzione
Riferimento alle risorse
# type.name.attribute aws_instance.web.id aws_instance.web.public_ip aws_vpc.main.cidr_block
Variabili
Dichiarazione delle variabili
variable "region" { type = string default = "us-east-1" } variable "instance_count" { type = number description = "Number of instances" }
Impostazione dei valori delle variabili
-var 'region=us-west-2'Flag da riga di comando
-var-file=prod.tfvarsCarica da un file .tfvars
terraform.tfvarsCaricato automaticamente se presente
TF_VAR_regionVariabile d'ambiente
Prompt interattivoRichiesto durante plan/apply se non c'è default
Tipi di variabile
string"us-east-1"
number42
booltrue / false
list(string)["a", "b"]
map(string){ key = "val" }
object({...})Tipo strutturato con attributi denominati
Output
Definizione degli output
output "instance_ip" { value = aws_instance.web.public_ip description = "Public IP of the web server" } output "db_password" { value = random_password.db.result sensitive = true }
Comandi per gli output
terraform outputStampa tutti gli output
terraform output instance_ipStampa un output specifico
terraform output -jsonFormato JSON per gli script
sensitive = trueNasconde il valore dall'output CLI
module.vpc.vpc_idAccede agli output del modulo figlio
State
Backend remoto
terraform { backend "s3" { bucket = "my-tf-state" key = "prod/terraform.tfstate" region = "us-east-1" } }
Comandi per lo state
terraform state listElenca tutte le risorse nello state
terraform state show <addr>Mostra gli attributi di una risorsa
terraform state mv <src> <dst>Rinomina / sposta una risorsa nello state
terraform state rm <addr>Rimuove la risorsa dallo state (mantiene l'infrastruttura)
terraform state pullScarica lo state remoto su stdout
terraform import <addr> <id>Importa l'infrastruttura esistente nello state
Moduli
Utilizzo dei moduli
module "vpc" { source = "terraform-aws-modules/vpc/aws" version = "~> 5.0" cidr = "10.0.0.0/16" }
Sorgenti dei moduli
"./modules/vpc"Percorso locale
"terraform-aws-modules/vpc/aws"Terraform Registry
"github.com/org/repo//module"Repository GitHub
"s3::https://bucket/module.zip"Bucket S3
Struttura del modulo
modules/vpc/ main.tf # resources variables.tf # input variables outputs.tf # output values
Sorgenti dati
Lettura di risorse esistenti
data "aws_ami" "ubuntu" { most_recent = true filter { name = "name" values = ["ubuntu/images/hvm-ssd/*"] } owners = ["099720109477"] }
Sorgenti dati comuni
data.aws_amiCerca un'AMI tramite filtri
data.aws_vpcCerca un VPC esistente
data.aws_caller_identityID account AWS corrente
data.aws_regionRegione AWS corrente
data.terraform_remote_stateLegge gli output da un altro file state
data.externalEsegue un programma esterno per i dati
Lifecycle
Regole lifecycle
resource "aws_instance" "web" { lifecycle { create_before_destroy = true prevent_destroy = true ignore_changes = [tags] } }
Opzioni lifecycle
create_before_destroyCrea il sostituto prima di distruggere il vecchio
prevent_destroyErrore se terraform destroy punta a questa risorsa
ignore_changesNon rileva le derive sugli attributi elencati
replace_triggered_byForza la sostituzione quando la risorsa referenziata cambia
preconditionValida le assunzioni prima dell'apply
postconditionValida i risultati dopo l'apply
Pattern comuni
Cicli e condizionali
# for_each with a map resource "aws_iam_user" "users" { for_each = toset(["alice", "bob"]) name = each.value } # conditional resource count = var.create_db ? 1 : 0
Funzioni utili
file("key.pub")Legge il contenuto del file
join(", ", list)Unisce una lista in una stringa
lookup(map, key, default)Ricerca in una mappa con fallback
length(list)Numero di elementi
toset(["a", "b"])Converte una lista in set (per for_each)
try(expr, fallback)Restituisce fallback se expr genera errori
templatefile(path, vars)Renderizza un file template