Der Autor wählte den Free and Open Source Fund, um eine Spende im Rahmen des Programms Write for DOnations zu erhalten.
Vault von Hashicorp ist ein Open Source Tool, um Zugangsdaten und sensible Daten in dynamischen Cloud-Umgebungen sicher zu speichern. Es bietet eine starke Datenverschlüsselung, identitätsbasierten Zugriff unter Verwendung von benutzerdefinierten Richtlinien, geheimes Leasen und Widerrufen sowie ein ausführliches Auditprotokoll, das fortlaufend aufgezeichnet wird. Vault bietet zudem eine HTTP-API und ist damit die ideale Wahl für die Speicherung von Anmeldeinformationen in verstreuten serviceorientierten Implementierungen wie Kubernetes.
Packer und Terraform, ebenfalls von Hashicorp entwickelt, können zusammen verwendet werden, um Bilder von Vault zu kreieren und bereitzustellen. Innerhalb dieses Workflows können Entwickler Packer verwenden, um unveränderliche Bilder für verschiedene Plattformen aus einer einzelnen Konfigurationsdatei zu erstellen, die angibt, was das Bild enthalten soll. Terraform stellt dann so viele angepasste Exemplare der erstellten Bilder bereit, wie benötigt werden.
In diesem Tutorial erstellen Sie mit Packer einen unveränderlichen Snapshot des Systems mit installiertem Vault und orchestrieren dessen Bereitstellung mit Terraform. Zum Schluss verfügen Sie über ein automatisiertes System zur Bereitstellung von Vault. So können Sie sich anstatt auf den zugrunde liegenden Installations- und Bereitstellungsprozess auf die Arbeit mit Vault selbst konzentrieren.
In diesem Schritt schreiben Sie eine Packer-Konfigurationsdatei, die sogenannte Vorlage, die Packer anweist, wie ein Bild mit vorinstalliertem Vault erstellt werden kann. Sie schreiben die Konfiguration im Format JSON, einem gängigen, visuell lesbaren Dateiformat.
Für die Zwecke dieses Tutorials speichern Sie alle Dateien unter ~/vault-orchestration
. Erstellen Sie das Verzeichnis, indem Sie den folgenden Befehl ausführen:
- mkdir ~/vault-orchestration
Navigieren Sie dorthin:
- cd ~/vault-orchestration
Sie speichern die Konfigurationsdateien für Packer und Terraform separat in verschiedenen Unterverzeichnissen. Erstellen Sie diese mit dem folgenden Befehl:
- mkdir packer terraform
Da Sie zuerst mit Packer arbeiten, navigieren Sie in dessen Verzeichnis:
- cd packer
Die Speicherung von privaten Daten und Zugangsdaten für Applikationen in einer separaten Variablendatei ist der ideale Weg, diese aus Ihrer Vorlage herauszuhalten. Beim Erstellen des Bildes ersetzt Packer die angegebenen Variablen mit ihren Werten. Die Hartkodierung von geheimen Datenwerten in Ihre Vorlage ist ein Sicherheitsrisiko, insbesondere wenn sie mit Teammitgliedern geteilt oder auf öffentlichen Websites wie GitHub veröffentlicht werden soll.
Sie speichern diese im Unterverzeichnis packer
, in einer Datei namens variables.json
. Erstellen Sie sie mit Ihrem bevorzugten Texteditor:
- nano variables.json
Fügen Sie die folgenden Zeilen hinzu:
{
"do_token": "your_do_api_key",
"base_system_image": "ubuntu-18-04-x64",
"region": "nyc3",
"size": "s-1vcpu-1gb"
}
Die Variablendatei besteht aus einem JSON-Wörterbuch, das die Variablennamen ihren Werten zuordnet. Sie verwenden diese Variablen in der Vorlage, die Sie erstellen. Wenn Sie möchten, können Sie die Werte Basisbild, Region und Droplet-Größe entsprechend den Entwicklerdokumenten bearbeiten.
Denken Sie daran, your_do_api_key
durch Ihren API-Schlüssel zu ersetzen, den Sie als Teil der Voraussetzungen erstellt haben. Speichern und schließen Sie dann die Datei.
Mit der fertigen Variablendatei erstellen Sie nun die Packer-Vorlage selbst.
Sie speichern die Packer-Vorlage für Vault in einer Datei namens template.json
. Erstellen Sie sie mit Ihrem Texteditor:
- nano template.json
Fügen Sie die folgenden Zeilen hinzu:
{
"builders": [{
"type": "digitalocean",
"api_token": "{{user `do_token`}}",
"image": "{{user `base_system_image`}}",
"region": "{{user `region`}}",
"size": "{{user `size`}}",
"ssh_username": "root"
}],
"provisioners": [{
"type": "shell",
"inline": [
"sleep 30",
"sudo apt-get update",
"sudo apt-get install unzip -y",
"curl -L https://releases.hashicorp.com/vault/1.3.2/vault_1.3.2_linux_amd64.zip -o vault.zip",
"unzip vault.zip",
"sudo chown root:root vault",
"mv vault /usr/local/bin/",
"rm -f vault.zip"
]
}]
}
In der Vorlage definieren Sie Arrays von Buildern und Provisionern. Builder weisen Packer an, wie das Systembild (je nach Typ) zu erstellen ist und wo es gespeichert werden soll, während Provisioner eine Reihe von Aktionen enthalten, die Packer auf dem System durchführen muss, bevor es in ein unveränderliches Bild umgewandelt wird, wie z. B. die Installation oder Konfiguration von Software. Ohne Provisioner würden Sie zum Schluss ein unangetastetes Bild des Basissystems erhalten. Sowohl Builder als auch Provisioner stellen Parameter zur weiteren Anpassung des Workflows zur Verfügung.
Sie definieren zuerst einen einzelnen Builder des Typs digitalocean
, d. h. dass Packer beim Befehl zur Erstellung eines Bildes die bereitgestellten Parameter verwendet, um mit dem bereitgestellten API-Schlüssel ein temporäres Droplet der definierten Größe zu erstellen, mit dem angegebenen Basissystembild und der angegebenen Region. Das Format zum Abrufen einer Variablen ist {{user 'variable_name'}}
, wobei der hervorgehobene Teil der Name ist.
Wenn das provisorische Droplet bereitgestellt ist, stellt der Provisioner eine Verbindung über SSH mit dem angegebenen Benutzernamen her und führt nacheinander alle definierten Provisioner aus, bevor ein DigitalOcean Snapshot aus dem Droplet erstellt und es gelöscht wird.
Es handelt sich um eine Shell
, die die angegebenen Befehle auf dem Ziel ausführt. Die Befehle können entweder inline
als Array von Zeichenfolgen angegeben oder in getrennten Skriptdateien definiert werden, wenn das Einfügen in die Vorlage aufgrund der Größe zu umständlich wird. Die Befehle in der Vorlage warten 30 Sekunden, bis das System hochgefahren ist. Anschließend wird Vault 1.3.2 heruntergeladen und entpackt. Konsultieren Sie die Offizielle Vault Downloadseite und ersetzen Sie den Link in den Befehlen durch eine neuere Version für Linux, wenn verfügbar.
Wenn Sie fertig sind, speichern und schließen Sie die Datei.
Um die Gültigkeit Ihrer Vorlage zu überprüfen, führen Sie den folgenden Befehl aus:
- packer validate -var-file=variables.json template.json
Packer akzeptiert einen Pfad zur Variablendatei über das Argument -var-file
.
Sie sehen die folgende Ausgabe:
OutputTemplate validated successfully.
Sollten Sie eine Fehlermeldung erhalten, gibt Packer genau an, wo dieser aufgetreten ist, sodass Sie diesen korrigieren können.
Nun haben Sie eine funktionierende Vorlage, die ein Bild mit installiertem Vault erzeugt, wobei Ihr API-Schlüssel und andere Parameter in einer separaten Datei definiert sind. Jetzt können Sie Packer aufrufen und den Snapshot erstellen.
In diesem Schritt erstellen Sie einen DigitalOcean Snapshot aus Ihrer Vorlage mit dem Packerbefehl build
.
Um Ihren Snapshot zu erstellen, führen Sie den folgenden Befehl aus:
- packer build -var-file=variables.json template.json
Die Ausführung des Befehls nimmt etwas Zeit in Anspruch. Sie sehen eine Menge Ausgabe, die so aussehen wird:
Outputdigitalocean: output will be in this color.
==> digitalocean: Creating temporary ssh key for droplet...
==> digitalocean: Creating droplet...
==> digitalocean: Waiting for droplet to become active...
==> digitalocean: Using ssh communicator to connect: ...
==> digitalocean: Waiting for SSH to become available...
==> digitalocean: Connected to SSH!
==> digitalocean: Provisioning with shell script: /tmp/packer-shell035430322
...
==> digitalocean: % Total % Received % Xferd Average Speed Time Time Time Current
==> digitalocean: Dload Upload Total Spent Left Speed
digitalocean: Archive: vault.zip
==> digitalocean: 100 45.5M 100 45.5M 0 0 154M 0 --:--:-- --:--:-- --:--:-- 153M
digitalocean: inflating: vault
==> digitalocean: Gracefully shutting down droplet...
==> digitalocean: Creating snapshot: packer-1581537927
==> digitalocean: Waiting for snapshot to complete...
==> digitalocean: Destroying droplet...
==> digitalocean: Deleting temporary ssh key...
Build 'digitalocean' finished.
==> Builds finished. The artifacts of successful builds are:
--> digitalocean: A snapshot was created: 'packer-1581537927' (ID: 58230938) in regions '...'
Packer protokolliert alle Schritte, die es beim Erstellen Ihrer Vorlage vorgenommen hat. Die letzte Zeile enthält den Namen des Snapshots (wie packer-1581537927
) und seine rot markierte ID in Klammern. Notieren Sie die ID Ihres Snapshots, da Sie diese im nächsten Schritt benötigen.
Falls der Build-Prozess durch Fehler in der API fehlschlägt, warten Sie einige Minuten und versuchen Sie es dann erneut.
Sie haben nun einen DigitalOcean Snapshot entsprechend Ihrer Vorlage erstellt. Auf dem Snapshot ist Vault vorinstalliert und Sie können nun Droplets mit ihm als Systembild bereitstellen. Im nächsten Schritt schreiben Sie die Terraform-Konfiguration zur Automatisierung solcher Bereitstellungen.
In diesem Schritt schreiben Sie die Terraform-Konfiguration zur Automatisierung der Droplet-Bereitstellungen des Snapshots, der den gerade mit Packer erstellten Vault enthält.
Bevor Sie die eigentliche Terraform-Konfiguration zur Bereitstellung von Vault aus dem zuvor erstellten Snapshot schreiben, müssen Sie hierzu zunächst den DigitalOcean-Provider konfigurieren. Navigieren Sie zum Terraform
-Unterverzeichnis, indem Sie Folgendes ausführen:
- cd ~/vault-orchestration/terraform
Erstellen Sie dann eine Datei namens do-provider.tf
, in der Sie den Provider speichern:
- nano do-provider.tf
Fügen Sie die folgenden Zeilen hinzu:
variable "do_token" {
}
variable "ssh_fingerprint" {
}
variable "instance_count" {
default = "1"
}
variable "do_snapshot_id" {
}
variable "do_name" {
default = "vault"
}
variable "do_region" {
}
variable "do_size" {
}
variable "do_private_networking" {
default = true
}
provider "digitalocean" {
token = var.do_token
}
Diese Datei gibt Parametervariablen an und verleiht dem digitalocean
-Provider einen API-Schlüssel. Sie verwenden diese Variablen später in Ihrer Terraform-Vorlage, aber Sie müssen zuerst deren Werte festlegen. Zu diesem Zweck unterstützt Terraform die Angabe der variablen Werte in einer Variablendefinitionsdatei, ähnlich wie bei Packer. Der Dateiname muss entweder in .tfvars
oder .tfvars.json
enden. Sie übergeben diese Datei später an Terraform mit dem Argument -var-file
.
Speichern und schließen Sie die Datei.
Erstellen Sie eine Variablendefinitionsdatei mit dem Namen definitions.tfvars
mithilfe Ihres Texteditors:
- nano definitions.tfvars
Fügen Sie die folgenden Zeilen hinzu:
do_token = "your_do_api_key"
ssh_fingerprint = "your_ssh_key_fingerprint"
do_snapshot_id = your_do_snapshot_id
do_name = "vault"
do_region = "nyc3"
do_size = "s-1vcpu-1gb"
instance_count = 1
Ersetzen Sie your_do_api_key
, your_ssh_key_fingerprint
und your_do_snapshot_id
jeweils mit dem API-Schlüssel Ihres Kontos, dem Fingerabdruck Ihres SSH-Schlüssels und der aus dem vorherigen Schritt erhaltenen Snapshot-ID. Die Parameter do_region
und do_size
müssen die gleichen Werte wie in der Packer-Variablendatei haben. Wenn Sie mehrere Exemplare gleichzeitig bereitstellen möchten, stellen Sie instance_count
auf den gewünschten Wert.
Danach speichern und schließen Sie die Datei.
Weitere Informationen über den DigitalOcean Terraform Provider finden Sie in den Offiziellen Dokumenten.
Sie speichern die Vault Snapshot-Bereitstellungskonfiguration in einer Datei namens deployment.tf
, unter dem Verzeichnis terraform
. Erstellen Sie sie mit Ihrem Texteditor:
- nano deployment.tf
Fügen Sie die folgenden Zeilen hinzu:
resource "digitalocean_droplet" "vault" {
count = var.instance_count
image = var.do_snapshot_id
name = var.do_name
region = var.do_region
size = var.do_size
private_networking = var.do_private_networking
ssh_keys = [
var.ssh_fingerprint
]
}
output "instance_ip_addr" {
value = {
for instance in digitalocean_droplet.vault:
instance.id => instance.ipv4_address
}
description = "The IP addresses of the deployed instances, paired with their IDs."
}
Hier definieren Sie eine einzelne Ressource des Typs digitalocean_droplet
namens vault
. Danach legen Sie seine Parameter entsprechend den Variablenwerten fest und fügen einen SSH-Schlüssel (mit seinem Fingerabdruck) von Ihrem DigitalOcean-Konto zur Droplet-Ressource hinzu. Zum Schluss erfolgt das output
der IP-Adressen aller neu erstellten Exemplare an die Konsole.
Speichern und schließen Sie die Datei.
Bevor Sie die Bereitstellungskonfiguration einsetzen, müssen Sie das Verzeichnis als Terraform-Projekt initialisieren:
- terraform init
Sie sehen die folgende Ausgabe:
Output
Initializing the backend...
Initializing provider plugins...
The following providers do not have any version constraints in configuration,
so the latest version was installed.
To prevent automatic upgrades to new major versions that may contain breaking
changes, it is recommended to add version = "..." constraints to the
corresponding provider blocks in configuration, with the constraint strings
suggested below.
* provider.digitalocean: version = "~> 1.14"
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.
Bei der Initialisierung eines Verzeichnisses als Projekt liest Terraform die verfügbaren Konfigurationsdateien ein und lädt die als notwendig erachteten Plugins herunter, wie in der Ausgabe protokolliert.
Sie verfügen jetzt über die Terraform-Konfiguration, um Ihren Vault Snapshot bereitzustellen. Sie können diese nun validieren und in einem Droplet bereitstellen.
In diesem Abschnitt verifizieren Sie die Terraform-Konfiguration mit dem Befehl validate
. Nach erfolgreicher Verifizierung wenden Sie sie mit apply
an und stellen als Ergebnis ein Droplet bereit.
Führen Sie den folgenden Befehl aus, um die Gültigkeit Ihrer Konfiguration zu testen:
- terraform validate
Sie sehen die folgende Ausgabe:
OutputSuccess! The configuration is valid.
Führen Sie als Nächstes den Befehl plan
aus, um zu sehen, wie Terraform sich verhält, um die Infrastruktur entsprechend Ihrer Konfiguration bereitzustellen:
- terraform plan -var-file="definitions.tfvars"
Terraform akzeptiert eine Variablendefinitionsdatei mit dem Parameter -var-file
.
Die Ausgabe wird ähnlich sein wie diese:
OutputRefreshing Terraform state in-memory prior to plan...
The refreshed state will be used to calculate this plan, but will not be
persisted to local or remote state storage.
------------------------------------------------------------------------
An execution plan has been generated and is shown below.
Resource actions are indicated with the following symbols:
+ create
Terraform will perform the following actions:
# digitalocean_droplet.vault[0] will be created
+ resource "digitalocean_droplet" "vault" {
...
}
Plan: 1 to add, 0 to change, 0 to destroy.
------------------------------------------------------------------------
Note: You didn't specify an "-out" parameter to save this plan, so Terraform
can't guarantee that exactly these actions will be performed if
"terraform apply" is subsequently run.
Das grüne +
am Anfang der Zeile resource "digitalocean_droplet" "vault"
bedeutet, dass Terraform ein neues Droplet mit dem Namen vault
erstellt, wobei es folgende Parameter verwendet. Das ist korrekt und nun können Sie den Plan mit terraform apply
ausführen:
- terraform apply -var-file="definitions.tfvars"
Geben Sie bei Nachfrage yes
ein. Nach einigen Minuten ist die Bereitstellung durch das Droplet abgeschlossen und Sie sehen eine Ausgabe ähnlich wie diese:
OutputAn execution plan has been generated and is shown below.
Resource actions are indicated with the following symbols:
+ create
Terraform will perform the following actions:
+ digitalocean_droplet.vault-droplet
...
Plan: 1 to add, 0 to change, 0 to destroy.
...
digitalocean_droplet.vault-droplet: Creating...
...
Apply complete! Resources: 1 added, 0 changed, 0 destroyed.
Outputs:
instance_ip_addr = {
"181254240" = "your_new_server_ip"
}
In der Ausgabe protokolliert Terraform die ausgeführten Aktionen (in diesem Fall zur Erstellung eines Droplets) und zeigt am Ende seine öffentliche IP-Adresse an. Diese nutzen Sie, um sich im nächsten Schritt mit Ihrem neuen Droplet zu verbinden.
Sie haben ein neues Droplet aus dem Snapshot mit Vault erstellt und können es nun verifizieren.
In diesem Schritt greifen Sie mit SSH auf Ihr neues Droplet zu und verifizieren, dass Vault korrekt installiert wurde.
Wenn Sie mit Windows arbeiten, können Sie Software wie Kitty oder Putty verwenden, um sich mit dem Droplet über einen SSH-Schlüssel zu verbinden.
Auf Linux- und macOS-Rechnern können Sie den bereits verfügbaren Befehl ssh
verwenden, um eine Verbindung herzustellen:
- ssh root@your_server_ip
Geben Sie bei Nachfrage yes
ein. Nach der Anmeldung starten Sie Vault, indem Sie Folgendes ausführen:
- vault
Sie sehen seine “Hilfe”-Ausgabe, die folgendermaßen aussieht:
OutputUsage: vault <command> [args]
Common commands:
read Read data and retrieves secrets
write Write data, configuration, and secrets
delete Delete secrets and configuration
list List data or secrets
login Authenticate locally
agent Start a Vault agent
server Start a Vault server
status Print seal and HA status
unwrap Unwrap a wrapped secret
Other commands:
audit Interact with audit devices
auth Interact with auth methods
debug Runs the debug command
kv Interact with Vault's Key-Value storage
lease Interact with leases
namespace Interact with namespaces
operator Perform operator-specific tasks
path-help Retrieve API help for paths
plugin Interact with Vault plugins and catalog
policy Interact with policies
print Prints runtime configurations
secrets Interact with secrets engines
ssh Initiate an SSH session
token Interact with tokens
Sie können die Verbindung durch Eingabe von exit
beenden.
Sie haben nun verifiziert, dass Ihr neu bereitgestelltes Droplet aus dem von Ihnen erstellten Snapshot kreiert wurde, und dass Vault korrekt installiert ist.
Sie verfügen jetzt über ein automatisiertes System zur Bereitstellung von Hashicorp Vault auf DigitalOcean Droplets mit Unterstützung von Terraform und Packer. Sie können nun so viele Vault-Server bereitstellen, wie Sie benötigen. Um Vault zu verwenden, müssen Sie es initialisieren und weiter konfigurieren. Anweisungen hierzu finden Sie in den Offiziellen Dokumenten.
Weitere Tutorials zur Verwendung von Terraform finden Sie auf der Terraform Content Page.
Thanks for learning with the DigitalOcean Community. Check out our offerings for compute, storage, networking, and managed databases.
This textbox defaults to using Markdown to format your answer.
You can type !ref in this text area to quickly search our full set of tutorials, documentation & marketplace offerings and insert the link!