Navigator’s Guide: Konfiguration der modularen Infrastruktur

[.Hinweis]##

Note: Dies ist eine frühe Version des Inhalts des Navigator-Handbuchs, ein Angebot der DigitalOcean Solutions Engineers. Ziel des Buches ist es, Geschäftskunden bei der Planung ihrer Infrastrukturanforderungen zu unterstützen, Arbeitsbeispiele bereitzustellen sowie technische Details und das „Warum“ zu berücksichtigen, mit dem einige Entscheidungen besser als andere getroffen werden.

Das Buch und der zugehörige Code werden öffentlich in einem GitHub-Repository verfügbar sein. Da es sich um eine frühe Version handelt, ist das Buch noch nicht vollständig und das Repository noch nicht öffentlich, aber bleiben Sie dran!

Der vorherige Abschnitt verwendete Terraform und Ansible, um Ressourcen (Droplets, Load Balancers und Floating IPs) bereitzustellen und Ihre WordPress-Anwendung bereitzustellen.

Terraform hat diese Ressourcen mit der Dateimain.tferstellt. Derzeit werden alle Ressourcen in dieser Datei einzeln aufgelistet. Je komplexer Ihre Umgebung wird, desto mehr Ressourcen werden Sie benötigen und desto länger und komplizierter wird diese Datei. Dadurch wird es auf lange Sicht schwieriger, Ihre Konfiguration zu verwalten.

In diesem ergänzenden Abschnitt werden einige Möglichkeiten zur Vereinfachung dieser Konfiguration mithilfe von Terraform-Modulen und separaten Infrastrukturumgebungen erläutert. In diesem Abschnitt muss kein Code ausgeführt und keine Änderungen vorgenommen werden. Die Konzepte sind jedoch wichtig, wenn Sie ein reales Setup erstellen.

Grundlegendes zu Terraform-Modulen

So verwenden Sie die Terraform-eigene Modulbeschreibung:

Module in Terraform sind eigenständige Pakete von Terraform-Konfigurationen, die als Gruppe verwaltet werden. Module werden verwendet, um wiederverwendbare Komponenten in Terraform sowie für die grundlegende Code-Organisation zu erstellen.

Module erstellen Blöcke wiederverwendbarer Infrastruktur, die Eingaben übernehmen und Ausgaben bereitstellen können, wie eine Funktion in einer höheren Programmiersprache. Wir können Module erstellen, die optionale Eingabeargumente für ähnliche Teile unserer Infrastruktur akzeptieren, und auch Standardwerte für diese Eingabeparameter festlegen. Dies erleichtert die Organisation und Vereinfachung Ihrer Konfiguration. Weitere Informationen zu Modulen finden Sie inTerraform’s module documentation.

Ein vollständiges Beispiel finden Sie in der Dateimain.tf. Der letzte Abschnitt verwendet tatsächlich bereits ein Terraform-Modul:

module "sippin_db" {
  source           = "github.com/cmndrsp0ck/galera-tf-mod.git?ref=v1.0.6"
  ...
}

Sie können diesen Abschnitt mit dem Ressourcenblock fürwp_node am Anfang der Datei vergleichen, der viel mehr Codezeilen enthält und schwerer zu befolgen ist. Sie werden feststellen, dass das Modul über ein Remote-Git-Repository aufgerufen wird. Sie können lokale Dateipfade verwenden, die für eine schnelle Entwicklung und zum Testen geeignet sind. Mit einem Remote-Git-Repo können Sie Ihre Umgebungsisolation jedoch noch einen Schritt weiter verbessern. Dies ist besonders hilfreich, wenn mehrere Infrastrukturumgebungen ausgeführt werden, z. B. Staging und Produktion. Wenn Sie lokale Dateipfade mit mehreren Infrastrukturumgebungen verwenden, können Sie am Ende eine Änderung vornehmen, die sich nur auf das Staging auswirkt. Wenn Sie jedoch eine Anwendung aufprod ausführen und der Moduldateipfad freigegeben wird, können Sie das Programm beenden etwas zerbrechen. Wenn Sie für jede Umgebung dedizierte Verzeichnisse haben, müssen Sie am Ende zwei oder mehr Kopien Ihrer Skripte verwalten, und das Zurücksetzen auf einen früheren Status ist nicht so einfach.

Die Verwendung eines entfernten Git-Repositorys und die Angabe einer Versionsnummer für das Modul vermeidet dieses Problem. Wie bereits erwähnt, erleichtert dies das Zurücksetzen auf eine bekannte Arbeitsversion erheblich, wenn ein Fehler auftritt, wodurch Sie besser in der Lage sind, Vorfälle und Ausfälle zu verwalten (auf die wir in Kapitel 9 näher eingehen).

Dieses Modul erstellt nicht nur ein einzelnes Droplet. Es werden Droplet-Tags, die Galera-Cluster-Knoten, die Load Balancer und die Floating-IP erstellt. Sie können sich terraform-Module als eine schöne Art und Weise vorstellen, Komponenten eines gesamten Service zu verpacken. Dies bedeutet auch, dass Sie einem Modul mehr Ressourcen hinzufügen oder Modulausgaben erstellen können, die wiederum als Eingaben für andere Module verwendet werden können, die Sie möglicherweise entwickeln. Wenn es sinnvoll ist, ein neues Modul zu erstellen, wie das Hinzufügen eines neuen Dienstes oder eine unterstützende Funktion, die Sie entkoppeln möchten, können Sie in Ihren Modulen auf jeden Fall Ausgaben erstellen, die als Teil Ihres Status gespeichert werden. Wenn Sie den Remote-Status verwenden, können die Modulausgaben sehr nützlich sein, wenn Sie schreibgeschützte Informationen zwischen verschiedenen Komponenten Ihrer Infrastruktur austauschen oder einem externen Dienst eine Möglichkeit bieten möchten, die erforderlichen Informationen abzurufen.

Einfach ausgedrückt, wenn Sie sich die Ressourcenabschnitte in einem Terraform-Plan als Legosteine ​​vorstellen, sind Ihre Module vormontierte Abschnitte. Das ist viel besser, als Legosteine ​​überall aufzuspüren und möglicherweise auf einen zu treten. Die Module tragen nicht nur dazu bei, diese Schmerzen zu vermeiden, sondern können auch dazu verwendet werden, die Konfigurationen anderer Module mitzuteilen, wenn Sie Ihrem Infrastrukturplan Komplexität hinzufügen.

Einrichten von Infrastrukturumgebungen

In den meisten professionellen Projekten arbeiten Sie mit drei verschiedenen Umgebungen: Entwicklung, Inszenierung und Produktion.

Ihre Entwicklungsumgebung ist häufig lokal und bietet Ihnen die Möglichkeit, während der Arbeit selbstständig zu basteln und zu testen. Ihre Staging- und Produktionsumgebungen hingegen befinden sich in einem gemeinsamen oder öffentlichen Bereich und werden mithilfe eines automatisierten Prozesses wie Terraform bereitgestellt.

Das Beginnen mit einem durchdachten und geplanten Bereitstellungsworkflow trägt wesentlich dazu bei, Kopfschmerzen zu vermeiden, und ein Teil davon umfasst das Isolieren von Umgebungen voneinander. Die Arbeitsbereichsfunktion von Terraform hältterraform.tfstate-Dateien pro Umgebung getrennt, Änderungen an Terraform-Dateien, die Ihre Ressourcen beschreiben, jedoch nicht. Diese Funktion eignet sich zwar hervorragend als schnelle Methode zum Vornehmen kleinerer Änderungen, Tests und Bereitstellungen. Sie sollte jedoch nicht verwendet werden, wenn Sie über eine größere Bereitstellung verfügen, bei der Dienste und Teams möglicherweise voneinander isoliert werden müssen das schafft sie.

In der folgenden Beispielverzeichnisstruktur wird beschrieben, wie Sie die Umgebungsisolation mit Verzeichnissen einrichten können:

.
├── ansible.cfg
├── bin/
├── environments/
│   ├── config/
│   │   └── cloud-config.yaml
│   │
│   ├── dev/
│   ├── prod/
│   │   ├── config -> ../config
│   │   ├── group_vars
│   │   ├── host_vars
│   │   ├── main.tf
│   │   ├── terraform.tfvars
│   │   ├── terraform-inventory -> ../terraform-inventory
│   │   └── variables.tf
│   │
│   ├── staging/
│   │   ├── config -> ../config
│   │   ├── group_vars
│   │   ├── host_vars
│   │   ├── main.tf
│   │   ├── terraform.tfvars
│   │   ├── terraform-inventory -> ../terraform-inventory
│   │   └── variables.tf
│   │
│   └── terraform-inventory
│
├── site.yml
├── wordpress.yml
│
└── roles/

Die Schlüssellogik hinter dieser Art von Layout besteht darin, Dateien, die sich auf ähnliche Komponenten beziehen, in separaten Umgebungen voneinander zu trennen.

Im Verzeichnisenvironments haben wir beispielsweise ein Unterverzeichnis für jede der drei gewünschten Umgebungen:dev,staging undprod. Diese Isolierung verhindert, dass ein Ansible- oder Terraform-Skript versehentlich am falschen Ort ausgeführt wird. Sie können einen Schritt weiter gehen und eine andere Ebene von Unterverzeichnissen verwenden, um Dateien für verschiedene Teile der Infrastruktur jeder Umgebung zu speichern.

Es sindmany great write-ups about this topic online, von denen eines tatsächlich zu dem BuchTerraform: Up & Running von Yevgeniy Brikman geworden ist.

Verwenden der Modulversionierung für Umgebungen

Mit Terraform-Modulen können Sie auch Änderungen vornehmen, ohne andere Umgebungen zu beeinträchtigen. Schauen Sie sich zum Beispiel diese beiden Module an.

Eine für eine Staging-Umgebung (z. B.staging/main.tf):

module "sippin_db" {
  source           = "github.com/cmndrsp0ck/galera-tf-mod.git?ref=v1.0.8"
  project          = "${var.project}"
  region           = "${var.region}"
  keys             = "${var.keys}"
  private_key_path = "${var.private_key_path}"
  ssh_fingerprint  = "${var.ssh_fingerprint}"
  public_key       = "${var.public_key}"
  ansible_user     = "${var.ansible_user}"
}

Und eine für eine Produktionsumgebung (zum Beispielprod/main.tf):

module "sippin_db" {
  source           = "github.com/cmndrsp0ck/galera-tf-mod.git?ref=v1.0.6"
  project          = "${var.project}"
  region           = "${var.region}"
  keys             = "${var.keys}"
  private_key_path = "${var.private_key_path}"
  ssh_fingerprint  = "${var.ssh_fingerprint}"
  public_key       = "${var.public_key}"
  ansible_user     = "${var.ansible_user}"
}

Der einzige Unterschied zwischen ihnen ist der Wert für den Schlüsselrefam Ende der Zeilesource, der die zu implementierende Version angibt. In der Inszenierung sind esv1.0.8 und in der Produktionv1.0.6. Mit der Versionskontrolle können Sie Änderungen im Staging vornehmen und testen, bevor Sie es in der Produktion bereitstellen. Solche Setups vereinfachen die Konfiguration, die dies unterstützt.

Im Moment wird für die praktische Einrichtung im vorherigen Abschnitt der Remote-Status nicht verwendet. In Kapitel 6 behandeln wir die Verwendung eines Remote-State-Backends (wie Consul), das für die Arbeit in einem Team von entscheidender Bedeutung ist. Ohne ein Remote-Status-Backend können sowohl Sie als auch ein anderes Teammitglied gleichzeitig Änderungen an der Infrastruktur vornehmen, was zu Konflikten, Ausfällen oder zur Beschädigung Ihrer Statusdatei führt.

Was kommt als nächstes?

Nachdem Sie verstanden haben, wie Sie Ihren Infrastrukturcode durch Modularisierung vereinfachen und Umgebungen für eine sicherere Entwicklung und Bereitstellung isolieren können, können Sie die Bereitstellungsgeschwindigkeit durch Erstellen von Vorlagen erhöhen. Im nächsten Kapitel wird erläutert, wie Sie den Bereitstellungsworkflow mithilfe von Tools für die kontinuierliche Entwicklung automatisieren, mit denen Sie neuen Code sicher und schnell bereitstellen können.