Wie man Infrastrukturdaten mit Terraform-Ausgaben verwaltet

Einführung

Terraform-Ausgaben werden verwendet, um Informationen über die Infrastrukturressourcen aus dem Projektstatus zu extrahieren. Mit anderen Funktionen des Hashicorp Konfigurationssprachchens (HCL), das Terraform benutzt, können Ressourceninformationen abgerufen und in komplexere Datenstrukturen wie Listen und Maps transformiert werden. Ausgaben sind nützlich für den Austausch von Informationen mit externem Software, die auf der erstellten Infrastruktur arbeiten sollen. Im folgenden Tutorial lernst du die Syntax von Terraform-Ausgaben und ihre Parameter kennen, indem du ein einfaches Infrastrukturprojekt erstellen, das Droplets deployst. Außerdem konvertierst du die Ausgaben programmgestellt in JSON.

Voraussetzungen

Hinweis: Dieses Tutorial wurde speziell mit Terraform 1.0.2 getestet.

Ausgaben definieren

In diesem Abschnitt decken Sie einen Droplet ab, deployen es ins Cloud-Netzwerk und lernen Sie Ausgaben kennen, indem Sie eine definieren, die die IP-Adresse des Droplet anzeigen soll.

Aus dem als Voraussetzung erstellten Ordner terraform-outputs erstellen und öffnen Sie die Datei droplets.tf für Bearbeitung:

  1. nano droplets.tf

Fügen Sie dem folgenden Droplet-Ressource und Ausgabendefinition hinzu:

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
}

Um einen Droplet-Resource zu deklarieren, wird in der Cloud ein Droplet namens test-droplet mit dem Region fra1 und Ubuntu 20.04 festgelegt.

Sie definieren eine Ausgabe, die als droplet_ip_address bezeichnet wird. In Terraform werden Ausgaben verwendet, um intern und berechnete Werte und Informationen über die Ressourcen auszugeben. Hier setzen Sie den Parameter value, der die Daten zum Ausgaben接受. Bei der Deklaration ist es unklar, welcher IP-Adresse das Droplet zugewiesen wird, aber sie wird später verfügbar sein, nachdem das Droplet部署. Ausgaben werden nach jeder Deployment angezeigt.

Speichern und schließen Sie die Datei, und starten Sie das Projekt durch die folgende Befehle:

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

Wählen Sie ja aus, wenn Sie darauf gefragt werden. Die letzten Zeilen des Ergebnisses sind ähnlich wie diese:

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

Die hervorgehobene IP-Adresse gehört Ihrem neuen Deployed Droplet. Nach der Applikation des Projekts werden die Ausgaben am Ende angezeigt, wenn alle Ressourcenattribute verfügbar sind. Ohne die droplet_ip_address Ausgabe würden Terraform keine weiteren Informationen über das Droplet anzeigen, außer dass es deployt wurde.

Ausgaben können auch mit dem Befehl output angezeigt werden:

  1. terraform output

Der output zeigt alle outputs im Projekt an:

Output
droplet_ip_address = ip_address

Sie können auch eine bestimmte Ausgabe mittels eines Namen als Argument angeben:

  1. terraform output output_name

Für droplet_ip_address, die Ausgabe besteht nur aus der IP-Adresse:

Output
ip_address

Zusätzlich zu value, hat output einige optionale Parameter:

  • Beschreibung: Ein kurzes Dokumentations-Material, das detailliert erklärt, was die Ausgabe zeigt.
  • abhängig von: Ein Meta-Parameter, der bei jeder Ressource verfügbar ist und es erlaubt, explizit zu bestimmen, welche Ressourcen die Ausgabe von Terraform nicht automatisch während der Planung ableiten kann.
  • sensitiv: Akzeptiert einen booleschen Wert, der die Inhalte des Ausgabes unterbindet, sodass sie nach dem Deployment nicht angezeigt werden, falls sie auf true festgelegt sind.

Die sensitiv-Parameter ist nützlich, wenn die Logs der Terraform-Deployment öffentlich verfügbar sein werden, aber die Ausgaben geheim bleiben sollen. Du wirst sie jetzt zu deiner Droplet-Ressourcendefinition hinzufügen.

Öffne droplets.tf für Bearbeitung und füge die hervorgehobene Zeile hinzu:

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
}

Speicheln und schließen Sie das Datei, wenn du fertig bist. Deploy the project again by running:

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

Eingeben ja als Antwort, wenn dir eine Frage gestellt wird. Du siehst, dass die Ausgabe mit einem Einzelnachweis versehen ist:

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

Auch wenn sie als sensitiv markiert ist, ist sie über andere Kanale wie das Anzeigen des Terraform-States oder die Abfrage der Ausgaben direkt verfügbar.

Im nächsten Schritt erstellen Sie ein anderes Droplet und strukturieren Sie eine andere Ausgabestruktur, also zerstören Sie die aktuell部署ten durch:

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

Die letzte Ausgabe am Ende wird sein:

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

Du hast ein Droplet definiert und eine Ausgabe erstellt, die seine IP-Adresse zeigt. Du lernst nun mehr über die Verwendung von Ausgaben, um komplexere Strukturen wie Listen und Maps anzuzeigen.

Erstellung komplexer Strukturen

In diesem Abschnitt verwenden Sie den Schlüsselwort count, um mehrere Droplets aus der gleichen Definition zu erstellen und geben Sie verschiedene Formatierungen für ihre IP-Adressen an.

Verwendung des for-Loop

Sie müssen die Ressourcendefinition der Droplet bearbeiten, damit sie wie folgt aussehen:

  1. nano droplets.tf

Modifizieren Sie sie so, dass sie wie folgt aussehen:

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"
}

Sie haben festgelegt, dass drei Droplets mit dem Schlüssel count erstellt werden sollen und den aktuellen Index zur Droplet-Namenserweiterung hinzugefügt, damit Sie später zwischen ihnen unterscheiden können. Entfernen Sie das vorhandene Ausgabestück unterhalb. Wenn Sie fertig sind, speichern und schließen Sie die Datei.

Die Code durchführen indem Sie folgendes ausführen:

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

Terraform wird die Erstellung von drei Nummerierten Droplets planen, genannt test-droplet-0, test-droplet-1, und test-droplet-2. Antworten Sie ja wenn Sie darauf gefragt werden, um den Prozess zu beenden. Am Ende sehen Sie folgende Ausgabe:

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

Dies bedeutet, dass alle drei Droplets erfolgreich erstellt wurden und alle Informationen über sie in das Projektstate gespeichert sind.

Der einfachste Weg, um auf die Eigenschaften ihrer Ressourcen zuzugreifen, besteht darin, Outputs zu verwenden. Allerdings ist es nicht skalierbar, einen Output für jeden Droplet zu erstellen. Die Lösung besteht darin, den for Loop zu verwenden, um durch die Liste der Droplets zu gehen und ihre Eigenschaften zusammenzusammeln oder alternativ splat Ausdrücke (über die du später in diesem Schritt lernst) zu verwenden.

Du beginnst damit, ein Output zu definieren, das die IP-Adressen der drei Droplets mit ihren Namen ausgibt. Öffne droplets.tf zum Bearbeiten:

  1. nano droplets.tf

Füge die folgenden Zeilen hinzu:

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
  }
}

Der Wert des Outputs droplet_ip_addresses wird mithilfe eines for Loops erstellt. Da er von Klammern umschlossen ist, wird die resultierende Art ein Map sein. Der Loop durchläuft die Liste der Droplets und für jede Instanz wird ihr Name mit ihrer IP-Adresse zusammengebunden und zur resultierenden Map hinzugefügt.

Speichere und schließe die Datei, dann aktualisiere das Projekt erneut:

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

Gib yes ein, wenn du davon abgefragt wirst, und du erhälst am Ende die Inhalte des Outputs:

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" }

Der Output droplet_ip_addresses zeigt die IP-Adressen der drei bereitgestellten Droplets auf.

Mit dem Terraform output Befehl kannst du die Inhalte des Outputs als JSON mit seinem Befehlsargument abrufen:

  1. terraform output -json droplet_ip_addresses

Das Ergebnis wird ähnlich dem folgenden sein:

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

JSON-Verarbeitung ist weit verbreitet und in vielen Programmiersprachen unterstützt. Auf diese Weise kannst du programmatisch die Informationen über die bereitgestellten Droplet-Ressourcen parsen.

Using Splat Expressions

Splat-Expressionen bieten eine kompakte Methode zur Iteration über alle Elemente einer Liste und zum Sammeln des Inhalts eines Attributs von jedem davon, resultierend in einer Liste. Eine Splat-Expression, die die IP-Adressen der drei deployierten Droplet auswählen würde, hat folgende Syntax:

digitalocean_droplet.web[*].ipv4_address

Die [*]-Symbol trauert über das Element links und für jede der Elemente, nimmt es den Inhalt des auf der rechten angegebenen Attributs. Wenn die Referenz links nicht selbst eine Liste ist, wird sie in eine sein, in der sie das einzige Element ist.

Sie können droplets.tf öffnen und die folgenden Zeilen so modifizieren, dass Sie dies umsetzen:

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
}

Nachdem Sie das Datei gespeichert haben, können Sie das Projekt durch die folgende Befehlssatz ausführen:

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

Sie erhalten als Ausgabe jetzt eine Liste, die nur die IP-Adressen der Droplet enthält:

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

Um die Ausgabe als JSON zu erhalten, führen Sie die folgende Befehlszeile aus:

  1. terraform output -json droplet_ip_addresses

Die Ausgabe wird nun eine einzelne Array sein:

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

Sie haben Outputs zusammen mit Splat-Expressionen und for-Loop verwendet, um die IP-Adressen der部署ten Droplet auszugeben. Sie haben auch den Inhalt als JSON erhalten und werden nun jq – ein Tool benutzen, um dynamisch nach gegebenen Expressiven JSON zu filtern – um sie zu parsen.

Parsing Ausgaben mit jq

In diesem Schritt installieren und lernen Sie die Grundlagen von jq, einem Werkzeug zur Manipulation von JSON-Dokumenten. Sie verwenden es, um die Ausgaben Ihres Terraform-Projekts zu analysieren.

Für Ubuntu können Sie folgendes Kommando ausführen, um jq installieren:

  1. sudo snap install jq

Auf macOS können Sie Homebrew verwenden, um es installieren:

  1. brew install jq

jq wendet die angegebene Bearbeitungsausdrucksatz auf das angegebene Eingabeobjekt an, das über PIPE eingefügt werden kann. Die einfachste Aufgabe von jq ist, die Eingabe ohne Modifikationen auszugeben:

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

Die Anwendung des Identitätst operators (.) bedeutet, dass das ganze JSON-Dokument, das vom Eingabeobjekt gelesen wurde, ohne Modifikationen ausgegeben werden sollte:

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

Sie können einen einzelnen IP-Adressen anfordern, indem sie eine Array-Notation mit der Zählung von Null anwenden:

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

Die Ausgabe wird sein:

Output
"second_ip_address"

Um nur den zweiten IP-Adressen zu erhalten, geben Sie die Array-Brackets ein:

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

Sie erhalten eine schön formatierte JSON-Array-Ausgabe:

Output
[ "second_ip_address" ]

Sie können Teile von Arrays anstatt Einzelelemente abfragen, indem Sie eine Range von Indexen innerhalb der Brackets angeben:

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

Die Ausgabe wird sein:

Output
[ "first_ip_address", "second_ip_address" ]

Die Bereichsangabe 0..2 liefert die ersten zwei Elemente – der obere Teil des Bereichs (2) ist nicht inklusive, daher werden nur die Elemente an den Positionen 0 und 1 abgerufen.

Sie können nun die bereitgestellten Ressourcen durch folgendes Befehl zerstören:

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

In diesem Schritt haben Sie jq installiert und es verwendet um die Ausgaben Ihres Terraform-Projektes zu parsen und manipulieren, das drei Droplet einrichtet.

Zusammenfassung

Sie haben gelernt, wie Sie Terraform-Ausgaben verwenden, um Details über die bereitgestellten Ressourcen anzuzeigen und Datenstrukturen für später externe Bearbeitung auszugeben. Sie haben auch die Ausgaben verwendet, um Attribute eines einzelnen Ressourcens anzuzeigen sowie für die Darstellung von Maps und Listen, die aufgebaut sind aus Ressourcenattributen.

Für mehr detaillierte Informationen über die Funktionen von jq, besuchen Sie die offizielle Dokumentation.

Dieser Tutorial ist Teil der How To Manage Infrastructure with Terraform -Reihe. Die Reihe behandelt eine Vielzahl von Terraform-Themen, vom Installieren von Terraform zum erstmaligen Management komplexer Projekte.

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