Hetzner bietet mit seiner Cloud virtuelle Server als lokale, sicherere Alternative gegenüber den einschlägigen Anbietern aus den USA. Wie bei jedem Hoster kann man sich eine VM in der Web-Oberfläche erstellen. Doch wer sich mit Automatisierung und damit z.B. Infrastruktur als Code (IaC) beschäftigt, möchte das gar nicht – sondern stattdessen die Ausstattung sowie Konfiguration in einer Datei festlegen, womit sich ein fertiges System per Knopfdruck einrichten lässt. Das ermöglicht Terraform und bietet einige Vorteile: Ein identisches Testsystem beispielsweise lässt sich mit wenig Aufwand erzeugen. Wie man Terraform zusammen mit der Hetzner Cloud verwendet, zeigt dieser Artikel.
Zugriffsschlüssel für Terraform in der Hetzner Cloud Konsole anlegen
In der Hetzner Cloud-Konsole öffnet ihr das gewünschte Projekt, für erste Tests genügt auch das standardmäßig vorhandene. Links in der Navigation auf den Schlüssel, der zum Bereich Sicherheit führt. Der Reiter API-Tokens ermöglicht es, einen Authentifizierungsschlüssel pro externer Anwendung zu erstellen. Darüber kann diese auf alle Ressourcen in dem Projekt zugreifen, ihr solltet diesen also wie ein Passwort behandeln. Standardmäßig sind keine vorhanden, ihr müsst also zunächst einen über den roten Knopf rechts oben erstellen. Ein Token pro Anwendung ist zu empfehlen.
Da Terraform ja Ressourcen wie z.B. Server anlegen soll, werden Schreibrechte benötigt. Der Lesende Zugriff macht an dieser Stelle wenig Sinn und ist für andere Anwendungszwecke vorgesehen. Das Beschreibungsfeld ist frei wählbar und dient zur Zuordnung.
Das generierte Token benötigen wir im nächsten Schritt für Terraform.
Anlegen eines Servers mit SSH-Schlüssel per Terraform
Als einfaches Beispiel für den Einstieg soll ein kleiner virtueller Server erstellt werden. Um bequem und sicher darauf zugreifen zu können, hinterlegen wir per Terraform unseren öffentlichen SSH-Schlüssel. Da die IP-Adresse von Hetzner zugeteilt wird, soll uns die Software zudem nach der Erstellung dessen IPv4-Adresse ausgeben. Die verfügbaren Server kann man über die Web-Oberfläche einsehen, nachdem man in einem Projekt oben auf den roten Server hinzufügen Knopf gedrückt hat. Obwohl wir den Server ja eben nicht per Hand zusammen klicken möchten, hilft dies für eine Übersicht der Server. In diesem Beispiel entscheide ich mich für CPX11, der 0,007 € pro Stunde bzw. 4,58 € im gesamten Monat kostet.
Das Kommandozeilenwerkzeug hcloud empfehle ich dafür nicht. Es zeigt zwar die Ausstattung der vServer an, jedoch nicht den Preis – diesen erfährt man nur über die Web-Oberfläche.
$ ./hcloud server-type list
ID NAME CORES CPU TYPE ARCHITECTURE MEMORY DISK STORAGE TYPE
1 cx11 1 shared x86 2.0 GB 20 GB local
3 cx21 2 shared x86 4.0 GB 40 GB local
5 cx31 2 shared x86 8.0 GB 80 GB local
Um mit Terraform zu beginnen, legt ihr zunächst einen Ordner als Arbeitsverzeichnis an. Der Code befindet sich in .tf Dateien mit frei wählbarem Name. Meist gibt es Konventionen und in größeren Projekten macht es auch durchaus Sinn, die Inhalte auf mehrere Dateien aufzuteilen. Für den ersten Einstieg kann darauf verzichtet werden und man arbeitet in einer einzigen Datei, die ich main.tf genannt habe.
Zuerst wird der Provider geladen. Er ist die Schnittstelle zwischen Terraform und Hetzner. Es gibt auch lokale Provider, die etwa KVM oder andere Virtualisierungslösungen nutzen. Da es sich bei Hetzner um einen Cloudanbieter handelt, wird das zuvor erstellte API-Token benötigt, um Zugriff auf unsere dortigen Projekte zu gewähren:
terraform {
required_providers {
hcloud = {
source = "hetznercloud/hcloud"
}
}
required_version = ">= 0.38.2"
}
provider "hcloud" {
token = "xxx"
}
Spannender ist der Hauptteil, in dem wir zuerst eine Ressource für den SSH-Schlüssel anlegen. Dieser muss auf eurem lokalen System existieren. Ich habe für die Demo-Server einen eigenen Schlüssel erstellt. Der test01 genannte hcloud_server bildet unsere VM ab. Sie bekommt einen Name, über den wir ihn verwalten können und auch übers Web wieder finden. server_type ist das zuvor per Web-Konsole ermittelte Paket, anhand dessen sowohl die gebotene Leistung, als auch der zu zahlende Preis bestimmt werden. Mit datacenter geben wir den Standort an, image definiert, welches Betriebssystemabbild der Server installiert bekommt. Wie ihr diese ermittelt und ändert, zeigt der folgende Abschnitt noch ausführlicher.
Die zwei unteren output sind für die Funktion unwichtig. Sie sorgen nur dafür, dass uns Terraform nach der Erstellung den Status sowie die öffentliche IP-Adresse des Servers ausgibt.
resource "hcloud_ssh_key" "key" {
name = "dani-pc_ansible-nopw"
public_key = file("~/.ssh/id_rsa_ansible_nopassword.pub")
}
resource "hcloud_server" "test01" {
name = "terraform-testserver01"
server_type = "cpx11"
datacenter = "fsn1-dc14"
image = "ubuntu-22.04"
ssh_keys = [hcloud_ssh_key.key.id]
}
output "ip" {
value = hcloud_server.test01.ipv4_address
}
output "status" {
value = hcloud_server.test01.status
}
$ terraform init
Initializing the backend...
Initializing provider plugins...
- Reusing previous version of hetznercloud/hcloud from the dependency lock file
- Using previously-installed hetznercloud/hcloud v1.38.2
Terraform has been successfully initialized!
Als nächstes können wir die Änderungen mit terraform apply anwenden. Der Befehl zeigt euch zunächst eine Übersicht, welche Ressourcen (Objekte) angelegt werden, damit man dies überprüfen kann. Vor allem bei produktiven Systemen ist dies wichtig, um ungewollte Änderungen zu verhindern.
Anschließend durch Eingabe von yes bestätigen und Terraform beginnt mit der Erstellung. Die Erstellung einer VM ohne weitere Konfiguration benötigt in meinen Tests rund 14 Sekunden. Abschließend informiert das Werkzeug, dass es zwei Objekte (den virtuellen Server sowie SSH-Schlüssel) angelegt hat:
Außerdem gibt das Programm unsere vorher definierten Ausgaben an. Sie zeigen uns neben der vom Hoster zugewiesenen IP-Adresse den Status der VM. Da sie läuft und bereit ist, lässt sich nun eine SSH-Verbindung mit dem zuvor angelegten Schlüssel erzeugen. Die frisch erstellte Maschine erscheint in der Hetzner-Konsole, wie jeder andere gemietete Server auch, den man beispielsweise von Hand über die Web-Oberfläche zusammen klickt:
Der Status wird in terraform.tfstate gespeichert. Führt man den Befehl ein zweites Mal aus, wird Terraform No changes anzeigen und daher nicht zur Bestätigung auffordern. Gibt es Veränderungen an den .tf Dateien, werden nur Abweichungen zur letzten Konfiguration (z.B. ein hinzugefügter SSH-Schüssel) erstellt bzw. angepasst.
Image und Datacenter ermitteln/ändern
Kommandozeilenwerkzeug hcloud einrichten
Die verfügbaren Lokationen sowie Betriebssystemabbilder lassen sich nicht über die Web-Oberfläche einsehen – zumindest nicht in der Form, wie wir es für Terraform benötigen. Hier hilft das hcloud Kommandozeilenwerkzeug. Es ist dafür gedacht, sämtliche Ressourcen in der Hetzner-Cloud über die Kommandozeile zu verwalten. Die verwendeten Bezeichnungen sind identisch zu Terraform, da deren Provider schlussendlich die gleiche Schnittstelle aufruft. Über die oben verlinkten Releases sucht ihr zur Installation nach dem aktuellsten Paket für Linux 386, ladet es herunter und entpackt das Archiv.
$ wget https://github.com/hetznercloud/cli/releases/download/v1.33.1/hcloud-linux-386.tar.gz
$ tar -xf hcloud-linux-386.tar.gz hcloud
$ ./hcloud version
hcloud 1.33.1
Damit wird die Binärdatei im aktuellen Arbeitsverzeichnis entpackt und kann mit ./hcloud aufgerufen werden. Für das erste Testprojekt ist das völlig ausreichend, wer öfter damit arbeitet, verschiebt sie stattdessen lieber in /usr/local/bin. So ist sie global auf dem gesamten System verfügbar und man hat das Werkzeug nicht in den Terraform Quellcode-Dateien. Einmalig muss es in jedem Fall mit dem gewünschten Projekt verknüpft werden:
./hcloud context create ul-demo
Hier ist ul-demo der selbst gewählte Name des Projektes. Um Zugriff zu erhalten, muss hier nochmals das am Anfang angelegte API-Token angegeben werden.
Verfügbare Rechenzentren und Abbilder mit hcloud ermitteln
Ein datacenter ist ein konkretes Rechenzentrum. Es ist wiederum einer Lokation zugeordnet. In welchem Land sich diese befindet, geht meist aus der Beschreibung hervor. Alternativ kann man sich die Lokationen auch auflisten, dort werden Stadt und Land noch einmal detailliert aufgelistet. Das im Beispiel verwendete fsn1-dc14 befindet sich also in Falkenstein (Deutschland).
$ ./hcloud datacenter list
ID NAME DESCRIPTION LOCATION
2 nbg1-dc3 Nuremberg 1 virtual DC 3 nbg1
3 hel1-dc2 Helsinki 1 virtual DC 2 hel1
4 fsn1-dc14 Falkenstein 1 virtual DC 14 fsn1
5 ash-dc1 Ashburn virtual DC 1 ash
6 hil-dc1 Hillsboro virtual DC 1 hil
./hcloud location list
ID NAME DESCRIPTION NETWORK ZONE COUNTRY CITY
1 fsn1 Falkenstein DC Park 1 eu-central DE Falkenstein
2 nbg1 Nuremberg DC Park 1 eu-central DE Nuremberg
3 hel1 Helsinki DC Park 1 eu-central FI Helsinki
4 ash Ashburn, VA us-east US Ashburn, VA
5 hil Hillsboro, OR us-west US Hillsboro, OR
Die verfügbaren Abbilder lassen sich per image list ausgeben. Derzeit sind 56 verfügbar, aufgrund der Länge habe ich die Liste gekürzt. Möglicherweise von euch angelegte Snapshots erscheinen darin übrigens ebenfalls.
$ ./hcloud image list
ID TYPE NAME DESCRIPTION ARCHITECTURE IMAGE SIZE DISK SIZE CREATED DEPRECATED
3 system centos-7 CentOS 7 x86 - 5 GB Mon Jan 15 12:34:45 CET 2018 -
168855 system ubuntu-18.04 Ubuntu 18.04 x86 - 5 GB Wed May 2 13:02:30 CEST 2018 -
5924233 system debian-10 Debian 10 x86 - 5 GB Mon Jul 8 08:35:48 CEST 2019 -
...
Fazit
Hetzner bietet als deutscher Anbieter ein hinsichtlich Datenschutz und Sicherheit attraktiveres Angebot gegenüber den großen ausländischen Cloudanbietern, die überwiegend aus den USA stammen. Wie üblich zahlt man die Flexibilität von Servern in der Cloud mit einem entsprechenden Aufpreis. Wer den bereit ist zu zahlen, kann in Kombination mit Terraform sehr einfach und schnell vollautomatisiert seine Infrastruktur anlegen – oder eben mit dem entsprechenden Provider lokal nutzen. Denn Terraform selbst ist vielfältig, neben verschiedenen Cloudanbietern werden auch zahlreiche On-Prem Plattformen wie VMWare, Proxmox, KVM und weitere unterstützt.