Wie man Terraform mit seinem Team verwendet

Der Autor hat den Free and Open Source Fund ausgewählt, um eine Spende im Rahmen des Write for DOnations-Programms zu erhalten.

Einführung

Wenn mehrere Personen gleichzeitig an demselben Terraform-Projekt aus verschiedenen Standorten arbeiten, ist es wichtig, den Infrastrukturcode und den Projektstatus korrekt zu verwalten, um Überschreibungsfehler zu vermeiden. Die Lösung besteht darin, den Status remote anstatt lokal zu speichern. Ein Remote-System steht allen Mitgliedern Ihres Teams zur Verfügung, und es ist möglich, den Status zu sperren, während sie arbeiten.

Ein solches Remote-Backend ist pg, das den Status in einer PostgreSQL-Datenbank speichert. Im Verlauf dieses Tutorials verwenden Sie es mit einer DigitalOcean Managed Database, um die Datenverfügbarkeit sicherzustellen.

Terraform unterstützt auch das offizielle, von Hashicorp verwaltete Cloud-Angebot namens Terraform Cloud—eine proprietäre Anwendung, die die Arbeit Ihres Teams an einem Ort synchronisiert und eine Benutzeroberfläche für Konfiguration und Verwaltung bietet.

In diesem Tutorial erstellen Sie eine Organisation in Terraform Cloud, mit der Sie Ihr Projekt verbinden. Anschließend verwenden Sie Ihre Organisation, um Workspaces und Ressourcen einzurichten. Sie werden Ihren Status in der verwalteten Cloud speichern, sodass er immer verfügbar ist. Sie richten auch das pg-Backend mit einer begleitenden verwalteten PostgreSQL-Datenbank ein.

Voraussetzungen

  • A DigitalOcean Personal Access Token, which you can create via the DigitalOcean Control Panel. You can find instructions in the DigitalOcean product documents, How to Create a Personal Access Token.
  • Terraform auf Ihrem lokalen Rechner installiert. Führen Sie Schritt 1 des Tutorials „Wie man Terraform mit DigitalOcean verwendet“ abgeschlossen.
  • Wenn Sie ein pg-Backend verwenden möchten, benötigen Sie einen erstellten und zugänglichen Managed PostgreSQL-Datenbankcluster. Weitere Informationen finden Sie im Schnellstartleitfaden. Sie können für dieses Tutorial eine separate Datenbank verwenden.
  • Wenn Sie die verwaltete Cloud von Hashicorp verwenden möchten, benötigen Sie ein Konto bei Terraform Cloud. Sie können eines auf ihrer Anmeldeseite erstellen.

Hinweis: Wir haben dieses Tutorial speziell mit Terraform 1.1.3 getestet.

Speichern des Zustands in einer verwalteten PostgreSQL-Datenbank

In diesem Abschnitt richten Sie ein Projekt ein, das einen Droplet bereitstellt und den Zustand in einer DigitalOcean Managed PostgreSQL-Datenbank mithilfe des pg-Anbieters speichert. Dieser Anbieter unterstützt Zustandssperren, sodass der Zustand niemals von zwei oder mehr gleichzeitig auftretenden Änderungen überschrieben wird.

Beginnen Sie mit dem Erstellen eines Verzeichnisses mit dem Namen terraform-team-pg, in dem Sie das Projekt speichern:

  1. mkdir ~/terraform-team-pg

Navigieren Sie dazu:

  1. cd ~/terraform-team-pg

Zuerst definieren Sie den Anbieter und geben dann die Verbindungszeichenfolge für die Datenbank und das digitalocean-Modul an. Erstellen und öffnen Sie provider.tf zum Bearbeiten:

  1. nano provider.tf

Fügen Sie die folgenden Zeilen hinzu:

~/terraform-team-pg/provider.tf
terraform {
  required_providers {
    digitalocean = {
      source = "digitalocean/digitalocean"
      version = "~> 2.0"
    }
  }

  backend "pg" {
    conn_str = "your_db_connection_string"
  }
}

variable "do_token" {}

provider "digitalocean" {
  token = var.do_token
}

Hier benötigen Sie den digitalocean-Anbieter und definieren das pg-Backend, das eine Verbindungszeichenfolge akzeptiert. Anschließend definieren Sie die Variable do_token und übergeben sie an die Instanz des digitalocean-Anbieters.

Denken Sie daran, Ihre_db_Verbindungszeichenfolge durch die Verbindungszeichenfolge für Ihre verwaltete Datenbank aus Ihrem DigitalOcean Control Panel zu ersetzen, die Sie finden können, indem Sie auf Aktionen klicken, Verbindungsdetails auswählen und Verbindungszeichenfolge aus dem Dropdown-Menü wählen. Speichern und schließen Sie dann die Datei

Warnung: Um fortzufahren, stellen Sie in den Einstellungen Ihrer Datenbank sicher, dass die IP-Adresse der Maschine, von der aus Sie Terraform ausführen, in einer Zulassungsliste enthalten ist.

Initialisieren Sie das Projekt, indem Sie Folgendes ausführen:

  1. terraform init

Die Ausgabe wird ähnlich wie folgt sein:

Output
Initializing the backend... Successfully configured the backend "pg"! Terraform will automatically use this backend unless the backend configuration changes. Initializing provider plugins... - Finding digitalocean/digitalocean versions matching "~> 2.0"... - Installing digitalocean/digitalocean v2.16.0... - Installed digitalocean/digitalocean v2.16.0 (signed by a HashiCorp partner, key ID F82037E524B9C0E8) Partner and community providers are signed by their developers. If you'd like to know more about provider signing, you can read about it here: https://www.terraform.io/docs/cli/plugins/signing.html Terraform has created a lock file .terraform.lock.hcl to record the provider selections it made above. Include this file in your version control repository so that Terraform can guarantee to make the same selections by default when you run "terraform init" in the future. Terraform has been successfully initialized! ...

Terraform hat die Backend-Initialisierung erfolgreich abgeschlossen, was bedeutet, dass es eine Verbindung zur Datenbank hergestellt hat.

Definieren Sie als nächstes den Droplet in einer Datei namens droplets.tf. Erstellen und öffnen Sie diese zum Bearbeiten, indem Sie Folgendes ausführen:

  1. nano droplets.tf

Fügen Sie die folgenden Zeilen hinzu:

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

Dieser Code wird einen Droplet namens web-1 in der Region fra1 bereitstellen, der Ubuntu 20.04 mit 1 GB RAM und einem CPU-Kern ausführt. Das ist alles, was Sie definieren müssen, also speichern und schließen Sie die Datei.

Sie benötigen Ihr DigitalOcean-Token in einer Umgebungsvariable. Erstellen Sie eine, ersetzen Sie Ihr_do_token durch Ihr Token:

  1. export DO_PAT="your_do_token"

Um zu überprüfen, ob die Verbindung zur Datenbank funktioniert, versuchen Sie, die Konfiguration zu planen:

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

Die Ausgabe wird ähnlich wie folgt sein:

Output
Terraform used the selected providers to generate the following execution plan. Resource actions are indicated with the following symbols: + create Terraform will perform the following actions: # digitalocean_droplet.web wird erstellt werden + resource "digitalocean_droplet" "web" { + backups = false + created_at = (known after apply) + disk = (known after apply) + graceful_shutdown = false + id = (known after apply) + image = "ubuntu-20-04-x64" + ipv4_address = (known after apply) + ipv4_address_private = (known after apply) + ipv6 = false + ipv6_address = (known after apply) + locked = (known after apply) + memory = (known after apply) + monitoring = false + name = "web-1" + price_hourly = (known after apply) + price_monthly = (known after apply) + private_networking = (known after apply) + region = "fra1" + resize_disk = true + size = "s-1vcpu-1gb" + status = (known after apply) + urn = (known after apply) + vcpus = (known after apply) + volume_ids = (known after apply) + vpc_uuid = (known after apply) } Plan: 1 to add, 0 to change, 0 to destroy. ...

Terraform meldete keine Fehler und plante die Aktionen wie üblich. Es hat erfolgreich eine Verbindung zu Ihrer PostgreSQL-Datenbank hergestellt und ihren Status gespeichert. Mehrere Personen können nun gleichzeitig an diesem Projekt arbeiten, während das Projekt synchronisiert bleibt.

Speichern des Status in Terraform Cloud

In diesem Schritt erstellen Sie ein Projekt, das einen Droplet bereitstellt und den Terraform Cloud als Backend mit dem cloud-Anbieter verwendet. Dies umfasst die Erstellung der Organisation und des Arbeitsbereichs in Terraform Cloud, das Schreiben des Infrastrukturcodes und das Planen.

Erstellen einer Organisation

Terraform Cloud ermöglicht es Ihnen, mehrere Organisationen zu haben, die Ihre Arbeitsbereiche und Module beherbergen. Bezahlte Organisatioenen können mehrere Teams mit Zugriffssteuerungsfunktionen haben, während der kostenlose Plan, den Sie verwenden werden, nur ein Team pro Organisation bietet. Sie können Teammitglieder einladen, der Organisation beizutreten.

Gehen Sie zuerst zu Terraform Cloud und melden Sie sich an. Wenn Sie noch keine Organisation erstellt haben, werden Sie dazu aufgefordert.

Geben Sie einen Organisation-Namen Ihrer Wahl ein und denken Sie daran, dass er eindeutig sein muss und unter allen Namen in Terraform Cloud einzigartig sein muss. Sie erhalten einen Fehler, wenn der Name bereits existiert. Die E-Mail-Adresse sollte bereits mit der Adresse Ihres Kontos ausgefüllt sein. Wenn Sie fertig sind, klicken Sie auf die Organisation erstellen-Schaltfläche, um fortzufahren.

Es wird Sie dann bitten, den Typ des Workspaces auszuwählen.

Weil Sie mit Terraform Cloud über die Befehlszeile interagieren werden, klicken Sie auf die Option CLI-gesteuerter Workflow. Geben Sie dann einen Namen für Ihren Workspace ein und lassen Sie die Beschreibung leer.

Geben Sie einen Workspace-Namen Ihrer Wahl ein (wir nennen ihn sammy), klicken Sie dann auf Workspace erstellen, um den Organisationserstellungsprozess abzuschließen. Sie werden dann zu einer Workspace-Einstellungsseite weitergeleitet.

Sie haben nun Ihren Workspace erstellt, der Teil Ihrer Organisation ist. Da Sie ihn gerade erstellt haben, enthält Ihr Workspace keinen Infrastrukturcode. In der Mitte der Benutzeroberfläche gibt Ihnen Terraform Cloud Startanweisungen für die Verbindung zu diesem Workspace.

Bevor Sie sich damit verbinden, müssen Sie die Version von Terraform konfigurieren, die die Cloud verwenden wird, um Ihre Befehle auszuführen. Um dies einzustellen, klicken Sie auf das Dropdown-Menü Einstellungen neben Übersicht und wählen Sie Allgemein aus der Liste aus. Wenn die Seite geöffnet ist, navigieren Sie zum Dropdown-Menü Terraform-Version und wählen Sie 1.1.3 (für dieses Tutorial) aus.

Dann klicken Sie auf die Schaltfläche Einstellungen speichern, um die Änderungen zu speichern.

Um Ihr Projekt mit Ihrer Organisation und Ihrem Arbeitsbereich zu verbinden, müssen Sie sich zunächst über die Befehlszeile anmelden. Bevor Sie den Befehl ausführen, navigieren Sie zur Token-Seite, um ein neues Zugriffstoken für Ihren Server zu erstellen, das Zugriff auf Ihr Konto ermöglicht. Sie erhalten eine Aufforderung zur Erstellung eines API-Tokens.

Die Standardbeschreibung ist in Ordnung, also klicken Sie auf API-Token erstellen, um es zu erstellen.

Klicken Sie auf den Token-Wert oder das Symbol daneben, um den API-Token zu kopieren. Sie verwenden diesen Token, um Ihr Projekt mit Ihrem Terraform Cloud-Konto zu verbinden.

Führen Sie in der Befehlszeile den folgenden Befehl aus, um sich anzumelden:

  1. terraform login

Sie erhalten die folgende Ausgabe:

Output
Terraform will request an API token for app.terraform.io using your browser. If login is successful, Terraform will store the token in plain text in the following file for use by subsequent commands: /home/sammy/.terraform.d/credentials.tfrc.json Do you want to proceed? Only 'yes' will be accepted to confirm. ...

Terraform warnt Sie davor, dass der Token lokal gespeichert wird. Geben Sie yes ein, wenn Sie dazu aufgefordert werden:

Output
--------------------------------------------------------------------------------- Open the following URL to access the tokens page for app.terraform.io: https://app.terraform.io/app/settings/tokens?source=terraform-login --------------------------------------------------------------------------------- Generate a token using your browser, and copy-paste it into this prompt. Terraform will store the token in plain text in the following file for use by subsequent commands: /home/sammy/.terraform.d/credentials.tfrc.json Token for app.terraform.io: Enter a value:

Fügen Sie den kopierten Token ein und bestätigen Sie mit ENTER. Terraform zeigt eine Erfolgsmeldung an:

Output
... - ----- - --------- -- --------- - ----- --------- ------ ------- ------- --------- ---------- ---- ---------- ---------- -- ---------- ---------- Welcome to Terraform Cloud! - ---------- ------- --- ----- --- Documentation: terraform.io/docs/cloud -------- - ---------- ---------- --------- ----- - New to TFC? Follow these steps to instantly apply an example configuration: $ git clone https://github.com/hashicorp/tfc-getting-started.git $ cd tfc-getting-started $ scripts/setup.sh

Sie haben Ihre lokale Terraform-Installation konfiguriert, um auf Ihr Terraform Cloud-Konto zuzugreifen. Jetzt erstellen Sie ein Projekt, das ein Droplet bereitstellt, und konfigurieren es so, dass es Terraform Cloud verwendet, um seinen Status zu speichern.

Einrichten des Projekts

Zuerst erstellen Sie ein Verzeichnis namens terraform-team-cloud, in dem Sie das Projekt speichern:

  1. mkdir ~/terraform-team-cloud

Navigieren Sie dorthin:

  1. cd ~/terraform-team-cloud

Um Ihr Projekt einzurichten, müssen Sie:

  • den cloud-Anbieter definieren und konfigurieren, der mit Terraform Cloud interagiert.
  • den digitalocean-Anbieter benötigen, um DigitalOcean-Ressourcen bereitzustellen.
  • Variablen definieren und initialisieren, die Sie verwenden werden.

Sie speichern die Spezifikationen für Anbieter und Module in einer Datei namens provider.tf. Erstellen Sie sie und öffnen Sie sie zur Bearbeitung, indem Sie folgendes ausführen:

  1. nano provider.tf

Fügen Sie die folgenden Zeilen hinzu:

~/terraform-team-cloud/provider.tf
terraform {
  required_providers {
    digitalocean = {
      source = "digitalocean/digitalocean"
      version = "~> 2.0"
    }
  }

  cloud {
    organization = "your_organization_name"

    workspaces {
      name = "your_workspace_name"
    }
  }
}

variable "do_token" {}

provider "digitalocean" {
  token = var.do_token
}

Hier geben Sie zunächst Ihre Terraform-Version an. Anschließend geben Sie den digitalocean-Anbieter als erforderlich an und setzen das Backend auf cloud. Ersetzen Sie für organization und workspaces.name die hervorgehobenen Werte durch die von Ihnen angegebenen Namen.

Dann definieren Sie eine Variable namens do_token, die Sie an den erstellten digitalocean-Anbieter übergeben. Sie haben Ihr Projekt nun so konfiguriert, dass es sich mit Ihrer Organisation verbindet. Speichern Sie die Datei und schließen Sie sie.

Initialisieren Sie Ihr Projekt mit folgendem Befehl:

  1. terraform init

Die Ausgabe wird ähnlich sein wie diese:

Output
Initializing Terraform Cloud... Initializing provider plugins... - Finding digitalocean/digitalocean versions matching "~> 2.0"... - Installing digitalocean/digitalocean v2.18.0... - Installed digitalocean/digitalocean v2.18.0 (signed by a HashiCorp partner, key ID F82037E524B9C0E8) Partner and community providers are signed by their developers. If you'd like to know more about provider signing, you can read about it here: https://www.terraform.io/docs/cli/plugins/signing.html Terraform has created a lock file .terraform.lock.hcl to record the provider selections it made above. Include this file in your version control repository so that Terraform can guarantee to make the same selections by default when you run "terraform init" in the future. Terraform Cloud has been successfully initialized! ...

Da die Definition des Droplets dieselbe ist wie im vorherigen Projekt, können Sie sie kopieren, indem Sie Folgendes ausführen:

  1. cp ../terraform-team-pg/droplets.tf .

Zuletzt definieren Sie die Variablenwerte. Der cloud-Anbieter unterstützt nicht das Übergeben von Werten an Variablen über die Befehlszeile, daher müssen Sie sie über Variablendateien übergeben oder in Terraform Cloud setzen. Terraform liest Variablenwerte aus Dateien mit einem Dateinamen, der auf .auto.tfvars endet. Erstellen und öffnen Sie eine Datei namens vars.auto.tfvars zum Bearbeiten, in der Sie die Variable do_token definieren:

  1. nano vars.auto.tfvars

Fügen Sie die folgende Zeile hinzu, wobei Sie Ihr_do_token durch Ihren DigitalOcean-API-Token ersetzen:

vars.auto.tfvars
do_token = "your_do_token"

Wenn Sie fertig sind, speichern und schließen Sie die Datei. Terraform liest diese Datei automatisch beim Planen von Aktionen ein.

Ihr Projekt ist jetzt abgeschlossen und für die Verwendung von Terraform Cloud als Backend eingerichtet. Sie planen und wenden das Droplet nun an und überprüfen, wie sich das in der Cloud-App widerspiegelt.

Konfiguration anwenden

In Schritt 1 dieses Tutorials haben Sie ein Projekt mithilfe des Befehls terraform plan geplant. Da das Terraform Cloud-Projekt die gleichen Ressourcen definiert hat, können Sie das Planen überspringen und es direkt auf Terraform Cloud anwenden.

Sie wenden das Projekt an, indem Sie den folgenden Befehl ausführen, um es zu aktualisieren:

  1. terraform apply

Sie werden feststellen, dass die Ausgabe anders ist, wenn Sie local als Ihr Backend verwenden:

Output
Running apply in Terraform Cloud. Output will stream here. Pressing Ctrl-C will cancel the remote apply if it's still pending. If the apply started it will stop streaming the logs, but will not stop the apply running remotely. Preparing the remote apply... To view this run in a browser, visit: https://app.terraform.io/app/sammy-shark/sammy/runs/run-euVu9t1yUtuq5sy9 Waiting for the plan to start... Terraform v1.1.3 on linux_amd64 Configuring remote state backend... Initializing Terraform configuration... Terraform used the selected providers to generate the following execution plan. Resource actions are indicated with the following symbols: + create Terraform will perform the following actions: # digitalocean_droplet.web wird erstellt + resource "digitalocean_droplet" "web" { + backups = false + created_at = (known after apply) + disk = (known after apply) + graceful_shutdown = false + id = (known after apply) + image = "ubuntu-20-04-x64" + ipv4_address = (known after apply) + ipv4_address_private = (known after apply) + ipv6 = false + ipv6_address = (known after apply) + locked = (known after apply) + memory = (known after apply) + monitoring = false + name = "web-1" + price_hourly = (known after apply) + price_monthly = (known after apply) + private_networking = (known after apply) + region = "fra1" + resize_disk = true + size = "s-1vcpu-1gb" + status = (known after apply) + urn = (known after apply) + vcpus = (known after apply) + volume_ids = (known after apply) + vpc_uuid = (known after apply) } Plan: 1 to add, 0 to change, 0 to destroy. ...

Bei Verwendung des cloud-Backends plant oder wendet Terraform keine Konfiguration von der lokalen Maschine an. Stattdessen delegiert es diese Aufgaben an Terraform Cloud und gibt die Ausgabe nur in Echtzeit auf die Konsole aus.

Geben Sie yes ein, wenn Sie dazu aufgefordert werden. Terraform wird bald die Konfiguration anwenden und Sie können zur Arbeitsumgebung auf der Terraform Cloud-Website navigieren, um festzustellen, dass eine neue Aktion angewendet wurde.

Sie können die bereitgestellten Ressourcen jetzt zerstören, indem Sie folgendes ausführen:

  1. terraform destroy

In diesem Abschnitt haben Sie Ihr Projekt mit Terraform Cloud verbunden, sodass der Status Ihres Projekts für Ihr Team an einem zentralen Ort zugänglich ist. Dadurch kann der Status für alle mit Zugriff auf das Projekt gemeinsam genutzt und synchronisiert werden, was zu einer reibungsloseren Erfahrung führt.

Abschluss

In diesem Tutorial haben Sie zwei verschiedene Backends verwendet: Terraform Cloud, das das gemanagte Cloud-Angebot von Hashicorp für Terraform ist; und pg, mit dem Sie den Status des Projekts in einer PostgreSQL-Datenbank speichern können. Sie haben eine verwaltete PostgreSQL-Datenbank von DigitalOcean verwendet, die Sie innerhalb weniger Minuten bereitstellen und mit Terraform verwenden können.

Für weitere Informationen über die Funktionen von Terraform Cloud besuchen Sie die offizielle Dokumentation.

Dieses Tutorial ist Teil der Anleitung zur Verwaltung von Infrastruktur mit Terraform-Serie. Die Serie behandelt verschiedene Terraform-Themen, angefangen bei der Installation von Terraform bis hin zur Verwaltung komplexer Projekte.

Source:
https://www.digitalocean.com/community/tutorials/how-to-use-terraform-within-your-team