172 lines
5.8 KiB
Markdown
172 lines
5.8 KiB
Markdown
---
|
|
gitea: none
|
|
include_toc: true
|
|
---
|
|
# Installation von VMs bei Hetzner
|
|
|
|
## Grundlagen
|
|
|
|
Mit Opentofu wurde von Terraform geforkt, als das Terraform die Lizenz änderte
|
|
und Terraform damit vom OpenSource-Gedanken etwas abrückte.
|
|
|
|
Das Grundkonzept besteht darin, dass in über die Konfigurationssprache "hcl"
|
|
die Infrastruktur beschrieben wird, die man einrichten möchte.
|
|
|
|
Die Infrastruktur-Beschreibungen werden in eine oder mehrere Dateien mit der
|
|
Dateiendung '.tf' gespeichert.
|
|
|
|
In den Dateien werden die Resourcen beschrieben. Hier einmal ein Beispiel
|
|
für die Resource, die einen ssh-Publickey enthält:
|
|
|
|
```hcl
|
|
resource "hcloud_ssh_key" "default" {
|
|
name = "treff-key"
|
|
public_key = file("~/.ssh/id_ed25519.pub")
|
|
}
|
|
```
|
|
|
|
"resource" leitet dabei einen Block für eine einzelne Resource ein.
|
|
|
|
"hcloud_ssh_key" ist der Resource-Typ. In diesem Fall ein ssh-Key für die
|
|
Hetzner-Cloud. Nach dem Resource-Typ richtet sich, welche eigenenschaften diese
|
|
Resource haben kann.
|
|
|
|
"default" ist der Tofu name für diese Resource. Diese muss pro Resource-Typ
|
|
eindeutig sein.
|
|
|
|
An anderer Stelle kann auf diese Resource verwiesen werden, wenn man in der
|
|
Form "hcloud_ssh_key.default.public_key" darauf verweis.
|
|
|
|
Als Attribut "name" wird der Name konfiguriert, über den diese Key in der
|
|
Hetzner Cloud-Konsole angezeigt wird.
|
|
"public_key" enthält den öffentlichen Teil des ssh-Schlüssels.
|
|
|
|
Mit "file(...)" wird in diesem Beispiel der Inhalt einer lokalen Datei
|
|
eingelesen.
|
|
|
|
Außer "resource" gibt es noch weitere Objekt in den Tofu-Dateien.
|
|
Mit "variable" wird eine Variable definiert. Mit "output" kann man am Ende
|
|
einer Ausführung bestimmte Variablen ausgeben lassen.
|
|
|
|
Der große Unterschied zu anderen Ansätzen wie z.B. Ansible ist, dass Tofu
|
|
den Status der angelegten Resourcen speichert.
|
|
|
|
Bei der ersten Anwendung wird eine Datei `terraform.tfstate` angelegt, die alle
|
|
notwendigen Status-Informationen enthält.
|
|
|
|
Bei einer Hetzner-VM steht dort z.B. die eindeutige ID der VM, die die
|
|
Hetzner-API beim Anlegen zurückgegeben hat, in der Datei.
|
|
|
|
Durch diese Speicherung der Statusinformationen ist Terraform später in der
|
|
Lage, einen Abgleich zwischen aktuell laufender und in den Dateien beschriebenen
|
|
Resourcen zu erstellen.
|
|
|
|
Wurde eine VM beispielsweise in den Dateien mit mehr RAM ausgesattet, kann
|
|
Tofu dies erkennen und passt dann bei der nächsten Anwendung der RAM der laufenden
|
|
VM an.
|
|
|
|
## Hetzner Zugang
|
|
|
|
Die Hetzner-Cloud ist in Projekte unterteilt. Jedes Projekt kann von einen oder
|
|
mehrere API-Token haben. Diese API-Token bekommen entweder nur lesenden
|
|
oder lesenden und schreibenden Zugriff auf das betreffende Projekt.
|
|
|
|
Mit dem API-Token ist eine Automatisierung wie Opentofu in der Lage, die APIs
|
|
aufzurufen und sich zu identifizieren.
|
|
|
|
Damit solche Token nicht Bestandteil der Automatisierungsdateien sind und vor
|
|
allem nicht in Git-Repositories mit eingecheckt werden, lassen sich diese
|
|
separate Dateien mit Variablen verwenden, die die Tofu-Automatisierungen
|
|
einlesen können.
|
|
|
|
Diese Anleitung benötigt eine Datei `secrets.tfvars`, die bei den Aufrufen
|
|
mit angegeben wird. Die Datei hat folgenden Inhalt:
|
|
```
|
|
hcloud_token="SuperSecretToken"
|
|
```
|
|
|
|
In den Projekten können auch ssh-Keys hinterlegt werden. Diese werden bei der
|
|
Erstellung einer VM mit angegeben und dann automatisch beim root-User in der
|
|
erzeugten VM hinterlegt.
|
|
|
|
Zu Vereinfachung liest diese Automatisierung die Datei `~/.ssh/id_ed25519.pub`
|
|
ein und hinterlegt den Public-Key automatisch in dem Hetzner-Projekt.
|
|
|
|
## Initalisierung
|
|
|
|
Die Initalisierung lädt die notwendigen Provider herunter, die tofu benötigt,
|
|
um die Automatisierungen auszuführen. Provider sind dabei Plugins für tofu,
|
|
die einen bestimmten Funktionsumfang abbilden. In diesem Fall wird der Provider
|
|
für die Hetzner-Cloud nachgeladen, der die APIs von Hetzner kennt und diese
|
|
anspricht.
|
|
|
|
```
|
|
tofu init
|
|
```
|
|
|
|
Die Ausgaben sehen für dieses Projekt wie folgt aus:
|
|
|
|
```
|
|
$ tofu init
|
|
|
|
Initializing the backend...
|
|
|
|
Initializing provider plugins...
|
|
- Finding hetznercloud/hcloud versions matching "~> 1.60.1"...
|
|
- Installing hetznercloud/hcloud v1.60.1...
|
|
- Installed hetznercloud/hcloud v1.60.1 (signed, key ID 5219EACB3A77198B)
|
|
|
|
Providers are signed by their developers.
|
|
If you'd like to know more about provider signing, you can read about it here:
|
|
https://opentofu.org/docs/cli/plugins/signing/
|
|
|
|
OpenTofu 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 OpenTofu can guarantee to make the same selections by default when
|
|
you run "tofu init" in the future.
|
|
|
|
OpenTofu has been successfully initialized!
|
|
|
|
You may now begin working with OpenTofu. Try running "tofu plan" to see
|
|
any changes that are required for your infrastructure. All OpenTofu commands
|
|
should now work.
|
|
|
|
If you ever set or change modules or backend configuration for OpenTofu,
|
|
rerun this command to reinitialize your working directory. If you forget, other
|
|
commands will detect it and remind you to do so if necessary.
|
|
```
|
|
|
|
## Planung
|
|
|
|
In der Planung kann man sich anzeigen lassen, was tofu bei der Anwendung der
|
|
Konfiguration ändern würde.
|
|
|
|
Solange die VM noch nicht existiert, wird also angezeigt, dass alles neu erstellt werden muss.
|
|
|
|
```
|
|
tofu plan -var-file="secret.tfvars"
|
|
```
|
|
|
|
## Ausführung
|
|
|
|
Wenn man alles kontrolliert hat und die Änderungen so angewendet werden sollen,
|
|
wird der Plan angewendet.
|
|
|
|
```
|
|
tofu apply -var-file="secret.tfvars"
|
|
```
|
|
|
|
## Funktionstest
|
|
|
|
Am Ende der Ausführung zeigt tofu die IP-Adresse an, die die VM erhalten hat.
|
|
Mit einer ssh-Verbindung kann geprüft werden, ob alles funktioniert hat.
|
|
|
|
```
|
|
ssh -l root <die-ausgegebene-ip>
|
|
```
|
|
|
|
# Referenzen
|
|
|
|
* [OpenTofu Dokumentation](https://opentofu.org/docs/)
|
|
* [OpenTofu Registry](https://search.opentofu.org/)
|
|
* [Hetzner Provider für OpenTofu](https://search.opentofu.org/provider/opentofu/hcloud/latest)
|