opentofu-demo-hcloud/README.md

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>
```
## Links
* [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)