Checkpoint
Working with Backends
/ 100
Gestire lo stato di Terraform
Questo lab è stato sviluppato in collaborazione con il nostro partner Hashicorp. Le tue informazioni personali potrebbero essere condivise con Hashicorp, lo sponsor del lab, se hai acconsentito a ricevere aggiornamenti, annunci e offerte di prodotti nel profilo del tuo account.
GSP752
Panoramica
Terraform deve archiviare lo stato relativo alla tua infrastruttura gestita e alla configurazione. Questo stato viene utilizzato da Terraform per mappare risorse del mondo reale sulla tua configurazione, tenere traccia dei metadati e migliorare le prestazioni per infrastrutture di grandi dimensioni.
Per impostazione predefinita, lo stato viene archiviato in un file locale con nome terraform.tfstate
, ma è anche possibile archiviarlo in una posizione remota, una soluzione migliore per ambienti con team.
Terraform usa questo stato locale per creare piani e apportare modifiche all'infrastruttura. Prima di qualsiasi operazione, Terraform esegue un aggiornamento in modo che lo stato rifletta l'infrastruttura reale.
Lo stato di Terraform ha lo scopo principale di archiviare le associazioni tra gli oggetti in un sistema remoto e le istanze di risorse dichiarate nella tua configurazione. Quando Terraform crea un oggetto remoto in risposta a una modifica della configurazione, ne registra l'identità a fronte di una particolare istanza di risorsa, dopodiché potrà aggiornare o eliminare l'oggetto in risposta a future modifiche della configurazione.
Obiettivi
In questo lab imparerai a eseguire le attività seguenti:
- Creare un backend locale.
- Creare un backend Cloud Storage.
- Aggiornare lo stato di Terraform.
- Importare una configurazione Terraform.
- Gestire la configurazione importata con Terraform.
Configurazione e requisiti
Prima di fare clic sul pulsante Avvia lab
Leggi le seguenti istruzioni. I lab sono a tempo e non possono essere messi in pausa. Il timer si avvia quando fai clic su Avvia lab e ti mostra per quanto tempo avrai a disposizione le risorse Google Cloud.
Con questo lab pratico avrai la possibilità di completare le attività in prima persona, in un ambiente cloud reale e non di simulazione o demo. Riceverai delle nuove credenziali temporanee che potrai utilizzare per accedere a Google Cloud per la durata del lab.
Per completare il lab, avrai bisogno di:
- Accesso a un browser internet standard (Chrome è il browser consigliato).
- È ora di completare il lab: ricorda che, una volta iniziato, non puoi metterlo in pausa.
Come avviare il lab e accedere alla console Google Cloud
-
Fai clic sul pulsante Avvia lab. Se devi effettuare il pagamento per il lab, si apre una finestra popup per permetterti di selezionare il metodo di pagamento. A sinistra, trovi il riquadro Dettagli lab con le seguenti informazioni:
- Il pulsante Apri console Google Cloud
- Tempo rimanente
- Credenziali temporanee da utilizzare per il lab
- Altre informazioni per seguire questo lab, se necessario
-
Fai clic su Apri console Google Cloud (o fai clic con il tasto destro del mouse e seleziona Apri link in finestra di navigazione in incognito se utilizzi il browser Chrome).
Il lab avvia le risorse e apre un'altra scheda con la pagina di accesso.
Suggerimento: disponi le schede in finestre separate posizionate fianco a fianco.
Nota: se visualizzi la finestra di dialogo Scegli un account, fai clic su Usa un altro account. -
Se necessario, copia il Nome utente di seguito e incollalo nella finestra di dialogo di accesso.
{{{user_0.username | "Username"}}} Puoi trovare il Nome utente anche nel riquadro Dettagli lab.
-
Fai clic su Avanti.
-
Copia la Password di seguito e incollala nella finestra di dialogo di benvenuto.
{{{user_0.password | "Password"}}} Puoi trovare la Password anche nel riquadro Dettagli lab.
-
Fai clic su Avanti.
Importante: devi utilizzare le credenziali fornite dal lab. Non utilizzare le credenziali del tuo account Google Cloud. Nota: utilizzare il tuo account Google Cloud per questo lab potrebbe comportare addebiti aggiuntivi. -
Fai clic nelle pagine successive:
- Accetta i termini e le condizioni.
- Non inserire opzioni di recupero o l'autenticazione a due fattori, perché si tratta di un account temporaneo.
- Non registrarti per le prove gratuite.
Dopo qualche istante, la console Google Cloud si apre in questa scheda.
Attiva Cloud Shell
Cloud Shell è una macchina virtuale in cui sono caricati strumenti per sviluppatori. Offre una home directory permanente da 5 GB e viene eseguita su Google Cloud. Cloud Shell fornisce l'accesso da riga di comando alle risorse Google Cloud.
- Fai clic su Attiva Cloud Shell
nella parte superiore della console Google Cloud.
Quando la connessione è attiva, l'autenticazione è già avvenuta e il progetto è impostato sul tuo PROJECT_ID. L'output contiene una riga che dichiara il PROJECT_ID per questa sessione:
gcloud
è lo strumento a riga di comando di Google Cloud. È preinstallato su Cloud Shell e supporta il completamento tramite tasto Tab.
- (Facoltativo) Puoi visualizzare il nome dell'account attivo con questo comando:
-
Fai clic su Autorizza.
-
L'output dovrebbe avere ora il seguente aspetto:
Output:
- (Facoltativo) Puoi elencare l'ID progetto con questo comando:
Output:
Output di esempio:
gcloud
, in Google Cloud, fai riferimento alla Panoramica dell'interfaccia a riga di comando gcloud.
Scopo dello stato di Terraform
Lo stato è un requisito necessario per il funzionamento di Terraform. Una domanda comune è se Terraform possa funzionare senza stato o se sia possibile evitare di utilizzare lo stato limitandosi a ispezionare le risorse cloud a ogni esecuzione. Negli scenari in cui Terraform potrebbe riuscire a funzionare senza stato, questo richiederebbe il trasferimento di un'enorme complessità da una parte (lo stato) a un'altra (il concetto di sostituzione). Questa sezione spiega perché lo stato di Terraform è necessario.
Mappatura sul mondo reale
Terraform richiede un database per la mappatura della configurazione Terraform sul mondo reale. Quando la configurazione contiene una risorsa resource "google_compute_instance" "foo"
, Terraform utilizza questa mappatura per sapere che la risorsa rappresenta l'istanza i-abcd1234
.
Terraform prevede che ogni oggetto remoto sia associato a una sola istanza di risorsa, il che normalmente è garantito, dal momento che è Terraform a provvedere alla creazione degli oggetti e alla registrazione delle loro identità nello stato. Se invece importi oggetti creati fuori da Terraform, devi verificare che ogni singolo oggetto sia importato su una sola istanza di risorsa.
Se un oggetto remoto è collegato a due o più istanze di risorsa, Terraform potrebbe agire in modo imprevisto nei confronti dell'oggetto, perché la mappatura tra configurazione e stato dell'oggetto remoto è diventata ambigua.
Metadati
Oltre a monitorare le mappature tra risorse e oggetti remoti, Terraform deve monitorare anche metadati come le dipendenze delle risorse.
Terraform in genere utilizza la configurazione per determinare l'ordine delle dipendenze. Se rimuovi una risorsa da una configurazione, Terraform deve sapere come eliminare questa risorsa. Terraform può rilevare l'esistenza di una mappatura per una risorsa non presente nel file di configurazione e pianificarne l'eliminazione. Tuttavia, poiché la risorsa non esiste più, l'ordine non può essere stabilito in base alla sola configurazione.
Per assicurare un funzionamento corretto, Terraform conserva una copia del set di dipendenze più recente all'interno dello stato. Adesso, quando elimini uno o più elementi dalla configurazione, Terraform è ancora in grado di determinare l'ordine corretto per l'eliminazione in base allo stato.
Si potrebbe evitare questa situazione se Terraform conoscesse un ordinamento obbligatorio tra i tipi di risorse. Ad esempio, Terraform potrebbe sapere che è necessario eliminare i server prima delle subnet di cui fanno parte. Tuttavia, la complessità di questo approccio diventa rapidamente ingestibile: oltre a comprendere la semantica dell'ordinamento di ogni risorsa per ogni cloud, Terraform deve comprendere anche l'ordinamento nei diversi provider.
Terraform archivia anche altri metadati per motivi analoghi, tra cui un puntatore alla configurazione del provider utilizzato più di recente con la risorsa laddove sono presenti più provider con alias.
Prestazioni
Oltre alla mappatura base, Terraform archivia una cache dei valori degli attributi per tutte le risorse nello stato. Questa è una funzionalità facoltativa dello stato di Terraform e viene utilizzata solo come miglioramento delle prestazioni.
Durante l'esecuzione di un comando terraform plan
, Terraform deve conoscere lo stato attuale delle risorse per poter determinare efficacemente le modifiche necessarie per raggiungere la configurazione desiderata.
Per le infrastrutture di dimensioni ridotte, Terraform può inviare query ai tuoi provider e sincronizzare gli attributi più recenti di tutte le tue risorse. Questo è il comportamento predefinito di Terraform: per ogni comando plan
e apply
, Terraform sincronizza tutte le risorse nel tuo stato.
Per le infrastrutture più grandi, l'esecuzione di query per ogni risorsa richiede troppo tempo. Molti cloud provider non forniscono API per eseguire contemporaneamente query su più risorse, inoltre il tempo di round trip per ogni risorsa è di centinaia di millisecondi. A questo si aggiunge il fatto che i cloud provider prevedono quasi sempre una limitazione di frequenza delle API, per cui Terraform può richiedere solo un numero limitato di risorse in un dato periodo di tempo. Gli utenti di Terraform con organizzazioni più grandi usano spesso sia il flag -refresh=false
che il flag -target
per aggirare questa limitazione. In scenari del genere, lo stato memorizzato nella cache viene considerato come l'effettiva situazione nel mondo reale.
Sincronizzazione
Nella configurazione predefinita, Terraform archivia lo stato in un file nella directory di lavoro attuale in cui è stato eseguito. Questa soluzione funziona quando si muovono i primi passi, ma quando a utilizzare Terraform è un team, è importante che tutti lavorino con lo stesso stato, in modo da applicare le operazioni agli stessi oggetti remoti.
Lo stato remoto è la soluzione consigliata per questo problema. Un backup dello stato con funzionalità complete consente di utilizzare il blocco remoto per impedire che più utenti eseguano accidentalmente Terraform nello stesso momento e assicurare così che ogni esecuzione di Terraform inizi con lo stato aggiornato più recente.
Blocco dello stato
Se la funzionalità è supportata dal tuo backend, Terraform blocca lo stato per tutte le operazioni che potrebbero comportarne una scrittura. In questo modo si impedisce che altri acquisiscano il blocco, con il rischio di danneggiare il tuo stato.
Il blocco dello stato viene applicato automaticamente per tutte le operazioni che potrebbero comportarne la scrittura. Non verranno visualizzati messaggi in merito. Se il blocco dello stato non riesce, Terraform interrompe l'operazione. Puoi disabilitare il blocco dello stato con il flag -lock
per la maggior parte dei comandi, ma questa operazione è sconsigliata.
Se l'acquisizione del blocco richiede più tempo del previsto, Terraform genera un messaggio di stato. L'assenza di un messaggio di Terraform indica che il blocco dello stato è ancora in corso.
Il blocco non è supportato da tutti i backend. Visualizza l'elenco dei tipi di backend per i dettagli sul supporto del blocco per ogni backend.
Aree di lavoro
Ogni configurazione Terraform ha un backend associato, che definisce le modalità di esecuzione delle operazioni e la posizione di archiviazione di dati permanenti come lo stato di Terraform.
I dati permanenti archiviati nel backend appartengono a un'area di lavoro. Inizialmente, il backend ha una sola area di lavoro, denominata default, e quindi un solo stato di Terraform associato alla configurazione.
Alcuni backend supportano più aree di lavoro con nome, permettendo quindi di associare più stati a un'unica configurazione. La configurazione continua ad avere un solo backend, ma è possibile eseguire il deployment di più istanze distinte della configurazione senza dover configurare un nuovo backend o cambiare le credenziali di autenticazione.
Attività 1: uso dei backend
Un backend in Terraform determina come viene caricato lo stato e come vengono eseguite le operazioni, ad esempio apply
. Questa astrazione consente l'archiviazione dello stato in un file non locale, l'esecuzione remota e altro ancora.
Per impostazione predefinita, Terraform utilizza il backend "local", il comportamento normale a cui siamo abituati. Questo è il backend che veniva richiamato nei lab precedenti.
Ecco alcuni vantaggi dei backend:
- Lavoro in team: i backend supportano l'archiviazione remota dello stato e la sua protezione con blocchi per evitarne il danneggiamento. Alcuni backend, come Terraform Cloud, sono anche in grado di archiviare automaticamente una cronologia di tutte le revisioni dello stato.
- Conservazione di informazioni sensibili non su disco: lo stato viene recuperato dai backend on demand e archiviato solo in memoria.
-
Operazioni remote: per le infrastrutture più grandi o per determinate modifiche,
terraform apply
può richiedere molto tempo. Alcuni backend supportano le operazioni remote, che consentono l'esecuzione remota dell'operazione. Anche dopo che avrai spento il tuo computer, l'operazione continuerà fino al completamento. In combinazione con l'archiviazione remota e il blocco remoto dello stato descritti sopra, questo è un aspetto utile negli ambienti con team.
I backend sono completamente facoltativi: puoi usare correttamente Terraform senza doverli mai studiare o utilizzare. Tuttavia, offrono una soluzione ad aspetti problematici del lavoro per i team di una certa grandezza. Se lavori in autonomia, probabilmente non avrai bisogno di utilizzare i backend per conseguire i tuoi obiettivi.
Anche se intendi utilizzare solo il backend "local", una conoscenza dei backend in generale può essere comunque utile, dato che puoi modificare il comportamento del backend locale.
Aggiungi un backend locale
In questa sezione configurerai un backend locale.
Durante la configurazione iniziale di un backend (dall'assenza di un backend definito all'esplicita configurazione), Terraform ti offre l'opzione di migrare lo stato al nuovo backend. In questo modo puoi adottare backend senza perdere lo stato esistente.
Come misura di ulteriore cautela, consigliamo sempre di eseguire anche un backup manuale dello stato. Per farlo, è sufficiente copiare il tuo file terraform.tfstate
in un'altra posizione. Anche il processo di inizializzazione prevede la creazione di un backup, ma la prudenza non è mai troppa!
La configurazione iniziale di un backend non è diversa dalla modifica di una configurazione in un secondo momento: dovrai creare la nuova configurazione ed eseguire terraform init
. Terraform ti guiderà nei passaggi successivi.
- In una nuova finestra di Cloud Shell, crea il tuo file di configurazione
main.tf
:
- Per recuperare l'ID progetto, esegui questo comando:
- Nella barra degli strumenti di Cloud Shell fai clic su Apri editor. Per passare da Cloud Shell all'editor di codice o viceversa, fai clic su Apri editor o Apri terminale, a seconda del caso, oppure fai clic su Apri in una nuova finestra per lasciare aperto l'editor in una scheda separata.
- Copia il codice risorsa del bucket Cloud Storage nel file di configurazione
main.tf
, sostituendo le definizioni delle variabiliproject
ename
con il tuo ID progetto:
Scopri di più sulle risorse Cloud Storage nella documentazione di Terraform.
- Aggiungi un backend locale al tuo file
main.tf
:
Questo aggiunge un riferimento a un file terraform.tfstate
nella directory terraform/state
. Per specificare un percorso file diverso, modifica la variabile path
.
Il backend locale archivia lo stato sul file system locale, lo blocca utilizzando le API di sistema ed esegue le operazioni localmente.
Terraform deve inizializzare gli eventuali backend configurati prima dell'uso. Per farlo, dovrai eseguire terraform init
. Il comando terraform init
deve essere eseguito come primo passo da qualsiasi membro del tuo team su qualunque configurazione Terraform. Il comando può essere utilizzato anche più volte ed esegue tutte le azioni richieste per un ambiente Terraform, compresa l'inizializzazione del backend.
È richiesta una chiamata al comando init
:
- Per qualsiasi nuovo ambiente che configura un backend
- Per qualsiasi modifica della configurazione del backend (compreso il tipo di backend)
- Per la rimozione completa della configurazione del backend
Non c'è bisogno di ricordare questi casi esatti. Terraform rileverà quando è richiesta l'inizializzazione e, in tal caso, mostrerà un messaggio di errore. Terraform non esegue automaticamente l'inizializzazione perché potrebbe richiedere ulteriori informazioni dall'utente o dover eseguire migrazioni degli stati e così via.
- Nella barra degli strumenti di Cloud Shell, fai clic su Apri terminale, quindi inizializza Terraform:
- Applica le modifiche. Digita yes quando richiesto per confermare:
A questo punto, nell'editor di Cloud Shell dovrebbe essere visualizzato il file di stato, denominato terraform.tfstate
, nella directory terraform/state
.
- Esamina il file di stato:
Dovresti vedere la tua risorsa google_storage_bucket.test-bucket-for-state
.
Aggiungi un backend Cloud Storage
Un backend Cloud Storage archivia lo stato come un oggetto in un prefisso configurabile in un determinato bucket in Cloud Storage. Questo backend supporta anche il blocco dello stato. Lo stato viene bloccato per tutte le operazioni che potrebbero comportarne la scrittura. In questo modo si impedisce che altri acquisiscano il blocco, con il rischio di danneggiare il tuo stato.
Il blocco dello stato viene applicato automaticamente per tutte le operazioni che potrebbero comportarne la scrittura. Non verranno visualizzati messaggi in merito. Se il blocco dello stato non riesce, Terraform interrompe l'operazione. Puoi disabilitare il blocco dello stato per la maggior parte dei comandi con il flag -lock
, ma questa operazione è sconsigliata.
-
Torna al tuo file
main.tf
nell'editor. Ora sostituirai l'attuale backend locale con un backendgcs
. -
Per cambiare la configurazione del backend locale esistente, copia la configurazione seguente nel file, sostituendo il backend
local
:
bucket
. Se non hai ancora modificato la configurazione, sarà il valore di name
della risorsa google_storage_bucket
. Il file di stato sarà ospitato in questo bucket.
- Inizializza di nuovo il tuo backend, questa volta per eseguire automaticamente la migrazione dello stato:
Digita yes quando richiesto per confermare.
-
Nella console Cloud, nel menu di navigazione, fai clic su Cloud Storage > Bucket.
-
Fai clic sul tuo bucket e passa al file
terraform/state/default.tfstate
. Il tuo file di stato è ora presente in un bucket Cloud Storage.
Aggiorna lo stato
Il comando terraform refresh
consente di riconciliare lo stato noto a Terraform (tramite il file di stato) con l'infrastruttura reale. Può essere utilizzato per rilevare eventuali deviazioni rispetto all'ultimo stato noto e aggiornare il file di stato.
Non modifica l'infrastruttura, modifica però il file di stato. Un cambiamento nello stato può provocare cambiamenti durante i successivi comandi plan o apply.
-
Torna al tuo bucket di archiviazione nella console Cloud. Seleziona la casella di controllo accanto al nome.
-
Fai clic sulla scheda Etichette.
-
Fai clic su Aggiungi etichetta. Imposta Chiave 1 =
key
e Valore 1 =value
. -
Fai clic su Salva.
-
Torna a Cloud Shell e usa il comando seguente per aggiornare il file di stato:
- Esamina gli aggiornamenti:
La coppia chiave-valore "key" = "value"
dovrebbe essere visualizzata nell'attributo labels della configurazione.
Fai clic su Controlla i miei progressi per verificare l'obiettivo.
Pulisci l'area di lavoro
Prima di continuare con l'attività successiva, elimina l'infrastruttura di cui hai eseguito il provisioning.
- Per prima cosa, ripristina il backend su
local
per poter eliminare il bucket di archiviazione. Copia e sostituisci la configurazionegcs
con la seguente:
- Inizializza di nuovo il backend
local
:
Digita yes quando richiesto per confermare.
- Nel file
main.tf
, aggiungi l'argomentoforce_destroy = true
alla tua risorsagoogle_storage_bucket
. Quando elimini un bucket, questa opzione booleana elimina tutti gli oggetti contenuti. Se provi a eliminare un bucket che contiene oggetti, Terraform non può completare l'esecuzione. La configurazione della risorsa dovrebbe essere simile a questa:
- Applica le modifiche:
Digita yes
quando richiesto per confermare.
- Ora puoi eliminare correttamente la tua infrastruttura:
Digita yes quando richiesto per confermare.
Attività 2: importa la configurazione Terraform
In questa sezione importerai un container e un'immagine Docker esistenti in un'area di lavoro Terraform vuota. Durante questa attività imparerai strategie e considerazioni per l'importazione dell'infrastruttura reale in Terraform.
Il flusso di lavoro predefinito di Terraform prevede che l'infrastruttura venga creata e gestita interamente con Terraform.
-
Scrivi una configurazione Terraform che definisce l'infrastruttura da creare.
-
Rivedi il piano Terraform per assicurarti che la configurazione produrrà lo stato e l'infrastruttura come previsto.
-
Applica la configurazione per creare il tuo stato e la tua infrastruttura Terraform.
Dopo aver creato l'infrastruttura con Terraform, puoi aggiornare la configurazione e pianificare e applicare le modifiche. Alla fine, utilizzerai Terraform per eliminare l'infrastruttura quando non è più necessaria. Questo flusso di lavoro presuppone che Terraform crei un'infrastruttura completamente nuova.
Tuttavia, potresti aver bisogno di gestire un'infrastruttura che non è stata creata da Terraform. Il comando terraform import risolve questo problema caricando le risorse supportate nello stato dell'area di lavoro Terraform.
Il comando di importazione non genera però automaticamente la configurazione per gestire l'infrastruttura. Per questo motivo, per importare un'infrastruttura esistente in Terraform sono richiesti più passaggi.
Per portare sotto il controllo di Terraform l'infrastruttura esistente sono richiesti cinque passaggi principali:
- Identifica l'infrastruttura esistente da importare.
- Importa l'infrastruttura nello stato di Terraform.
- Scrivi una configurazione Terraform corrispondente all'infrastruttura.
- Rivedi il piano Terraform per assicurarti che la configurazione produrrà lo stato e l'infrastruttura come previsto.
- Applica la configurazione per aggiornare lo stato di Terraform.
In questa sezione, per prima cosa creerai un container Docker con l'interfaccia a riga di comando di Docker. Quindi lo importerai in una nuova area di lavoro Terraform. Successivamente, aggiornerai la configurazione del container utilizzando Terraform, per poi eliminarlo alla fine dell'attività.
terraform.tfstate
e della directory .terraform
e archiviala in una posizione sicura.
Crea un container Docker
- Crea un container denominato
hashicorp-learn
utilizzando la più recente immagine NGINX in Docker Hub e ottieni un'anteprima del container sulla macchina virtuale Cloud Shell attraverso la porta 80 (HTTP):
- Verifica che il container sia in esecuzione:
- Nel riquadro Cloud Shell, fai clic su Anteprima web, quindi fai clic su Anteprima sulla porta 8080.
Cloud Shell apre l'URL di anteprima sul suo servizio di proxy in una nuova finestra del browser e visualizza la pagina indice predefinita NGINX. Ora hai un'immagine e un container Docker da importare nell'area di lavoro e gestire con Terraform.
Importa il container in Terraform
- Clona il repository di esempio:
- Passa alla directory:
Questa directory contiene due file di configurazione Terraform che costituiscono la configurazione utilizzata in questa guida:
- Il file
main.tf
configura il provider Docker. - Il file
docker.tf
contiene la configurazione necessaria per gestire il container Docker creato in un passaggio precedente.
- Inizializza la tua area di lavoro Terraform:
terraform init -upgrade
-
Nell'editor di Cloud Shell, passa a
learn-terraform-import/main.tf
. -
Trova la risorsa
provider: docker
e commenta o elimina l'argomentohost
:
-
Quindi, passa a
learn-terraform-import/docker.tf
. -
Sotto il codice commentato, definisci una risorsa
docker_container
vuota nel tuo filedocker.tf
, che rappresenta un container Docker con l'ID risorsa Terraformdocker_container.web
:
- Trova il nome del container da importare: in questo caso, il container creato nel passaggio precedente:
- Esegui il comando
terraform import
riportato di seguito per collegare il container Docker esistente alla risorsadocker_container.web
appena creata. Il comando terraform import richiede l'ID risorsa Terraform e l'ID container Docker completo. Il comandodocker inspect -f {{.ID}} hashicorp-learn
restituisce l'ID container SHA256 completo:
terraform import
varia in base al tipo di risorsa ed è specificato nella documentazione del provider per qualsiasi risorsa che può essere importata in Terraform. Per questo esempio, consulta la documentazione del provider Docker
- Verifica che il container sia stato importato nel tuo stato di Terraform:
Questo stato contiene tutte le informazioni note a Terraform sul container Docker appena importato. Tuttavia, il comando terraform import non crea la configurazione per la risorsa.
Crea la configurazione
Per poter utilizzare Terraform per gestire il container, dovrai prima creare la configurazione Terraform.
- Esegui questo codice:
image
e name
. Terraform non può generare un piano per una risorsa priva degli argomenti obbligatori.
Per aggiornare la configurazione in docker.tf
in modo che corrisponda allo stato importato esistono due approcci. Puoi accettare l'intero stato attuale della risorsa nella configurazione così com'è, oppure selezionare gli attributi obbligatori nella configurazione uno per uno. Ognuno di questi approcci può essere utile in circostanze diverse.
-
L'uso dello stato attuale è spesso più rapido, ma può comportare una configurazione con un livello di dettaglio eccessivo, dal momento che ogni attributo è incluso nello stato, che sia necessario o meno nella configurazione.
-
La selezione dei singoli attributi obbligatori può portare a una configurazione più gestibile, ma richiede che tu sappia quali attributi devi impostare.
Ai fini di questo lab, utilizzerai come risorsa lo stato attuale.
- Copia il tuo stato di Terraform nel file
docker.tf
:
>
sostituisce l'intero contenuto di docker.tf con l'output del comando terraform show
. L'operazione funziona per questo esempio. Tuttavia, per importare una risorsa in una configurazione che già gestisce delle risorse, dovrai modificare l'output di terraform show
per rimuovere le risorse esistenti di cui non vuoi sostituire completamente la configurazione e unire le nuove risorse alla configurazione esistente.
-
Esamina il file
docker.tf
e vedrai che i contenuti sono stati sostituiti dall'output del comando terraform show che hai appena eseguito. -
Esegui questo codice:
Terraform visualizzerà avvisi ed errori relativi a un argomento deprecato ("links") e a diversi argomenti di sola lettura (ip_address
, network_data
, gateway
, ip_prefix_length
, id
).
Questi argomenti di sola lettura sono valori che Terraform archivia nel suo stato per i container Docker, ma che non può impostare tramite configurazione perché sono gestiti internamente da Docker. Terraform può impostare l'argomento links con la configurazione, ma continuerà a visualizzare un avviso perché questo è deprecato e potrebbe non essere supportato dalle versioni future del provider Docker.
Poiché l'approccio qui mostrato carica tutti gli attributi rappresentati nello stato di Terraform, la configurazione include attributi facoltativi che mantengono i valori predefiniti. Gli attributi facoltativi e i loro valori predefiniti variano a seconda del provider e sono elencati nella documentazione del provider.
- Ora puoi rimuovere selettivamente gli attributi facoltativi. Rimuovi tutti questi attributi, mantenendo solo quelli obbligatori:
image
,name
eports
. Dopo la rimozione degli attributi facoltativi, la configurazione dovrebbe essere la seguente:
Quando importi un'infrastruttura reale, consulta la documentazione del provider per sapere gli effetti di ciascun argomento. Sarà più facile stabilire come gestire eventuali errori o avvisi del passaggio di pianificazione. Ad esempio, la documentazione dell'argomento links
si trova nella documentazione del provider Docker.
- Verifica che gli errori siano stati risolti:
Il comando plan ora dovrebbe venire eseguito correttamente. Nota che il piano indica che Terraform aggiornerà il container per aggiungere gli attributi attach
, logs
, must_run
e start
.
Terraform usa questi attributi per creare container Docker, ma Docker non li archivia. Di conseguenza, terraform import
non aveva caricato i relativi valori nello stato. Quando pianifichi e applichi la configurazione, il provider Docker assegna i valori predefiniti per questi attributi e li salva nello stato, ma questi non influiscono sul container in esecuzione.
- Applica le modifiche e completa il processo di sincronizzazione della configurazione e dello stato di Terraform aggiornati con il container Docker che rappresentano. Digita yes quando richiesto per confermare.
Ora il file di configurazione, lo stato di Terraform e il container sono tutti sincronizzati e puoi usare Terraform per gestire il container Terraform nel modo consueto.
Crea la risorsa immagine
In alcuni casi, puoi portare risorse sotto il controllo di Terraform senza utilizzare il comando terraform import
. Questo è frequente per risorse definite da un singolo ID o tag univoco, come le immagini Docker.
Nel tuo file docker.tf
, la risorsa docker_container.web
specifica l'ID hash SHA256 dell'immagine utilizzata per creare il container. Questa è la modalità di archiviazione interna dell'ID immagine in Docker, per cui terraform import
ha caricato l'ID immagine direttamente nel tuo stato. Tuttavia, l'ID immagine non è facilmente leggibile quanto il tag o il nome dell'immagine e potrebbe non soddisfare le tue necessità. Ad esempio, potresti voler usare l'ultima versione dell'immagine "nginx".
- Per recuperare il nome tag dell'immagine, esegui il comando riportato di seguito, sostituendo
<IMAGE-ID>
con l'ID immagine indocker.tf
:
- Aggiungi la configurazione seguente al tuo file
docker.tf
per rappresentare questa immagine come una risorsa:
docker_container.web
altrimenti Terraform eliminerà il container e lo creerà di nuovo. Poiché non ha ancora caricato la risorsa docker_image.nginx
nello stato, Terraform non ha un ID immagine da confrontare con quello impostato come hardcoded e quindi deduce che il container deve essere sostituito. Per evitare questa situazione, prima crea l'immagine, quindi aggiorna il container per utilizzarla, come mostrato in questo lab.
- Crea una risorsa per l'immagine nello stato:
Ora che Terraform ha creato una risorsa per l'immagine, puoi farvi riferimento nella configurazione del tuo container.
- Cambia il valore di image per
docker_container.web
in modo che faccia riferimento alla nuova risorsa immagine:
- Cerca le modifiche:
Poiché docker_image.nginx.latest
corrisponde all'ID immagine impostato come hardcoded che hai sostituito, l'esecuzione di terraform apply
a questo punto non mostrerà alcuna modifica.
Gestisci il container con Terraform
Ora che Terraform gestisce il container Docker, usa Terraform per cambiare la configurazione.
- Nel tuo file
docker.tf
, cambia la porta esterna del container da8080
a8081
:
- Applica la modifica:
Digita yes
quando richiesto per confermare.
Terraform elimina e ricrea il container con la nuova configurazione della porta.
- Verifica che il container sia stato sostituito con uno nuovo con la nuova configurazione:
Nota che l'ID container è cambiato. Poiché per modificare la configurazione della porta è stato necessario eliminare e ricreare il container, questo è completamente nuovo.
Elimina l'infrastruttura
Ora hai importato in Terraform il tuo container Docker e l'immagine utilizzata per crearlo.
- Elimina il container e l'immagine:
Digita yes
quando richiesto per confermare.
- Verifica che il container sia stato eliminato:
Limitazioni e altre considerazioni
Sono vari gli aspetti importanti da considerare per l'importazione di risorse in Terraform.
Il comando terraform import può conoscere solo lo stato attuale dell'infrastruttura segnalato dal provider Terraform. Non può sapere:
- Se l'infrastruttura funziona correttamente.
- L'intento dell'infrastruttura.
- Le modifiche apportate all'infrastruttura e non controllate da Terraform; ad esempio, lo stato del file system di un container Docker.
L'importazione comporta passaggi manuali che possono essere soggetti a errori, specie se chi importa le risorse non conosce il contesto e non sa quindi come e perché quelle risorse erano state inizialmente create.
L'importazione manipola il file di stato di Terraform; ti consigliamo di creare un backup prima di importare una nuova infrastruttura.
Il comando terraform import non rileva né genera relazioni nell'infrastruttura.
Terraform non rileva gli attributi predefiniti che non devono essere impostati nella tua configurazione.
Non tutti i provider e non tutte le risorse supportano il comando terraform import.
Quando un'infrastruttura è importata in Terraform, questo non significa che Terraform possa eliminarla e ricrearla. Ad esempio, l'infrastruttura importata potrebbe basarsi su un'altra infrastruttura o configurazione non gestita.
L'adesione alle best practice di Infrastructure as Code (IaC), come l'infrastruttura immutabile, può contribuire a evitare molti di questi problemi, ma è improbabile che un'infrastruttura creata manualmente sia conforme alle best practice di IaC.
Puoi utilizzare strumenti come Terraformer per automatizzare alcuni dei passaggi manuali associati all'importazione dell'infrastruttura. Tuttavia, questi strumenti non fanno parte di Terraform e non sono approvati o supportati da HashiCorp.
Complimenti!
In questo lab, hai imparato come gestire i backend e lo stato con Terraform. Hai creato backend locali e in Cloud Storage per gestire il tuo file di stato, hai aggiornato lo stato e importato la configurazione in Terraform. Hai quindi aggiornato e modificato manualmente la configurazione per gestire completamente il container Docker con Terraform.
Prossimi passi/Scopri di più
Dai uno sguardo ai link seguenti per esercitarti ulteriormente con Terraform:
- Hashicorp su Google Cloud Marketplace!
- Hashicorp Learn
- Community Terraform
- Esempi Terraform Google
Formazione e certificazione Google Cloud
… per utilizzare al meglio le tecnologie Google Cloud. I nostri corsi ti consentono di sviluppare competenze tecniche e best practice per aiutarti a metterti subito al passo e avanzare nel tuo percorso di apprendimento. Offriamo vari livelli di formazione, dal livello base a quello avanzato, con opzioni di corsi on demand, dal vivo e virtuali, in modo da poter scegliere il più adatto in base ai tuoi impegni. Le certificazioni ti permettono di confermare e dimostrare le tue abilità e competenze relative alle tecnologie Google Cloud.
Ultimo aggiornamento del manuale: 26 gennaio 2024
Ultimo test del lab: 11 dicembre 2023
Copyright 2024 Google LLC Tutti i diritti riservati. Google e il logo Google sono marchi di Google LLC. Tutti gli altri nomi di società e prodotti sono marchi delle rispettive società a cui sono associati.