Come gestire i dati di infrastruttura con le uscite di Terraform

Introduzione

Le uscite di Terraform vengono utilizzate per estrarre informazioni relative ai risorse dell’infrastruttura dallo stato del progetto. Utilizzando altre funzioni del linguaggio di configurazione Hashicorp (HCL), che Terraform utilizza, è possibile interrogare e trasformare le informazioni relative ai risorse in strutture dati più complesse, come ad esempio liste e mappe. Le uscite sono utili per fornire informazioni a software esterni, che può operare sulle risorse di infrastruttura create.

In questo tutorial, imparerete sulla sintassi delle uscite di Terraform e sui suoi parametri creando una semplice infrastruttura che deploy Droplet. Imparerete anche a parsare le uscite in modo programmatico convertendole in JSON.

Prerequisiti

Nota: questo tutorial è stato testato specificamente con Terraform 1.0.2.

Defining Outputs

In questa sezione, dichiarare un Droplet, distribuirlo in cloud, e imparare riguardo le output definendo una che mostrerà l’indirizzo IP del Droplet.

Dalla directory terraform-outputs creata come requisito preliminare, crea e apri il file droplets.tf per la modifica:

  1. nano droplets.tf

Aggiungi il seguente risorsa Droplet e definizione di output:

terraform-outputs/droplets.tf
resource "digitalocean_droplet" "web" {
  image  = "ubuntu-20-04-x64"
  name   = "test-droplet"
  region = "fra1"
  size   = "s-1vcpu-1gb"
}

output "droplet_ip_address" {
  value = digitalocean_droplet.web.ipv4_address
}

Il primo passaggio è quello di dichiarare un risorsa Droplet chiamata web. Il suo nome effettivo nel cloud sarà test-droplet, nella regione fra1, su Ubuntu 20.04.

Poi, dichiari un’output chiamato droplet_ip_address. Nella Terraform, le output sono usate per esportare e mostrare valori e informazioni sulle risorse interni e calcolati. Qui, imposti il parametro value, che accetta l’indirizzo IP della risorsa Droplet dichiarata. All’ora della dichiarazione, non è noto, ma diventerà disponibile una volta che la risorsa sia deployata. I output sono mostrati e accessibili dopo ogni deploy.

Salva e chiudi il file, poi deploy il progetto eseguendo il seguente comando:

  1. terraform apply -var "do_token=${DO_PAT}"

Inserisci si quando viene richiesto. L’output finale sarà simile a questo:

Output
... digitalocean_droplet.web: Creating... ... digitalocean_droplet.web: Creation complete after 32s [id=207631771] Apply complete! Resources: 1 added, 0 changed, 0 destroyed. Outputs: droplet_ip_address = ip_address

L’indirizzo IP evidenziato appartiene alla nuova risorsa Droplet deployata. Al termine dell’output verranno mostrate le informazioni sugli output, quando tutti i parametri delle risorse saranno disponibili. Senza l’output droplet_ip_address, Terraform mostrera solo che la risorsa Droplet è stata deployata.

I output possono anche essere mostrati usando il comando output:

  1. terraform output

Il output mostra tutti gli outputs del progetto:

Output
droplet_ip_address = ip_address

Puoi anche interrogare un output specifico usando come argomento il suo nome:

  1. terraform output output_name

Per droplet_ip_address, l’output consistera solo dell’indirizzo IP:

Output
ip_address

Esiste anche un numero di parametri opzionali aggiuntivi per outputs:

  • Il description è un parametro di meta che consente di specificare brevi documentazioni sul cosa mostra l’output.
  • depends_on: un parametro disponibile per ogni risorsa che permette di esplicitamente specificare le risorse su cui l’output dipende che Terraform non può automaticamente dedurre durante la pianificazione.
  • sensitive: accetta un valore booleano, che impedisce che il contenuto dell’output sia mostrato dopo la deploy della configurazione se impostato a true.

Il parametro sensitive è utile quando i log del deploy di Terraform saranno pubblicamente disponibili, ma il contenuto dell’output dovrebbe rimanere nascosto. Aggiungerai questo alla definizione delle risorse del Droplet.

Apri droplets.tf per modificarlo e aggiungi la riga evidenziata:

terraform-outputs/droplets.tf
resource "digitalocean_droplet" "web" {
  image  = "ubuntu-20-04-x64"
  name   = "test-droplet"
  region = "fra1"
  size   = "s-1vcpu-1gb"
}

output "droplet_ip_address" {
  value      = digitalocean_droplet.web.ipv4_address
  sensitive = true
}

Salva e chiudi il file quando hai finito. Deploy the project again by running:

  1. terraform apply -var "do_token=${DO_PAT}"

Entra yes quando viene chiesto. Vedrete che l’output è redatto:

Output
... Apply complete! Resources: 0 added, 0 changed, 0 destroyed. Outputs: droplet_ip_address = <sensitive>

Anche se è marcato come sensitive, l’output e i suoi contenuti saranno ancora disponibili attraverso altri canali, come visualizzare lo stato di Terraform o interrogare direttamente le output.

Nel prossimo passo, creerai un Droplet differente e una struttura di output diversa, quindi distruggere i Droplet attualmente deployati eseguendo:

  1. terraform destroy -var "do_token=${DO_PAT}"

L’output all’ultimo verra:

Output
... Destroy complete! Resources: 1 destroyed.

Hai dichiarato e deployato un Droplet e creato un output che mostra l’IP del suo host. Ora impararerai ad usare le output per mostrare strutture più complesse come liste e mappe.

Risultati complessi

Nel presente sezionee vedrete come utilizzare la parola chiave count per deployare più Droplets dalla stessa definizione e mostrarli nell’output in diverse formattazioni.

Utilizzando il ciclo for

Prima di tutto dovrete modificare la definizione risorse Droplet, quindi apri la finestra di edizione:

  1. nano droplets.tf

Modificala così:

terraform-outputs/droplets.tf
resource "digitalocean_droplet" "web" {
  count  = 3
  image  = "ubuntu-20-04-x64"
  name   = "test-droplet-${count.index}"
  region = "fra1"
  size   = "s-1vcpu-1gb"
}

Hai specificato che debbiano essere creati tre Droplet usando la chiave count e hai aggiunto l’indice corrente al nome del Droplet, così potete distinguere tra loro in futuro. Rimuovere l’output esistente sotto. Quando avete finito, salvare e chiudere il file.

Aggiungi la codifica facendo:

  1. terraform apply -var "do_token=${DO_PAT}"

Terraform verrà pianificato il creazione dei tre Droplet numerati chiamati test-droplet-0, test-droplet-1, e test-droplet-2. Entra quando vi sarà richiesto di terminare il processo. Vedrete poi l’output alla fine:

Output
... Apply complete! Resources: 3 added, 0 changed, 0 destroyed.

Questo significa che i tre Droplet sono stati deployati con successo e che tutte le informazioni su di loro sono state salvate nel progetto dello stato.

Il modo più semplice per accedere ai risultati dell’attributo di un risorsa è l’uso delle output, ma crearne uno per ogni Droplet non è scalabile. La soluzione è usare il ciclo for per iterare attraverso la lista dei Droplet e raccogliere le loro proprietà, oppure alternativamente usare le espressioni splat (che verranno spiegati più tardi in questo passaggio).

Prima di tutto definisci un output che mostrera i prefissi IP degli tre Droplet, associati al loro nome. Apri droplets.tf per modificarlo:

  1. nano droplets.tf

Aggiungi le seguenti linee:

terraform-outputs/droplets.tf
resource "digitalocean_droplet" "web" {
  count  = 3
  image  = "ubuntu-20-04-x64"
  name   = "test-droplet-${count.index}"
  region = "fra1"
  size   = "s-1vcpu-1gb"
}

output "droplet_ip_addresses" {
  value = {
    for droplet in digitalocean_droplet.web:
    droplet.name => droplet.ipv4_address
  }
}

Il valore dell’output droplet_ip_addresses è costruito usando un ciclo for. Perché è racchiuso tra parentesi, il risultato sarà una mappa. Il loop si sviluppa su ogni istanza del Droplet e per ogni istanza, associa il suo prefisso IP con il suo nome e lo aggiunge alla mappa risultante.

Salva e chiudi il file, quindi applica nuovamente il progetto:

  1. terraform apply -var "do_token=${DO_PAT}"

Inserisci quando viene chiesto e riceverai i contenuti dell’output alla fine:

Output
Apply complete! Resources: 0 added, 0 changed, 0 destroyed. Outputs: droplet_ip_addresses = { "test-droplet-0" = "ip_address" "test-droplet-1" = "ip_address" "test-droplet-2" = "ip_address" }

I dettagli dell’output droplet_ip_addresses mostreranno gli indirizzi IP dei tre droplet deployati.

Usando il comando output di Terraform puoi ottenere i contenuti dell’output come JSON usando il parametro comandi:

  1. terraform output -json droplet_ip_addresses

Il risultato sarà simile al seguente:

Output
{"test-droplet-0":"ip_address","test-droplet-1":"ip_address","test-droplet-2":"ip_address"}

L’analisi JSON è ampiamente utilizzata e supportata in molti linguaggi di programmazione. In questo modo, puoi analizzare informazioni sulle risorse deployate tramite programmazione.

Utilizzando le espressioni di split

Le espressioni di split offrono un modo compatto per iterare su tutti gli elementi di una lista e raccogliere i contenuti dell’attributo da ognuno di loro, risultando in una lista. Un’espressione di split che estrairebbe le IP degli altri tre droplet deployati avrebbe la seguente sintassi:

digitalocean_droplet.web[*].ipv4_address

Il simbolo [*] viaggia tra la lista a sinistra e per ogni elemento di essa, prende il contenuto dell’attributo specificato sul lato destro. Se la referenza a sinistra non è una lista, verrà convertita in una dove sarà l’elemento solo.

Puoi aprire droplets.tf per modificarle e modificare le seguenti linee per implementare questo:

terraform-outputs/droplets.tf
resource "digitalocean_droplet" "web" {
  count  = 3
  image  = "ubuntu-20-04-x64"
  name   = "test-droplet-${count.index}"
  region = "fra1"
  size   = "s-1vcpu-1gb"
}

output "droplet_ip_addresses" {
  value = digitalocean_droplet.web[*].ipv4_address
}

Dopo aver salvato il file, applica il progetto eseguendo il comando seguente:

  1. terraform apply -var "do_token=${DO_PAT}"

Riceverai un’output che ora è una lista, che contiene solo le IP address dei Droplet deployati:

Output
... Apply complete! Resources: 0 added, 0 changed, 0 destroyed. Outputs: droplet_ip_addresses = [ "ip_address", "ip_address", "ip_address", ]

Per ricevere l’output come JSON, eseguire il seguente comando:

  1. terraform output -json droplet_ip_addresses

L’output sarà un singolo array:

Output
["ip_address","ip_address","ip_address"]

Hai usato insieme le output con le espressioni di split e le for loop per esportare le IP degli altri Droplet deployati. Hai anche ricevuto il contenuto come JSON e ora usare jq – un strumento per filtrare dinamicamente il JSON secondo le espressioni dato – per analizzarli.

Risultati di analisi utilizzando jq

Nel passo successivo, installerai e impareranno le basi del tool jq, che è un’utensilistica per manipolare i documenti JSON. Usherài jq per analizzare i risultati del progetto di Terraform.

Se sei su Ubuntu, eseguire il comando seguente per installare jq:

  1. sudo snap install jq

Sul MacOS, puoi usarlo Homebrew per installarlo:

  1. brew install jq

jq applica l’espressione di elaborazione fornita su input ricevuto e può essere eseguito tramite una pipe. L’operatore identità (.) significa che tutto il documento JSON parsato dall’input dovrà essere stampato senza modifiche:

  1. terraform output -json droplet_ip_addresses | jq '.'

Passando l’operatore identità (.) significa che tutto il documento JSON parsato dall’input dovrebbe essere outputtto senza modifiche:

Output
[ "first_ip_address", "second_ip_address", "third_ip_address" ]

Tu potresti richiedere solo l’indirizzo IP secondario usando la notazione dell’array, contando da zero:

  1. terraform output -json droplet_ip_addresses | jq '.[1]'

L’output sarà:

Output
"second_ip_address"

Puoi richiedere solo il secondo indirizzo IP usando la notazione dell’array, contando da zero:

  1. terraform output -json droplet_ip_addresses | jq '[.[1]]'

Il risultato dell’espressione di elaborazione sarà un array, racchiudere l’espressione all’interno di parentesi:

Output
[ "second_ip_address" ]

Tu ottieni un array JSON stampato con bellezza:

  1. terraform output -json droplet_ip_addresses | jq '.[0:2]'

Puoi recuperare parti di array invece di elementi singoli specificando un intervallo di indici all’interno delle parentesi:

Output
[ "first_ip_address", "second_ip_address" ]

Il range 0:2 restituisce i primi due elementi — l’upper parte del range (2) non è inclusiva, quindi solo gli elementi all’interno delle posizioni 0 e 1 sono estratti.

Ora puoi distruggere le risorse deployate eseguendo:

  1. terraform destroy -var "do_token=${DO_PAT}"

Nel passo precedente, hai installato jq e lo hai usato per analizzare e manipolare l’output del tuo progetto Terraform, che deploya tre Droplet.

Conclusione

Hai appreso come usare le output di Terraform, utilizzandole per mostrare dettagli sulle risorse deployate e per esportare strutture dati costruite per ulteriori elaborazioni esterni. Hai anche usato le output per mostrare attributi di un singolo risorsa, così come per mostrare mappe e liste contenenti attributi delle risorse.

Per informazioni più dettagliate sui caratteristiche di jq, visita il sito web ufficiale.

Questo tutorial fa parte della serie Come Gestire Infrastruttura con Terraform . La serie copre un numero di argomenti su Terraform, dall’installazione di Terraform per la prima volta alla gestione di progetti complessi.

Source:
https://www.digitalocean.com/community/tutorials/how-to-manage-infrastructure-data-with-terraform-outputs