JSON mit JQ auf der Bash nutzen (Hetzner Cloud)

2 Jun 2020 Lesezeit: 5 Minuten

JSON ist der neue heisse shice auf allen erdenklichen Plattformen. Alle APIs die ich kenne und aktuell entwickelt werden geben ihren Senf als JSON dazu. JSON bedeutet JavaScript Object Notation und ist, nach den anfänglichen Bauchschmerzen die man hat weil JavaScript im Namen vorkommt, tatsächlich gar nicht soooo schlimm wie man es zuächst vermutet.

Natürlich darf man nun keine schicke XML erwarten, die man auch als Nachtlektüre lesen könnte. Vielmehr ist es mehrschichtig aufgebaut und man arbeitet sich so durch Arrays und Objekte durch, bis man an der Stelle ist die einen interessiert.

Das gute an der aktuellen Bewegung ist eigentlich, dass es überall nun APIs gibt, so kann man seinen kram endlich strukturiert weg skripten. Zwar hat das paar Jahrzehnte gedauert - aber mich hat ja auch keiner gefragt.

Wie dem auch sei: JSON ist gan passabel mittels JQ auf der Bash zu nutzen. Doch wie fängt man an?

1. Hol dir nen API Key

Das muss man bei seinem Provider nachschauen wie das geht. In meinem Fall habe ich einfach mal bei HetznerCloud geschaut und bekomme ihn einfach, wenn in innerhalb meines Projekts auf Zugänge gehe und mir dort einen Key erstelle.

2. Hol dir die API Dokumentation

Natürlich macht auch bei einer API jeder was er für richtig hält. In Sofern ist es gar nicht so schlecht, wenn man sich in der Dokumentation bewegen kann.

3. Sprich mit der API

Das ist der Teil, der wahrlich am einfachsten und am angenehmsten ist. Dazu nutzt man schlicht einen curl oneliner:

API_TOKEN=HIERISTDERUNTER1GEHOLTEAPITOKENSUPERDUPERKEYDRIN
curl -H "Authorization: Bearer $API_TOKEN" 'https://api.hetzner.cloud/v1/actions'

Schon bekommen wir Informationen von der API und können schauen was sie uns zu bieten hat. JSON ist in der Regel aber nicht cool formatiert - s jagen wir es zunächst durch JQ, damit es etwas schicker wird:

curl --silent  -H "Authorization: Bearer $API_TOKEN" 'https://api.hetzner.cloud/v1/actions' | jq '.'

4. Schau dich um

Was genau kann man mit dem Wust an Zeilen und Zeichen nun machen? Am eifnachsten schaut man sich um, indem man sich einen Überblick verschafft, was da eigentlich grade ankommt. Das geht mit dem Kommando keys

curl --silent -H "Authorization: Bearer $API_TOKEN" 'https://api.hetzner.cloud/v1/actions' | jq 'keys'
[
  "actions",
  "meta"
]

Damit kennen wir die oberste Ebene. Nun sollten wir vielleicht herausfinden ob es sich bei den Elementen um ein Objekt oder ein Array handelt. Dafür geben wir das erste Mal etwas nach dem Punkt an. Nämlich ein Teil der Ausgabe das wir uns anschauen wollen:

curl --silent -H "Authorization: Bearer $API_TOKEN" 'https://api.hetzner.cloud/v1/actions' | jq '.actions | type'
"array"

Wir sehen also, das actions ein Array ist. Das könnten wir der Reihe nach durchgehen, wenn wir wüssten wie lang es ist. Das finden wir schnell heraus, bevor es weiter geht

curl --silent -H "Authorization: Bearer $API_TOKEN" 'https://api.hetzner.cloud/v1/actions' | jq '.actions | length'
25

Soso, 25 Einträge hat das Array actions also. Wenn wir jetzt schauen wollen welche Objekte einen bestimmten Wert haben, so können wir hier einfach select benutzen.

curl --silent -H "Authorization: Bearer $API_TOKEN" 'https://api.hetzner.cloud/v1/actions' | jq '.actions[] | select(.command=="attach_to_network")

Damit bekommen wir dann alles zu sehen. Wenn uns aber nur die ID interessiert, dann können wir das gewünschte Feld einfach filtern, indem wir es hinten dran hängen

curl --silent -H "Authorization: Bearer $API_TOKEN" 'https://api.hetzner.cloud/v1/actions' | jq '.actions[] | select(.command=="attach_to_network") | .id'

Quellen und Links


Einfaches Backupskript - lazy admin style

15 Mär 2020 Lesezeit: ~1 Minute

Ein einfaches Skript um Dateien/Ordner zu sichern und diese in begrenzter Anzahl vorzuhalten ist etwas, das ich immer brauche. Es gibt diverse Tools - manchmal braucht man es aber nicht so umfangreich.

Ich nutze gern das nachfolgende Skript unter Bash dazu. Die Kommandos zur Sicherung tausche ich immer wieder aus und natürlich gibt es einen Timestamp- am Ende wird ein wenig aufgeräumt.

Quick and Dirty - ich mag es.

#!/bin/bash

DATE=`date +%Y%m%d-%H%M%S`
DST=/Pfad/zum/BackupOrdner
SRC=/Pfad/zu/den/Daten

tar czvf $DST/Backup-$DATE.tgz
if [ $? -ne 0 ]; then
echo "Da hat was nicht geklappt"
exit 1
fi

find $DST -type f -mtime +60 -name "*.tgz" -exec rm -f {} \;
if [ $? -ne 0 ]; then
echo "Da hat was nicht geklappt"
exit 1
fi
exit 0

Periodische Snapshots mit Proxmox

13 Mär 2020 Lesezeit: 3 Minuten

Ich liebe ja Proxmox. Es ist so herrlich einfach und ziemlich gut durchdacht. Es bietet viele Möglichkeiten zu realisieren was man sich vorstellt und so sehr individuelle Umgebungen zu bauen.

Was es leider nicht mitbringt ist die Möglichkeit periodisch snapshots der vorhandenen VMs zu machen und so zumindest einen Zwischenstand für kritische Systeme zu erzeugen, bei denen es vielleicht nicht angebracht ist alle Stunde ein Backup zu machen.

Dennoch gibt es dazu eine tolle Lösung die weitestgehend auf die Boardmittel zurück greift - Danke an Corsinvest für cv4pve-autosnap.

Zunächst legt man sich einen neuen Benutzer innerhalb von Proxmox an, unter dessen Fahne man zukünftig automatisiert die Snapshots macht. Dabei macht es sinn auf die lokale Proxmox Datenbank zurück zu greifen.

Proxmox Snapshotuser

Natürlich braucht dieser Benutzer auch Berechtigungen:

Proxmox Snapshot Permissions

Anschließend schnappt man sich das kleine feine Tool:

wget https://github.com/Corsinvest/cv4pve-autosnap/releases/latest/download/cv4pve-autosnap-linux-x64.zip
unzip cv4pve-autosnap-linux-x64.zip
chmod +x cv4pve-autosnap
mv cv4pve-autosnap /usr/local/bin/ #OPTIONAL

Anschließend schaut man brav die Optionen an:

    ______                _                      __
   / ____/___  __________(_)___ _   _____  _____/ /_
  / /   / __ \/ ___/ ___/ / __ \ | / / _ \/ ___/ __/
 / /___/ /_/ / /  (__  ) / / / / |/ /  __(__  ) /_
 \____/\____/_/  /____/_/_/ /_/|___/\___/____/\__/

Automatic snapshot VM/CT with retention        (Made in Italy) 1.7.2

Automatic snapshot VM/CT with retention

Usage: cv4pve-autosnap [options] [command]

Options:
  -?|-h|--help      Show help information
  --version         Show version information
  --host            The host name host[:port],host1[:port],host2[:port]
  --username        User name <username>@<realm>
  --password        The password. Specify 'file:path_file' to store password in file.
  --vmid            The id or name VM/CT comma separated (eg. 100,101,102,TestDebian)
                    -vmid or -name exclude (e.g. -200,-TestUbuntu)
                    'all-???' for all VM/CT in specific host (e.g. all-pve1, all-\$(hostname)),
                    'all' for all VM/CT in cluster
  --timeout         Timeout operation in seconds

Commands:
  app-check-update  Check update application
  app-upgrade       Upgrade application
  clean             Remove auto snapshots
  snap              Will snap one time
  status            Get list of all auto snapshots

Run 'cv4pve-autosnap [command] --help' for more information about a command.

cv4pve-autosnap is a part of suite cv4pve-tools.
For more information visit https://www.cv4pve-tools.com

Nun ist es so weit: Shell auf und los geht es. Zunächst einmal fülle ich die Variablen, dann spiele ich mit den Einstellungen und Möglichkeiten des Werkzeuges. Wenn man seine Lösung gefunden hat, dann kann man daraus auch gleich einen Cronjob oder einen Rundeck-Task oder ein skript machen. So einfach ist das:

PROXMOXHOSTS=PVE01,PVE02,PVE03
PROXMOXUSER=Snapshotuser@pve
PROXMOXPASSWORD=SUP3rDup3rGehe1m
PROXMOXLABEL=takecareofit

/path/to/cv4pve-autosnap --host=$PROXMOXHOSTS --username=$PROXMOXUSER--password='$PROXMOXPASSWORD' --vmid=all snap --label='$PROXMOXLABEL' --keep=23

Quellen und Links: