Hetzner Server mit Ansible automatisch bereitstellen

Hetzner Server mit Ansible automatisch bereitstellen

 21.11.2020 -  Sebastian Pech -  ~5 Minuten

Ansible ermöglicht nicht nur die schnelle Installation und Konfiguration von Software auf Servern und anderen Systemen, es ermöglicht auch die Erstellung ganzer virtueller Serverumgebungen. Hetzner hat seinen Hauptsitz in Deutschland und bietet hier ebenfalls mehrere Serverstandorte an. Die kleinsten Cloudserver kosten dabei monatlich nicht mehr als eine Tasse Kaffee. Dies ist die perfekte Kombination um für wenig Geld mit Clouddiensten, Servervirtualisierung und DevOps Abläufen Erfahrung zu sammeln oder komplette Virtual Data Center Umgebungen automatischen zu erstellen.

Ansible

Ansible ist ein Open-Source Automatisierungs-Werkzeug zur Orchestrierung und allgemeinen Konfiguration und Administration von Computern. Es kombiniert Softwareverteilung, Ad-hoc-Kommando-Ausführung und Konfigurationsmanagement. Die Verwaltung von Netzwerkcomputern erfolgt unter anderem über SSH und erfordert keinerlei zusätzliche Software auf dem zu verwaltenden System. (Quelle: Wikipedia )

Ansible hat einen etwas anderen Ansatz als Terraform welches alle Informationen über Komponenten in einer Zustandsdatei verwaltet. Ansible Playbooks beschreiben den gewünschten Endzustand (erstellt, gelöscht, auflisten, …). Ansible versucht dann diesen Zustand zu erreichen, wenn es notwendig ist (beispielsweise die Ressource noch nicht vorhanden ist).

- name: Install Git
  apt:
    name=git
    state=present
    update_cache=yes

Das obige Beispiel würde immer dafür sorgen, dass die aktuellste Version von git installiert ist und vorher noch ein apt-get update durchführen. Anstelle des Debian spezifischen Paketmanagers gibt es auch für andere Derivate ein entsprechendes Modul bzw. sogar ein Distributionen übergreifendes Modul.

Die Playbooks von Ansible sind alle in YAML geschrieben und können somit problemlos in Codeverwaltungsprogrammen wie git oder ähnlichen verwaltet werden.

Hetzner hcloud

Als Vorbereitung zur Automatisierung ist ein Console Account anzulegen.

Danach lässt sich ein neues Projekt erstellen. Dies ist eine Gruppierung in der Server, Floating-IPs, LoadBalancer und weitere Ressourcen liegen.

Abschließend kann in der linken Seitenleiste unter Sicherheit und dann in der Mitte unter API-Keys ein neuer Key erzeugt werden. ACHTUNG dieser ist nur einmal sichtbar! Das Abspeichern in einem Passwortmanager ist dringend anzuraten.

Voraussetzungen schaffen

Jetzt wo der API-Key bekannt ist können die letzten Voraussetzungen für ein Einsatz von Ansible geschaffen werden.

Zuerst erfolgt die Installation von Ansible . Hier hat jede Distribution in der Regel ein Paket vorhanden. Für Ubuntu wäre dies im Folgenden.

sudo apt update
sudo apt install software-properties-common
sudo apt-add-repository --yes --update ppa:ansible/ansible
sudo apt install ansible

Für die aktuellsten Versionen ist Python 3 notwendig. Die Installation von Python erfolgt auch über die üblichen Paketmanager. Auf Ubuntu 20+ ist dies vorinstalliert!

Zuletzt muss das Hetzner Cloud (hcloud) Modul für Python installiert werden. Dies geschieht mit dem Python eigenen Paketmanager pip bzw. pip3.

sudo apt-get install python3-pip
pip3 install hcloud

Bedarfsweise: Es muss ein SSH-Key verfügbar sein um den Server nutzen zu können. Falls unter ~/.ssh/id_rsa noch keiner liegt kann dieser mittels ssh-keygen erzeugt werden.

Server aufbauen

Ich teile normalerweise die Bereistellung von Servern und Infrastruktur von der Softwareinstallation. Dies ermöglicht eine übersichtlichere Verzeichnisstruktur und kleine Konfigurationen. Die folgenden Dateien liegen daher alle in einem Ordner (beispielsweise hetzner-infrastruktur oder dc_hetzner wenn man mehrer Provider wie Azure, AWS oder Google Cloud in einem Hauptverzeichnis hat).

Es bietet sich an einen Unterordner tmp und tmp/retry anzulegen um die Laufzeitdaten von ansible aus dem Playbook Ordner rauszuhalten. Dazu wird eine ansible.cfg mit folgendem Inhalt erstellt.

[defaults]
retry_files_save_path = ./tmp/retry/
log_path = ./tmp/ansible.log

Danach wird der hcloud Plugin bereitgestellt. Dieser kann automagisch über die Datei hcloud.yml eingebunden werden. Alternativ kann die Zeile in jedem Playbook stehen.

plugin: hcloud

Über das Plugin wird nun die HCLOUD_TOKEN Variable bereitgestellt welche den zuvor erstellten Token benötigt. Damit dieser NIEMALS in einer Datei steht und damit auch nicht versehentlich in der Codeverwaltung landet muss dieser als Umgebunsgvariable zur Verfügung gestellt werden.

# führendes Leerzeichen damit kein Eintrag in der History erstellt wird!
 export HCLOUD_TOKEN="Der API-Key von oben"

Jetzt kann endlich das Server Modul zum Einsatz kommen. Dafür wird ein passend benamtes Playbook wie server.yml oder create.yml erstellt. Die Spezifikationen und damit der Preis pro Server stehen auf der Hetzner Cloud Webseite . Zum Zeitpunkt der Erstellung dieses Artikels (November 2020) war der kleinste Server der CX11 mit 1 vCPU, 2 GB RAM, 20 GB NVMe SSD und 20 TB Traffic für 2,89€/Monat.

---
- name: Hetzner Server erstellen
  hosts: localhost
  connection: local
  gather_facts: False
  user: root
  tasks:
    # Den lokalen ssh-key als Zugangskey einrichten
    - name: SSH-Key hinzufügen
      hcloud_ssh_key:
        name: id_rsa.pub # oder MeinKey, ...
        public_key: "{{lookup('file', '~/.ssh/id_rsa.pub')}}"
    - name: Mein erster Server
      hcloud_server:
        name: meinersterserver # Der Hostname des Servers
        server_type: cx11 # Spezifikation gemäß Webseite - siehe oben
        image: ubuntu-20.04 # Betriebssystem - alternativ u.a. Fedora, Debian, CentOS
        location: nbg1 # Standort Nürnberg - alternativ Falkenstein (fsn1) oder Helsinki.
        # backups: false # Sollen Backups erstellt werden? Default nein - Diese sind KOSTENPFLICHTIG mit 20% vom Serverpreis
        ssh_keys:
          - id_rsa.pub # Wir haben aktuell nur einen Key angegeben
        state: present # Der Server soll erstellt werden - mit absent können Server automatisch gelöscht werden!

Das Playbook wird nun mit Ansible aufgerufen. Nach etwas Wartezeit steht der Server in dem Projekt zur Verfügung.

ansible-playbook server.yml

Hilfreiche Commands und Playbooks

Der Status aller Server lässt sich mittels ping ermitteln. Dieser kann an alle Server geschickt werden.

ansible -i hcloud.yml -u root all -m ping

In der Dokumentation findet sich ein Playbook mit dem alle Werte über die derzeitige Umgebung aufgelistet werden können. Dazu wird eine list.yml (oder ähnlich) erstellt.

- name: Hetzner Daten anzeigen
  hosts: localhost
  connection: local
  gather_facts: False
  user: root
  tasks:
    - name: Ermittel hcloud datacenter info
      hcloud_datacenter_info:
      register: output
    - name: Zeige die Daten an
      debug:
        var: output
    - name: Ermittel hcloud Floating ip infos
      hcloud_floating_ip_info:
      register: output
    - name: Zeige die Daten ans
      debug:
        var: output
    - name: Ermittel hcloud sshkey infos
      hcloud_ssh_key_info:
      register: output
    - name: Zeige die Daten ans
      debug:
        var: output.hcloud_ssh_key_info
    - name: Ermittel hcloud server infos
      hcloud_server_info:
      register: output
    - name: Zeige die Daten ans
      debug:
        var: output.hcloud_server_info

Das Playbook wird ähnlich wie oben beschrieben ausgeführt.

ansible-playbook list.yml

 

Bildquelle: Image by Elchinator from Pixabay