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