WP-CLI fürs Hosting: was hcloud-cli ist

Bei WordPress längst, bei Hetzner noch nicht

WordPress bedienen wir längst per Kommandozeile. WP-CLI installiert Plugins, legt User an, durchsucht die Datenbank, exportiert Inhalte. Den Klick-Weg in der Admin-Oberfläche brauchen wir für Routine-Aufgaben kaum noch.

Bei der Hosting-Infrastruktur ist die gleiche Logik naheliegend, in der Praxis aber seltener gelebt. Wer Hetzner Cloud nutzt, klickt sich oft jahrelang durch die Web-Konsole. Pro Klick ist das alles flott. Beim zehnten gleich aufgesetzten Server wird es repetitiv.

Genau dafür gibt es hcloud, das offizielle Kommandozeilen-Werkzeug von Hetzner. Es spricht dieselbe API wie die Cloud Console und liegt nach der Installation als einzelnes Go-Binary im PATH.

Was ist hcloud-cli

hcloud-cli ist das von Hetzner gepflegte CLI für die Hetzner Cloud API. Stand April 2026 ist Version 1.63 aktuell. Das Tool deckt nahezu den vollständigen Funktionsumfang der Cloud Console ab. Verwaltet werden unter anderem:

  • Server, Server-Typen und Snapshots
  • Firewalls, Netzwerke und Floating IPs
  • Primary IPs, SSH-Keys, Volumes und Placement Groups
  • Load Balancer, Zertifikate und Storage Boxes
  • DNS-Zonen über die hcloud zone-Familie

Jede Operation ist ein API-Aufruf, jeder Exit-Code lässt sich in Skripten auswerten.

Installation

Hetzner pflegt fertige Pakete für die gängigen Plattformen. Für den Schnelleinstieg eignet sich Homebrew unter macOS und Linux:

brew install hcloud

Auf Debian und Ubuntu liegt ein experimentelles .deb-Paket auf der GitHub-Releases-Seite, auf Fedora und RHEL ein .rpm. Beide Pakete bringen Shell-Completions und Manpages mit:

curl -sSLO https://github.com/hetznercloud/cli/releases/latest/download/hcloud-cli_<version>_linux_amd64.deb
sudo dpkg -i hcloud-cli_<version>_linux_amd64.deb

Wer ohne Paketmanager auskommt, lädt das Binary direkt:

curl -sSLO https://github.com/hetznercloud/cli/releases/latest/download/hcloud-linux-amd64.tar.gz
sudo tar -C /usr/local/bin --no-same-owner -xzf hcloud-linux-amd64.tar.gz hcloud

Unter Windows gibt es WinGet- und Scoop-Einträge, beide allerdings nicht von Hetzner gepflegt:

winget install HetznerCloud.CLI

Für CI- und Container-Umgebungen liefert Hetzner ein Docker-Image:

docker run --rm -e HCLOUD_TOKEN="$TOKEN" hetznercloud/cli:latest server list

Nach der Installation prüfen, ob das Binary funktioniert:

hcloud version

API-Token und Context anlegen

hcloud nutzt API-Token mit Lese- oder Schreibrechten. Diese werden in der Hetzner Cloud Console unter „Security → API Tokens“ pro Projekt angelegt. Der Token wird genau einmal angezeigt und sollte direkt in einen Passwort-Manager wandern.

Mehrere Projekte verwaltet hcloud über benannte Contexts. Pro Projekt einen Context anlegen:

hcloud context create produktion

Beim Anlegen fragt hcloud den Token ab. Anschließend liegt er in der Konfigurationsdatei ~/.config/hcloud/cli.toml. Der aktive Context lässt sich mit hcloud context use <name> wechseln, hcloud context list zeigt alle.

In CI-Pipelines wird der Token stattdessen über die Umgebungsvariable HCLOUD_TOKEN übergeben. Ein Context ist dann nicht nötig.

Erste Befehle: orientieren

Nach der Einrichtung gibt es drei Befehle, die jede Sitzung beginnen:

hcloud server list
hcloud location list
hcloud server-type list

server list zeigt alle laufenden Server mit Status, IP und Typ. location list und server-type list liefern die Bezeichner, die das Anlegen später braucht. Die --help-Flagge funktioniert auf jeder Ebene und ersetzt in den meisten Fällen den Blick in die Doku:

hcloud server --help
hcloud server create --help

Server anlegen — vom Klick zum Befehl

Der Klassiker: ein neuer Server mit aktuellem Image, an einem bestimmten Standort, mit hinterlegtem SSH-Key.

hcloud server create 
  --name web-01 
  --type cax11 
  --image debian-12 
  --location nbg1 
  --ssh-key frank@workstation

Dieser Befehl ist die direkte Entsprechung zum Klick-Pfad in der Cloud Console, lässt sich aber wiederverwenden, in Git versionieren und in Skripte einbetten. Hinweis am Rand: Hetzner verabschiedet die --datacenter-Flagge zugunsten von --location, ab Juli 2026 wird sie entfernt. Wer alte Skripte hat, sollte rechtzeitig umstellen.

Cloud-Init und SSH-Keys per CLI

Cloud-Init macht aus dem CLI ein vollwertiges Setup-Werkzeug. Eine schlanke cloud-init.yaml für einen frischen Web-Server kann so aussehen:

#cloud-config

package_update: true
packages:
  - fail2ban
  - unattended-upgrades

users:
  - name: deploy
    groups: sudo
    shell: /bin/bash
    sudo: ALL=(ALL) NOPASSWD:ALL
    ssh_authorized_keys:
      - ssh-ed25519 AAAA…dein-public-key frank@workstation

ssh_pwauth: false
disable_root: true

write_files:
  - path: /etc/ssh/sshd_config.d/99-hardening.conf
    content: |
      PermitRootLogin no
      PasswordAuthentication no
      KbdInteractiveAuthentication no

runcmd:
  - systemctl restart ssh
  - systemctl enable --now unattended-upgrades

Pakete werden aktualisiert und nachinstalliert, ein Deploy-User mit Sudo-Rechten bekommt den eigenen SSH-Key, Passwort-Login und Root-Login werden deaktiviert. Danach übergibt hcloud die Datei beim Erstellen direkt:

hcloud server create 
  --name web-02 
  --type cax11 
  --image debian-12 
  --location fsn1 
  --ssh-key frank@workstation 
  --user-data-from-file cloud-init.yaml

Damit ist der Server beim ersten Boot voll konfiguriert. Was sonst von Hand nachgepflegt würde, ist beim ersten Login schon da (das wirkt jedes Mal wie Magie).

SSH-Keys werden einmalig per CLI abgelegt und anschließend per Name referenziert:

hcloud ssh-key create 
  --name frank@workstation 
  --public-key-from-file ~/.ssh/id_ed25519.pub

Snapshots und Images

Vor jedem riskanten Eingriff lohnt ein Snapshot. Mit dem CLI ist das eine Zeile:

hcloud server create-image 
  --type snapshot 
  --description "Vor Update auf PHP 8.4" 
  web-01

Snapshots lassen sich über hcloud image list --type snapshot auflisten. Aus einem Snapshot baut hcloud server create --image <id> später einen identischen Server, etwa um eine Migration zu üben oder einen Klon für Tests bereitzustellen.

Firewalls als Code

Hetzner-Firewalls sind regelbasiert und lassen sich auf Server, Label-Selektoren oder Load Balancer anwenden. Die Regeln liest hcloud aus einer JSON-Datei ein. Damit werden Firewalls reviewfähig wie Code.

Das Format ist ein direktes Array von Rule-Objekten, eines pro Regel. Eine typische firewall-web.json für einen öffentlichen Web-Server:

[
  {
    "direction": "in",
    "protocol": "tcp",
    "port": "22",
    "source_ips": ["198.51.100.0/24"],
    "description": "SSH nur aus dem Office-Range"
  },
  {
    "direction": "in",
    "protocol": "tcp",
    "port": "80",
    "source_ips": ["0.0.0.0/0", "::/0"],
    "description": "HTTP"
  },
  {
    "direction": "in",
    "protocol": "tcp",
    "port": "443",
    "source_ips": ["0.0.0.0/0", "::/0"],
    "description": "HTTPS"
  },
  {
    "direction": "in",
    "protocol": "icmp",
    "source_ips": ["0.0.0.0/0", "::/0"],
    "description": "Ping erlauben"
  }
]

Pflichtfelder sind direction, protocol und je nach Richtung source_ips oder destination_ips. port entfällt bei icmp, sonst nimmt es eine Portnummer oder ein Range wie "8000-8080". Das vollständige Schema steht in der Hetzner Cloud API-Doku. Anlegen, Regeln einspielen und an einen Server hängen sind drei Befehle:

hcloud firewall create --name web-default
hcloud firewall replace-rules --rules-file firewall-web.json web-default
hcloud firewall apply-to-resource --type server --server web-01 web-default

Die JSON-Datei wird damit zum Original. Wer eine Regel ändern will, ändert die Datei und schickt replace-rules hinterher. Eine Regel, die jemand nebenbei in der Konsole löscht, ist beim nächsten Lauf wieder da.

JSON-Output: die Brücke zu Skripten

Jedes Listing- und Describe-Kommando akzeptiert -o json. Der Output ist stabil genug, um ihn mit jq zu verarbeiten:

hcloud server list -o json | 
  jq -r '.[] | select(.status=="running") | .public_net.ipv4.ip'

Damit wird hcloud-cli zum Baustein in Bash- oder Python-Skripten. Typische Anwendungen sind das automatische Aktualisieren einer Ansible-Inventory, das Ableiten von DNS-Einträgen aus der Server-Liste oder das Einsammeln von Backup-Status für ein Monitoring-Dashboard.

Für tabellarische Ausgaben in Logs eignet sich -o noheader zusammen mit -o columns=name,ipv4,status.

Mehrere Projekte: Context-Switching

Wer mehrere Mandanten oder Privat- und Firmen-Projekte trennt, profitiert von Contexts. Ein Wechsel ist eine Zeile, ein Skript-Aufruf bekommt den Context per Flag mit:

hcloud --context kunde-a server list
hcloud --context kunde-b server list

Account-Verwechslungen sind damit weitgehend ausgeschlossen, solange die Konvention durchgehalten wird und Token nicht händisch gemischt werden.

Wo die Grenze liegt: hcloud-cli vs. Terraform und Ansible

hcloud-cli deckt operative Tätigkeiten ab. Es eignet sich für tagtägliche Verwaltung, schnelle Aktionen, Snapshots, Skript-Bausteine und CI-Aufgaben. Wer dagegen ganze Infrastrukturen deklarativ beschreiben will, also fünf Server, drei Netzwerke, zwei Load Balancer und passende Firewalls, greift sinnvollerweise zu Terraform mit dem offiziellen Hetzner-Provider oder zu Ansible mit der hetzner.hcloud-Collection.

Faustregel: Was öfter als zweimal getippt wird, gehört in ein Skript. Was über mehrere Server hinweg konsistent bleiben soll, gehört in Terraform oder Ansible. hcloud-cli arbeitet daneben weiter und übernimmt die schnellen Eingriffe.

Wann sich der Umstieg lohnt

Für einzelne Klick-Aufgaben bleibt die Web-Konsole bequem. Wer mehr als gelegentlich Server aufsetzt, Firewalls pflegt oder Snapshots zieht, spart mit hcloud-cli jede Woche spürbar Zeit.

Drei Schritte reichen für den Einstieg. Erstens: brew install hcloud oder das passende Paket installieren, einen API-Token erzeugen, einen Context anlegen. Zweitens: einen wiederkehrenden Klick-Workflow als Shell-Skript wegspeichern. Drittens: den ersten Aufruf mit -o json und jq bauen, damit die Cloud-Ressourcen maschinenlesbar werden. Danach lassen sich Inventories, DNS-Einträge oder Monitoring-Daten automatisch ableiten.


Links und weiterführende Quellen

Offizielle Quellen

Verwandte Werkzeuge

Schreibe einen Kommentar

Deine E-Mail-Adresse wird nicht veröffentlicht. Erforderliche Felder sind mit * markiert