Mit Terraform automatisch virtuelle Server in der Hetzner Cloud anlegen

Mit Terraform automatisch virtuelle Server in der Hetzner Cloud anlegen

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.