Comandi principali Terraform¶
Terraform - Workflow¶
| Comando | Descrizione |
|---|---|
terraform init |
Inizializza il progetto, scarica provider e moduli. |
terraform init -upgrade |
Aggiorna provider e moduli all'ultima versione compatibile. |
terraform validate |
Verifica la sintassi e la validità della configurazione. |
terraform fmt |
Formatta automaticamente tutti i file .tf. |
terraform plan |
Mostra le modifiche che verranno applicate. |
terraform apply |
Applica le modifiche. |
terraform apply -auto-approve |
Applica senza chiedere conferma. |
terraform destroy |
Elimina tutte le risorse gestite. |
terraform destroy -target=aws_s3_bucket.logs |
Elimina solo una specifica risorsa. |
Terraform - State¶
| Comando | Descrizione |
|---|---|
terraform state list |
Elenca tutte le risorse presenti nello state. |
terraform state show <risorsa> |
Mostra il dettaglio di una risorsa nello state. |
terraform state mv <src> <dst> |
Sposta una risorsa nello state (refactoring, cambio modulo, rename). |
terraform state rm <risorsa> |
Rimuove una risorsa dallo state senza eliminarla su AWS. |
terraform state pull |
Scarica lo state remoto. |
terraform state pull > backup.tfstate |
Esegue il backup dello state. |
terraform state push backup.tfstate |
Ripristina uno state precedentemente salvato. |
Terraform - Output¶
| Comando | Descrizione |
|---|---|
terraform output |
Mostra tutti gli output. |
terraform output vpc_id |
Mostra un singolo output. |
terraform output -json |
Restituisce gli output in formato JSON. |
terraform output -json \| jq |
Visualizza gli output in formato leggibile. |
Terraform - Provider e Moduli¶
| Comando | Descrizione |
|---|---|
terraform providers |
Elenca provider richiesti da root, moduli e state. |
terraform providers lock |
Aggiorna il lock file dei provider. |
terraform version |
Mostra la versione di Terraform e dei provider installati. |
Terraform - Workspace¶
| Comando | Descrizione |
|---|---|
terraform workspace list |
Elenca i workspace. |
terraform workspace new dev |
Crea un nuovo workspace. |
terraform workspace select dev |
Seleziona un workspace. |
terraform workspace show |
Mostra il workspace corrente. |
terraform workspace delete dev |
Elimina un workspace. |
Terraform - Import¶
| Comando | Descrizione |
|---|---|
terraform import aws_s3_bucket.logs mio-bucket |
Importa una risorsa AWS nello state. |
terraform import module.vpc.aws_vpc.this[0] vpc-xxxxxxxx |
Importa una risorsa direttamente in un modulo. |
Terraform - Console¶
| Comando | Descrizione |
|---|---|
terraform console |
Apre una console interattiva per testare espressioni Terraform. |
Terraform - Utility¶
| Comando | Descrizione |
|---|---|
terraform graph |
Genera il grafo delle dipendenze. |
terraform graph \| dot -Tpng > graph.png |
Esporta il grafo delle dipendenze in PNG (richiede Graphviz). |
terraform fmt -recursive |
Formatta ricorsivamente tutto il progetto. |
terraform plan -out=tfplan |
Salva il piano su file. |
terraform apply tfplan |
Applica un piano precedentemente salvato. |
Comandi utili GitLab Backend¶
| Comando | Descrizione |
|---|---|
terraform state pull > backup-$(date +%F-%H%M).tfstate |
Backup dello state remoto prima di modifiche importanti. |
terraform state push backup.tfstate |
Ripristina il backup dello state remoto. |
terraform init -reconfigure |
Reinizializza il backend dopo modifiche alla configurazione. |
Comandi consigliati durante lo sviluppo¶
Comandi consigliati prima di modificare lo State¶
Comandi consigliati dopo un refactoring¶
Migrazione State tra Root Module¶
Questa procedura serve quando una parte delle risorse viene spostata da uno stack Terraform a un altro, per esempio da prod a prod/network.
L'obiettivo e spostare la gestione delle risorse tra state diversi senza eliminare o ricreare risorse reali.
| Comando | Descrizione |
|---|---|
terraform state pull > /home/fabio/prod.tfstate |
Scarica lo state remoto corrente in un file locale. |
terraform state list -state=/home/fabio/prod.tfstate |
Mostra le risorse presenti nello state locale. |
terraform state rm -state=/home/fabio/prod.tfstate '<risorsa>' |
Rimuove una risorsa dal file state locale senza eliminarla su AWS. |
terraform -chdir=<nuova-root> init -reconfigure |
Inizializza la nuova root Terraform con il backend corretto. |
terraform -chdir=<nuova-root> state push /home/fabio/prod.tfstate |
Carica lo state locale nel backend remoto della nuova root. |
terraform -chdir=<nuova-root> state list |
Verifica che il backend remoto nuovo contenga le risorse migrate. |
terraform -chdir=<nuova-root> plan |
Verifica che la configurazione e lo state siano allineati. |
Esempio Migrazione Network¶
Scenario:
Estrarre lo state sorgente:
terraform -chdir=/home/fabio/Scrivania/Repository/aws/aws/accounts/prod state pull > /home/fabio/prod.tfstate
Verificare il file:
Elencare le risorse nel file locale:
Rimuovere dal file locale le risorse che non devono entrare nello state network:
Verificare che nello state locale siano rimaste solo risorse network:
Risorse attese nello state network:
Risorse da non tenere nello state network:
Inizializzare la root di destinazione:
Caricare lo state locale nel backend remoto della root network:
terraform -chdir=/home/fabio/Scrivania/Repository/aws/aws/accounts/prod/network state push /home/fabio/prod.tfstate
Verificare lo state remoto appena aggiornato:
Eseguire il plan di controllo:
Il risultato atteso e:
Rinominare Address nello State¶
Se durante il refactoring cambia l'address Terraform di una risorsa, usare terraform state mv.
Esempio: una risorsa passa da senza count a con count.
Address precedente:
Address nuovo:
Comando:
terraform -chdir=/home/fabio/Scrivania/Repository/aws/aws/accounts/prod/network state mv \
'module.vpc.aws_main_route_table_association.main' \
'module.vpc.aws_main_route_table_association.main[0]'
Poi verificare:
Pulizia State Sorgente¶
Dopo aver verificato che il nuovo state e corretto, aggiornare lo state sorgente rimuovendo le risorse migrate.
Creare una copia del backup originale:
Rimuovere dallo state remaining le risorse migrate:
terraform state rm -state=/home/fabio/prod-remaining.tfstate 'module.vpc.module.vpc.aws_vpc.this[0]'
terraform state rm -state=/home/fabio/prod-remaining.tfstate 'module.vpc.module.vpc.aws_subnet.intra[0]'
terraform state rm -state=/home/fabio/prod-remaining.tfstate 'module.vpc.module.vpc.aws_subnet.public[0]'
terraform state rm -state=/home/fabio/prod-remaining.tfstate 'module.vpc.module.vpc.aws_route_table.intra[0]'
terraform state rm -state=/home/fabio/prod-remaining.tfstate 'module.vpc.module.vpc.aws_route_table.public[0]'
terraform state rm -state=/home/fabio/prod-remaining.tfstate 'module.vpc.module.vpc.aws_route_table_association.intra[0]'
terraform state rm -state=/home/fabio/prod-remaining.tfstate 'module.vpc.module.vpc.aws_route_table_association.public[0]'
terraform state rm -state=/home/fabio/prod-remaining.tfstate 'module.vpc.module.vpc.aws_internet_gateway.this[0]'
terraform state rm -state=/home/fabio/prod-remaining.tfstate 'module.vpc.module.vpc.aws_route.public_internet_gateway[0]'
terraform state rm -state=/home/fabio/prod-remaining.tfstate 'module.web_security_group.module.security_group.aws_security_group.this[0]'
terraform state rm -state=/home/fabio/prod-remaining.tfstate 'module.ssh_security_group.module.security_group.aws_security_group.this[0]'
Controllare cosa rimane:
Caricare lo state remaining nel backend sorgente:
terraform -chdir=/home/fabio/Scrivania/Repository/aws/aws/accounts/prod state push /home/fabio/prod-remaining.tfstate
Verificare:
terraform -chdir=/home/fabio/Scrivania/Repository/aws/aws/accounts/prod state list
terraform -chdir=/home/fabio/Scrivania/Repository/aws/aws/accounts/prod plan
Eliminare uno State Remoto GitLab¶
Prima di eliminare uno state remoto, fare sempre un backup:
terraform -chdir=/home/fabio/Scrivania/Repository/aws/aws/accounts/prod state pull > /home/fabio/prod-old-before-delete.tfstate
Verificare che le risorse siano gia gestite dagli state nuovi:
terraform -chdir=/home/fabio/Scrivania/Repository/aws/aws/accounts/prod/network plan
terraform -chdir=/home/fabio/Scrivania/Repository/aws/aws/accounts/prod/compute plan
Non usare terraform destroy per eliminare uno state remoto: destroy elimina le risorse reali.
Con backend HTTP GitLab, eliminare lo state remoto dalla UI GitLab:
Dopo l'eliminazione, verificare che gli state rimasti continuino a essere allineati: