Wie man Terraform auf DigitalOcean ausführt

0 Aktien
0
0
0
0

Einführung

Terraform ist ein Tool zur strukturierten Erstellung und Verwaltung von Infrastruktur. Sie können damit DigitalOcean Droplets, Load Balancer und sogar DNS-Einträge verwalten, sowie zahlreiche weitere Dienste anderer Anbieter. Terraform verwendet eine Kommandozeilenschnittstelle und kann sowohl vom Desktop als auch von einem Remote-Server ausgeführt werden.

Terraform liest Konfigurationsdateien, die die Komponenten Ihrer Anwendungsumgebung oder Ihres Rechenzentrums beschreiben. Basierend auf dieser Konfiguration erstellt Terraform einen ausführbaren Plan, der die Schritte zur Erreichung des gewünschten Zustands beschreibt. Anschließend führen Sie diesen Plan mit Terraform aus, um Ihre Infrastruktur aufzubauen. Bei Konfigurationsänderungen kann Terraform inkrementelle Pläne erstellen und ausführen, um die bestehende Infrastruktur auf den neuen, beschriebenen Zustand zu aktualisieren.

In diesem Tutorial installieren Sie Terraform und erstellen damit eine Infrastruktur auf DigitalOcean, die aus zwei Nginx-Servern besteht, deren Last von einem DigitalOcean Load Balancer verteilt wird. Anschließend fügen Sie mit Terraform einen DNS-Eintrag auf DigitalOcean hinzu, der auf den Load Balancer verweist. Dies hilft Ihnen beim Einstieg in Terraform und gibt Ihnen einen Einblick, wie Sie damit eine DigitalOcean-basierte Infrastruktur verwalten und bereitstellen können, die Ihren Anforderungen entspricht.

Voraussetzungen
  • Ein DigitalOcean-Konto
  • Ein persönlicher DigitalOcean-Zugangscode, den Sie über das DigitalOcean-Kontrollfeld erstellen können.
  • Ihrem DigitalOcean-Konto wurde ein passwortloser SSH-Schlüssel hinzugefügt.
  • Eine persönliche Domain, die auf einen Server namens DigitalOcean verweist.

Schritt 1 – Terraform installieren

Terraform ist ein Kommandozeilen-Tool, das Sie auf einem Remote-Desktop oder -Server ausführen. Zur Installation laden Sie es herunter und fügen es Ihrem PATH hinzu, sodass Sie es in jedem beliebigen Verzeichnis ausführen können.

Laden Sie zunächst das passende Paket für Ihr Betriebssystem und Ihre Architektur von der offiziellen Downloadseite herunter. Wenn Sie macOS oder Linux verwenden, können Sie Terraform mit curl herunterladen.

Unter macOS verwenden Sie diesen Befehl, um Terraform herunterzuladen und in Ihrem Home-Verzeichnis abzulegen:

curl -o ~/terraform.zip https://releases.hashicorp.com/terraform/1.7.2/terraform_1.7.2_darwin_amd64.zip

Unter Linux verwenden Sie diesen Befehl:

curl -o ~/terraform.zip https://releases.hashicorp.com/terraform/1.7.2/terraform_1.7.2_linux_amd64.zip

Erstelle den Ordner ~/opt/terraform:

mkdir -p ~/opt/terraform

Entpacken Sie Terraform anschließend mit dem Befehl `unzip` nach ~/opt/terraform. Unter Ubuntu können Sie `unzip` über `apt` installieren.

sudo apt install unzip

Verwenden Sie es, um das heruntergeladene Archiv in den Ordner ~/opt/terraform zu extrahieren, indem Sie Folgendes ausführen:

unzip ~/terraform.zip -d ~/opt/terraform

Fügen Sie abschließend ~/opt/terraform zu Ihrer PATH-Umgebungsvariablen hinzu, damit Sie den Befehl terraform ausführen können, ohne den vollständigen Pfad zur ausführbaren Datei angeben zu müssen.

Unter Linux müssen Sie die Umgebungsvariable PATH in der Datei .bashrc definieren. Diese Datei wird beim Öffnen einer neuen Shell ausgeführt. Öffnen Sie sie zum Bearbeiten, indem Sie folgenden Befehl ausführen:

nano ~/.bashrc

Um den Terraform-Pfad zu PATH hinzuzufügen, fügen Sie die folgende Zeile am Ende der Datei ein:

export PATH=$PATH:~/opt/terraform

Wenn Sie fertig sind, speichern und schließen Sie die Datei.

Nun können alle Ihre neuen Shell-Sitzungen den Terraform-Befehl finden. Um den neuen PATH in Ihre aktuelle Sitzung zu laden, führen Sie unter Linux mit Bash folgenden Befehl aus:

. ~/.bashrc

Wenn Sie Bash unter macOS verwenden, führen Sie stattdessen diesen Befehl aus:

. .bash_profile

Wenn Sie ZSH verwenden, führen Sie diesen Befehl aus:

. .zshrc

Um zu überprüfen, ob Sie Terraform korrekt installiert haben, führen Sie den Befehl „terraform“ ohne Argumente aus:

terraform

Sie werden eine Ausgabe ähnlich der folgenden sehen:

OutputUsage: terraform [global options] <subcommand> [args]
The available commands for execution are listed below.
The primary workflow commands are given first, followed by
less common or more advanced commands.
Main commands:
init Prepare your working directory for other commands
validate Check whether the configuration is valid
plan Show changes required by the current configuration
apply Create or update infrastructure
destroy Destroy previously-created infrastructure
All other commands:
console Try Terraform expressions at an interactive command prompt
fmt Reformat your configuration in the standard style
force-unlock Release a stuck lock on the current workspace
get Install or upgrade remote Terraform modules
graph Generate a Graphviz graph of the steps in an operation
import Associate existing infrastructure with a Terraform resource
login Obtain and save credentials for a remote host
logout Remove locally-stored credentials for a remote host
output Show output values from your root module
providers Show the providers required for this configuration
refresh Update the state to match remote systems
show Show the current state or a saved plan
state Advanced state management
taint Mark a resource instance as not fully functional
test Experimental support for module integration testing
untaint Remove the 'tainted' state from a resource instance
version Show the current Terraform version
workspace Workspace management
Global options (use these before the subcommand, if any):
-chdir=DIR Switch to a different working directory before executing the
given subcommand.
-help Show this help output, or the help for a specified subcommand.
-version An alias for the "version" subcommand.

Dies sind die Befehle, die Terraform akzeptiert. Die Ausgabe liefert eine kurze Erklärung, und Sie werden im Laufe dieses Tutorials mehr darüber erfahren.

Nachdem Terraform nun installiert ist, konfigurieren wir es für die Verwendung mit DigitalOcean-Ressourcen.

Schritt 2 – Terraform für DigitalOcean konfigurieren

Terraform unterstützt eine Vielzahl von Service-Providern, die Sie installieren können. Jeder Provider hat seine eigenen Spezifikationen, die in der Regel die entsprechende Service-Provider-API bereitstellen.

Der DigitalOcean-Provider ermöglicht Terraform die Interaktion mit der DigitalOcean-API zur Erstellung von Infrastruktur. Dieser Provider unterstützt die Erstellung verschiedener DigitalOcean-Ressourcen, darunter:

  • digitalocean_droplet: Droplets (Server)
  • digitalocean_loadbalancer: Load Balancer
  • digitalocean_domain: DNS-Domäneneinträge
  • digitalocean_record: DNS-Einträge

Terraform verwendet Ihren persönlichen DigitalOcean-Zugriffsschlüssel zur Kommunikation mit der DigitalOcean-API und zur Verwaltung der Ressourcen in Ihrem Konto. Geben Sie diesen Schlüssel nicht an Dritte weiter und halten Sie ihn von Skripten und der Versionskontrolle fern. Exportieren Sie Ihren persönlichen DigitalOcean-Zugriffsschlüssel in eine Umgebungsvariable namens DO_PAT, indem Sie folgenden Befehl ausführen:

export DO_PAT="your_personal_access_token"

Erstellen Sie ein Verzeichnis, in dem Ihre Infrastrukturkonfiguration gespeichert wird, indem Sie folgenden Befehl ausführen:

mkdir ~/loadbalance

Wechseln Sie in das neu erstellte Verzeichnis:

cd ~/loadbalance

Terraform-Konfigurationen sind Textdateien mit der Dateiendung .tf. Sie sind lesbar und unterstützen Kommentare. (Terraform unterstützt auch JSON-formatierte Konfigurationsdateien, diese werden hier jedoch nicht behandelt.) Terraform liest alle Konfigurationsdateien im Arbeitsverzeichnis deklarativ ein, daher spielt die Reihenfolge der Ressourcen- und Variablendefinitionen keine Rolle. Ihre gesamte Infrastruktur kann in einer einzigen Konfigurationsdatei enthalten sein. Zur besseren Übersicht empfiehlt es sich jedoch, die Konfigurationsdateien nach Ressourcentyp zu trennen.

Der erste Schritt beim Erstellen einer Infrastruktur mit Terraform besteht darin, den zu verwendenden Provider zu definieren.

Um einen DigitalOcean-Provider mit Terraform zu verwenden, müssen Sie Terraform darüber informieren und das Plugin mit den entsprechenden Anmeldeinformationen konfigurieren. Erstellen Sie eine Datei namens provider.tf, die die Konfiguration für den Provider speichert:

nano provider.tf

Fügen Sie die folgenden Zeilen zur Datei hinzu, um Terraform mitzuteilen, dass Sie den DigitalOcean-Provider verwenden möchten und wo Terraform ihn finden kann:

terraform {
required_providers {
digitalocean = {
source = "digitalocean/digitalocean"
version = "~> 2.0"
}
}
}

Definieren Sie anschließend die folgenden Variablen in der Datei, damit Sie in den übrigen Konfigurationsdateien darauf verweisen können:

  • do_tokenIhr persönliches DigitalOcean-Zugangspasswort.
  • privater Schlüssel: Der Speicherort des privaten Schlüssels, damit Terraform sich damit bei neuen Droplets anmelden und Nginx installieren kann.

Sie übergeben die Werte dieser Variablen an Terraform beim Ausführen, anstatt sie hier fest zu kodieren. Dadurch wird die Konfiguration portabler.

Um diese Variablen zu definieren, fügen Sie diese Zeilen zur Datei hinzu:

...
variable "do_token" {}
variable "pvt_key" {}

Fügen Sie anschließend diese Zeilen hinzu, um den DigitalOcean-Anbieter zu konfigurieren und Ihre DigitalOcean-Kontodaten zuzuweisen. do_token Zum Argument Token Anbieter angeben:

...
provider "digitalocean" {
token = var.do_token
}

Schließlich möchten Sie, dass Terraform Ihren SSH-Schlüssel automatisch zu jedem neu erstellten Droplet hinzufügt. Als Sie Ihren SSH-Schlüssel bei DigitalOcean hinzugefügt haben, haben Sie ihm einen Namen gegeben. Terraform kann diesen Namen verwenden, um den öffentlichen Schlüssel abzurufen. Fügen Sie diese Zeilen hinzu und ersetzen Sie dabei den Schlüsselnamen durch den, den Sie in Ihrem DigitalOcean-Konto angegeben haben. Terraforming Tun:

...
data "digitalocean_ssh_key" "terraform" {
name = "terraform"
}

Datei provider.tf Ihr ausgefülltes Formular sieht folgendermaßen aus:

terraform {
required_providers {
digitalocean = {
source = "digitalocean/digitalocean"
version = "~> 2.0"
}
}
}
variable "do_token" {}
variable "pvt_key" {}
provider "digitalocean" {
token = var.do_token
}
data "digitalocean_ssh_key" "terraform" {
name = "terraform"
}

Initialisieren Sie Terraform für Ihr Projekt, indem Sie Folgendes ausführen:

terraform init

Dadurch werden Ihre Konfiguration gelesen und die Plugins für Ihren Anbieter installiert. Das wird in der Ausgabe angezeigt:

OutputInitializing the backend...
Initializing provider plugins...
- Finding digitalocean/digitalocean versions matching "~> 2.0"...
- Installing digitalocean/digitalocean v2.34.1...
- Installed digitalocean/digitalocean v2.34.1 (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!
You may now begin working with Terraform. Try running "terraform plan" to see
any changes that are required for your infrastructure. All Terraform commands
should now work.
If you ever set or change modules or backend configuration for Terraform,
rerun this command to reinitialize your working directory. If you forget, other
commands will detect it and remind you to do so if necessary.

Falls Sie nicht weiterkommen und Terraform nicht wie erwartet funktioniert, können Sie das Problem beheben, indem Sie die Datei löschen. terraform.tfstate Entfernen Sie anschließend die erstellten Ressourcen manuell (z. B. über die Systemsteuerung) und beginnen Sie von vorn.

Terraform ist nun konfiguriert und kann mit Ihrem DigitalOcean-Konto verbunden werden. Als Nächstes definieren Sie mit Terraform ein Droplet, auf dem der Nginx-Server ausgeführt wird.

Schritt 3 – Definieren Sie den ersten Nginx-Server

Mit Terraform können Sie ein DigitalOcean-Droplet erstellen, es starten und Software darauf installieren. In diesem Schritt provisionieren Sie ein Ubuntu 20.04 und installieren den Nginx-Webserver mithilfe von Terraform.

Eine neue Terraform-Konfigurationsdatei namens www-1.tf Erstellen Sie eine Datei, die die Droplet-Konfiguration enthält:

nano www-1.tf

Geben Sie die folgenden Zeilen ein, um die Droplet-Quelle zu definieren:

resource "digitalocean_droplet" "www-1" {
image = "ubuntu-20-04-x64"
name = "www-1"
region = "nyc3"
size = "s-1vcpu-1gb"
ssh_keys = [
data.digitalocean_ssh_key.terraform.id
]

In der vorherigen Konfiguration definiert die erste Zeile eine DigitalOcean-Droplet-Ressource namens www-1. Die übrigen Zeilen legen die Eigenschaften des Droplets fest, darunter das Rechenzentrum, in dem es sich befindet, und den Slug, der die Größe des zu konfigurierenden Droplets angibt. In diesem Fall verwenden Sie s-1vcpu-1gb, wodurch ein Droplet mit einer CPU und 1 GB RAM erstellt wird. (In dieser Slug-Größentabelle finden Sie die verfügbaren Slugs.)

Abschnitt ssh_keys Gibt eine Liste öffentlicher Schlüssel an, die Sie dem Droplet hinzufügen möchten. In diesem Fall geben Sie den Schlüssel an, der sich in provider.tf Stellen Sie sicher, dass der hier angegebene Name mit dem von Ihnen definierten Namen übereinstimmt. provider.tf Sie haben angegeben, dass es übereinstimmen soll.

Wenn Sie Terraform für die DigitalOcean-API ausführen, erfasst es verschiedene Informationen über das Droplet, wie beispielsweise dessen öffentliche und private IP-Adresse. Diese Informationen können von anderen Ressourcen in Ihrer Konfiguration verwendet werden.

Wenn Sie nicht wissen, welche Argumente für eine Droplet-Quelle erforderlich oder optional sind, konsultieren Sie bitte die offizielle Terraform-Dokumentation: DigitalOcean Droplet-Spezifikation

Um eine Verbindung einzurichten, die Terraform für die SSH-Verbindung zum Server nutzen kann, fügen Sie die folgenden Zeilen am Ende der Datei hinzu:

...
connection {
host = self.ipv4_address
user = "root"
type = "ssh"
private_key = file(var.pvt_key)
timeout = "2m"
}

Diese Zeilen erklären, wie Terraform sich mit dem Server verbinden soll, damit Terraform per SSH Nginx installieren kann. Dabei wird die Variable für den privaten Schlüssel verwendet. var.pvt_key Achtung – Sie übergeben den Wert an Terraform, wenn Sie es ausführen.

Nachdem die Verbindung eingerichtet ist, konfigurieren Sie den Remote-Exec-Provider, den Sie für die Installation von Nginx verwenden werden. Fügen Sie dazu die folgenden Zeilen zur Konfiguration hinzu:

...
provisioner "remote-exec" {
inline = [
"export PATH=$PATH:/usr/bin",
# install nginx
"sudo apt update",
"sudo apt install -y nginx"
]
}
}

Beachten Sie, dass die Zeichenketten im Inline-Array die Befehle sind, die der Root-Benutzer ausführt, um Nginx zu installieren.

Die fertige Datei sieht folgendermaßen aus:

resource "digitalocean_droplet" "www-1" {
image = "ubuntu-20-04-x64"
name = "www-1"
region = "nyc3"
size = "s-1vcpu-1gb"
ssh_keys = [
data.digitalocean_ssh_key.terraform.id
]
connection {
host = self.ipv4_address
user = "root"
type = "ssh"
private_key = file(var.pvt_key)
timeout = "2m"
}
provisioner "remote-exec" {
inline = [
"export PATH=$PATH:/usr/bin",
# install nginx
"sudo apt update",
"sudo apt install -y nginx"
]
}
}

Speichern Sie die Datei und beenden Sie den Editor. Sie haben den Server definiert und können ihn nun bereitstellen.

Schritt 4 – Erstellen eines Nginx-Servers mit Terraform

Ihre aktuelle Terraform-Konfiguration beschreibt einen Nginx-Server. Sie werden das Droplet nun genau wie definiert bereitstellen.

Befehl Terraforming-Plan Führen Sie den Befehl aus, um den Ausführungsplan anzuzeigen, also was Terraform tun wird, um die von Ihnen beschriebene Infrastruktur zu erstellen. Sie müssen Werte für das DigitalOcean-Zugriffstoken und den Pfad zu Ihrem privaten Schlüssel angeben, da Ihre Konfiguration diese Informationen benötigt, um auf das Droplet für die Nginx-Installation zuzugreifen. Um einen Plan zu erstellen, führen Sie folgenden Befehl aus:

terraform plan \
-var "do_token=${DO_PAT}" \
-var "pvt_key=$HOME/.ssh/id_rsa"

Sie sehen eine Ausgabe, die in etwa so aussieht:

OutputTerraform 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.www-1 will be created
+ resource "digitalocean_droplet" "www-1" {
+ 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 = "www-1"
+ price_hourly = (known after apply)
+ price_monthly = (known after apply)
+ private_networking = (known after apply)
+ region = "nyc3"
+ resize_disk = true
+ size = "s-1vcpu-1gb"
+ ssh_keys = [
+ "...",
]
+ 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.
───────────────────────────────────────────────────────────────
Note: You didn't use the -out option to save this plan, so Terraform can't guarantee to take exactly these actions if you run "terraform apply" now.

Die Zeile + resource “digitalocean_droplet” “www-1” bedeutet, dass Terraform eine neue Droplet-Ressource namens www-1 mit den folgenden Details erstellt. Genau das soll passieren. Führen Sie daher den Befehl `terraform application` aus, um die aktuelle Anwendung zu starten.

terraform apply \
-var "do_token=${DO_PAT}" \
-var "pvt_key=$HOME/.ssh/id_rsa"

Sie erhalten die gleiche Ausgabe wie zuvor, aber dieses Mal fragt Terraform Sie, ob Sie fortfahren möchten:

Output...
Plan: 1 to add, 0 to change, 0 to destroy.
Do you want to perform these actions?
Terraform will perform the actions described above.
Only 'yes' will be accepted to approve.
Enter a value: yes

Geben Sie „Ja“ ein und drücken Sie die Eingabetaste. Terraform Droplet stellt Ihnen Folgendes zur Verfügung:

Outputdigitalocean_droplet.www-1: Creating...

Nach einer Weile sehen Sie, wie Terraform Nginx mit dem Remote-Exec-Provider installiert, und dann ist der Vorgang abgeschlossen:

Output
digitalocean_droplet.www-1: Provisioning with 'remote-exec'...
....
digitalocean_droplet.www-1: Creation complete after 1m54s [id=your_www-1_droplet_id]
Apply complete! Resources: 1 added, 0 changed, 0 destroyed.
...

Terraform hat ein neues Droplet namens www-1 erstellt und Nginx darauf installiert. Wenn Sie die öffentliche IP-Adresse Ihres neuen Droplets aufrufen, sehen Sie die Nginx-Willkommensseite. Die öffentliche IP-Adresse wird bei der Erstellung des Droplets angezeigt, ist aber jederzeit im aktuellen Terraform-Status einsehbar. Terraform aktualisiert die Statusdatei terraform.tfstate jedes Mal, wenn ein Plan ausgeführt oder der Status aktualisiert wird.

Um den aktuellen Status Ihrer Umgebung anzuzeigen, verwenden Sie folgenden Befehl:

terraform show terraform.tfstate

Hier wird die öffentliche IP-Adresse Ihres Droplets angezeigt.

Outputresource "digitalocean_droplet" "www-1" {
backups = false
created_at = "..."
disk = 25
id = "your_www-1_droplet_id"
image = "ubuntu-20-04-x64"
ipv4_address = "your_www-1_server_ip"
ipv4_address_private = "10.128.0.2"
...

Um zu überprüfen, ob Ihr Nginx-Server läuft, rufen Sie http://your_www-1_server_ip in Ihrem Browser auf.

An diesem Punkt haben Sie das in Terraform beschriebene Droplet bereitgestellt. Nun erstellen Sie ein zweites.

Schritt 5 – Erstellen Sie einen zweiten Nginx-Server

Nachdem Sie nun einen Nginx-Server konfiguriert haben, können Sie schnell einen zweiten hinzufügen, indem Sie die bestehende Serverkonfigurationsdatei kopieren und den Droplet-Quellnamen und den Hostnamen ersetzen.

Das können Sie manuell tun, aber mit dem Befehl sed Um die Datei zu lesen www-1.tf, wodurch alle Instanzen ersetzt werden www-1 Mit www-2 und erstellen Sie eine neue Datei mit dem Namen www-2.tf Es ist schneller. Hier ist der Befehl. sed Dazu gibt es Folgendes:

sed 's/www-1/www-2/g' www-1.tf > www-2.tf

Mehr über die Verwendung von sed erfahren Sie unter Using sed. sed Mehr erfahren.

Um eine Vorschau der von Terraform vorgenommenen Änderungen zu erhalten, führen Sie das Terraform-Programm erneut aus:

terraform plan \
-var "do_token=${DO_PAT}" \
-var "pvt_key=$HOME/.ssh/id_rsa"

Die Ausgabe zeigt, dass Terraform einen zweiten Server www-2 erstellen wird:

OutputTerraform 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.www-2 will be created
+ resource "digitalocean_droplet" "www-2" {
+ backups = false
+ created_at = (known after apply)
+ disk = (known after apply)
+ 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 = "www-2"
+ price_hourly = (known after apply)
+ price_monthly = (known after apply)
+ private_networking = true
+ region = "nyc3"
+ resize_disk = true
+ size = "s-1vcpu-1gb"
+ ssh_keys = [
+ "...",
]
+ 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.
...

Führen Sie die Terraform-Anwendung erneut aus, um das zweite Droplet zu erstellen:

terraform apply \
-var "do_token=${DO_PAT}" \
-var "pvt_key=$HOME/.ssh/id_rsa"

Wie zuvor werden Sie von Terraform um eine Bestätigung gebeten. Überprüfen Sie den Plan erneut und geben Sie „Ja“ ein, um fortzufahren.

Nach einer Weile erstellt Terraform den neuen Server und zeigt die Ergebnisse an:

Outputdigitalocean_droplet.www-2: Creation complete after 1m47s [id=your_www-2_droplet_id]
...
Apply complete! Resources: 1 added, 0 changed, 0 destroyed.

Terraform hat den neuen Server erstellt, ohne den bestehenden zu verändern. Sie können diesen Schritt wiederholen, um weitere Nginx-Server hinzuzufügen.

Nachdem Sie nun zwei Droplets mit Nginx betreiben, werden Sie einen Load Balancer definieren und bereitstellen, um den Datenverkehr zwischen ihnen aufzuteilen.

Schritt 6 – Lastverteilung

Sie werden den DigitalOcean Load Balancer verwenden, der vom offiziellen Terraform-Anbieter unterstützt wird, um den Datenverkehr zwischen den beiden Webservern zu routen.

Eine neue Terraform-Konfigurationsdatei namens loadbalancer.tf Erstellen:

nano loadbalancer.tf

Fügen Sie die folgenden Zeilen hinzu, um den Load Balancer zu definieren:

resource "digitalocean_loadbalancer" "www-lb" {
name = "www-lb"
region = "nyc3"
forwarding_rule {
entry_port = 80
entry_protocol = "http"
target_port = 80
target_protocol = "http"
}
healthcheck {
port = 22
protocol = "tcp"
}
droplet_ids = [digitalocean_droplet.www-1.id, digitalocean_droplet.www-2.id ]
}

Die Load-Balancer-Definition legt seinen Namen, das Rechenzentrum, in dem er sich befindet, die Ports fest, an denen er den Datenverkehr ausgleichen soll, die Konfiguration für die Integritätsprüfungen und die IDs der Drops, die er ausgleichen soll. Diese Daten rufen Sie mithilfe von Terraform-Variablen ab.

Als Nächstes definieren Sie eine Statusprüfung, um sicherzustellen, dass der Load Balancer nach der Bereitstellung tatsächlich verfügbar ist:

check "health_check" {
data "http" "lb_check" {
url = "http://${digitalocean_loadbalancer.www-lb.ip}"
}
assert {
condition = data.http.lb_check.status_code == 200
error_message = "${data.http.lb_check.url} returned an unhealthy status code"
}
}

Diese Prüfung fragt den Status der Load-Balancer-IP-Adresse per HTTP ab und verifiziert, dass der Rückgabecode 200 lautet, was bedeutet, dass die Droplets fehlerfrei und verfügbar sind. Bei Fehlern oder einem abweichenden Rückgabecode wird nach Abschluss der Bereitstellungsschritte eine Warnung angezeigt. Speichern und schließen Sie die Datei anschließend.

Erneut bestellen Terraforming-Plan Führen Sie den Befehl aus, um die neue ausführbare Datei zu überprüfen:

terraform plan \
-var "do_token=${DO_PAT}" \
-var "pvt_key=$HOME/.ssh/id_rsa"

Sie sehen mehrere Ausgabezeilen, darunter die folgenden Zeilen:

Output...
Terraform used the selected providers to generate the following execution plan. Resource actions are indicated with the following symbols:
+ create
<= read (data resources)
Terraform will perform the following actions:
# data.http.lb_check will be read during apply
# (config refers to values not yet known)
<= data "http" "lb_check" {
+ body = (known after apply)
+ id = (known after apply)
+ response_body = (known after apply)
+ response_body_base64 = (known after apply)
+ response_headers = (known after apply)
+ status_code = (known after apply)
+ url = (known after apply)
}
# digitalocean_loadbalancer.www-lb will be created
+ resource "digitalocean_loadbalancer" "www-lb" {
+ algorithm = "round_robin"
+ disable_lets_encrypt_dns_records = false
+ droplet_ids = [
+ ...,
+ ...,
]
+ enable_backend_keepalive = false
+ enable_proxy_protocol = false
+ http_idle_timeout_seconds = (known after apply)
+ id = (known after apply)
+ ip = (known after apply)
+ name = "www-lb"
+ project_id = (known after apply)
+ redirect_http_to_https = false
+ region = "nyc3"
+ size_unit = (known after apply)
+ status = (known after apply)
+ urn = (known after apply)
+ vpc_uuid = (known after apply)
+ forwarding_rule {
+ certificate_id = (known after apply)
+ certificate_name = (known after apply)
+ entry_port = 80
+ entry_protocol = "http"
+ target_port = 80
+ target_protocol = "http"
+ tls_passthrough = false
}
+ healthcheck {
+ check_interval_seconds = 10
+ healthy_threshold = 5
+ port = 22
+ protocol = "tcp"
+ response_timeout_seconds = 5
+ unhealthy_threshold = 3
}
}
Plan: 1 to add, 0 to change, 0 to destroy.
│ Warning: Check block assertion known after apply
│ on loadbalancer.tf line 27, in check "health_check":
│ 27: condition = data.http.lb_check.status_code == 200
│ ├────────────────
│ │ data.http.lb_check.status_code is a number
│
│ The condition could not be evaluated at this time, a result will be known when this plan is applied.
╵
...

Da die Tröpfchen www-1 Und www-2 Sie existieren bereits, Terraform Load Balancer erstellt www-lb und überprüft dies nach der Bereitstellung.

Vor der Bereitstellung müssen Sie das Projekt neu starten, um die in health_check verwendete HTTP-Abhängigkeit hinzuzufügen:

terraform init -upgrade

Führen Sie anschließend die Terraform-Anwendung aus, um den Load Balancer zu erstellen:

terraform apply \
-var "do_token=${DO_PAT}" \
-var "pvt_key=$HOME/.ssh/id_rsa"

Terraform fordert Sie erneut auf, den Plan zu überprüfen. Bestätigen Sie den Plan mit „Ja“, um fortzufahren.

Anschließend wird die Ausgabe mit den folgenden Zeilen angezeigt (aus Gründen der Übersichtlichkeit gekürzt):

Output...
digitalocean_loadbalancer.www-lb: Creating...
...
digitalocean_loadbalancer.www-lb: Creation complete after 1m18s [id=your_load_balancer_id]
data.http.lb_check: Reading...
data.http.lb_check: Read complete after 0s [id=http://lb-ip]
Apply complete! Resources: 1 added, 0 changed, 0 destroyed.
...

Bitte beachten Sie, dass lb_check erfolgreich abgeschlossen wurde.

Aus terraform show terraform.tfstate Um die IP-Adresse Ihres Load Balancers zu finden, verwenden Sie:

terraform show terraform.tfstate

Die IP-Adresse finden Sie unter dem Eintrag www-lb:

Output...
# digitalocean_loadbalancer.www-lb:
resource "digitalocean_loadbalancer" "www-lb" {
algorithm = "round_robin"
disable_lets_encrypt_dns_records = false
droplet_ids = [
your_www-1_droplet_id,
your_www-2_droplet_id,
]
enable_backend_keepalive = false
enable_proxy_protocol = false
id = "your_load_balancer_id"
ip = "your_load_balancer_ip"
name = "www-lb"
...

Rufen Sie http://your_load_balancer_ip in Ihrem Browser auf, und Sie sehen die Nginx-Willkommensseite, da der Load Balancer den Datenverkehr an einen der beiden Nginx-Server weiterleitet.

Nun lernen Sie, wie Sie mit Terraform die DNS-Einstellungen für Ihr DigitalOcean-Konto konfigurieren.

Schritt 7 – Domains und DNS-Einträge erstellen

Neben Droplets und Load Balancern kann Terraform auch DNS-Domains erstellen und Domains registrieren. Wenn Sie beispielsweise Ihre Domain auf Ihren Load Balancer verweisen möchten, können Sie eine Konfiguration erstellen, die diese Beziehung beschreibt.

Erstellen Sie eine neue Datei zur Beschreibung Ihres DNS:

nano domain_root.tf

Fügen Sie die folgende Domänenquelle hinzu und ersetzen Sie your_domain durch Ihren Domänennamen:

resource "digitalocean_domain" "default" {
name = "your_domain"
ip_address = digitalocean_loadbalancer.www-lb.ip
}

Wenn Sie fertig sind, speichern und schließen Sie die Datei.

Sie können auch einen CNAME-Eintrag hinzufügen, www.your_domain Zu Ihre_Domäne Erstellen Sie eine neue Datei für den CNAME-Eintrag:

nano domain_cname.tf

Fügen Sie diese Zeilen zur Datei hinzu:

resource "digitalocean_record" "CNAME-www" {
domain = digitalocean_domain.default.name
type = "CNAME"
name = "www"
value = "@"
}

Wenn Sie fertig sind, speichern und schließen Sie die Datei.

Um DNS-Einträge hinzuzufügen, verwendet die Anwendung Terraforming Und dann Terraform-Anwendung Behandeln Sie es wie jede andere Ressource.

Rufen Sie Ihre Domain auf, und Sie sehen die Nginx-Willkommensseite, da die Domain auf den Load Balancer verweist, der den Datenverkehr an einen der beiden Nginx-Server weiterleitet.

Schritt 8 – Zerstören Sie Ihre Infrastruktur

Obwohl Terraform typischerweise nicht in Produktionsumgebungen eingesetzt wird, kann es auch bestehende Infrastrukturen zerstören. Dies ist hauptsächlich in Entwicklungsumgebungen nützlich, die mehrfach bereitgestellt und wieder gelöscht werden.

Zunächst einmal die Verwendung Terraform-Plan -zerstören Erstellen Sie einen Umsetzungsplan für die Zerstörung der Infrastruktur:

terraform plan -destroy -out=terraform.tfplan \
-var "do_token=${DO_PAT}" \
-var "pvt_key=$HOME/.ssh/id_rsa"

Terraform gibt einen Plan aus, in dem die Ressourcen rot hervorgehoben und mit einem Minuszeichen versehen sind, was darauf hinweist, dass Ihre Infrastrukturressourcen entfernt werden.

Dann von Terraform-Anwendung Zur Umsetzung des Plans verwenden Sie Folgendes:

terraform apply terraform.tfplan

Terraform wird weiterhin Ressourcen gemäß dem generierten Plan zerstören.

Ergebnis

In diesem Tutorial haben Sie mit Terraform eine Load-Balancing-Webinfrastruktur auf DigitalOcean erstellt, die aus zwei Nginx-Webservern hinter einem DigitalOcean Load Balancer besteht. Sie haben gelernt, wie Sie Ressourcen erstellen und löschen, den aktuellen Status anzeigen und Terraform zur Konfiguration von DNS-Einträgen verwenden.

Nachdem Sie nun die Funktionsweise von Terraform verstanden haben, können Sie Konfigurationsdateien erstellen, die die Serverinfrastruktur Ihrer Projekte beschreiben. Das Beispiel in diesem Tutorial ist ein guter Ausgangspunkt, um zu zeigen, wie Sie die Serverbereitstellung automatisieren können. Wenn Sie bereits Provisionierungstools verwenden, können Sie diese in Terraform integrieren, um Server im Rahmen des Erstellungsprozesses zu konfigurieren, anstatt die in diesem Tutorial verwendete Provisionierungsmethode zu nutzen.

Terraform bietet viele weitere Funktionen und ist mit anderen Anbietern kompatibel. Weitere Informationen zur Nutzung von Terraform zur Optimierung Ihrer Infrastruktur finden Sie in der offiziellen Terraform-Dokumentation. Dieses Tutorial ist Teil der Reihe „Infrastrukturverwaltung mit Terraform“. Diese Reihe behandelt verschiedene Terraform-Themen, von der Erstinstallation bis hin zur Verwaltung komplexer Projekte.

Schreibe einen Kommentar

Deine E-Mail-Adresse wird nicht veröffentlicht. Erforderliche Felder sind mit * markiert

Das könnte Ihnen auch gefallen