Auch wenn ich meine VMs mit Borgbackup auf einen Hetzner Speicherplatz sichere, bleibt ein Problem. Was wenn Hetzner mal einfach verschwinden würde? (Ok, sehr unwahrscheinlich...) Das Rechenzentrum brennt völlig ab, oder was auch immer. Fakt ist, wir brauchen die VMs auch noch an einem anderen Platz.
Da ich mein NAS jetzt ja umgebaut habe, hat jetzt deutlich mehr Speicherplatz, bietet es ich an diese dort zu sichern. Das habe ich auch vorher schon so gemacht, aber jetzt wollen wir das Ganze mal automatisieren. Man ist ja faul
Host
Je nach eingestellter Anzahl der Backups, hat man auf dem Host eine recht hohe Anzahl an Daten. Diese immer wieder komplett zu sichern, macht nicht wirklich Sinn. Mein Plan, immer das aktuelle Image sichern und dann hinterher auf dem NAS dafür sorgen, das man nicht zu viele Images vorhält.
Kurze Anmerkung, scripten ist für mich auch immer wieder Neuland. Profis dürften über viele Dinge lachen, ich bin für Verbesserungsvorschläge immer offen. Man lernt ja nie aus...
Problem Nr.1, wie ermittel ich das aktuelle Image?
Das könnte ich mit ein wenig Recherche im Internet relativ einfach lösen.
# Nur die aktuellste Datei suchen
vm100=$(ls -1tr --group-directories-first vzdump-qemu-100*.vma.* | tail -n 1)
echo -e "$vm100" > /root/vmliste.txt
Wir erzeugen mit dem ersten Befehl eine Dateiliste. Hier die Optionen von ls
ls -1tr --group-directories-first vzdump-qemu-100*.vma.*
- 1 eine Datei pro Zeile auflisten. „\n“ mittels -q oder -b vermeiden
- t nach Änderungszeit sortieren, neueste zuerst
- r umgekehrte Reihenfolge beim Sortieren
- --group-directories-first Verzeichnisse vor den Dateien gruppieren;
Alle Ordner nach oben, alle Dateien nach Datum auflisten, das alles umgekehrt. Das Ergebnis, die neueste Datei steht ganz unten. Diesen Dateinamen schneiden wir jetzt mit tail aus.
tail -n 1
- n die letzten ZAHL Zeilen ausgeben, statt der letzen 10.
Das gibt jetzt die letzte Zeile der Datei aus. Diese speichern wir in der Variablen $vm100
vm100=$(.........................)
Speichert die Ausgabe des Befehles (in den Klammern) in der Variablen. Diese Variable geben wir jetzt in eine Datei aus.
echo -e "$vm100" > /root/vmliste.txt
Das Zeichen > lenkt die Ausgabe in eine Datei um, wenn das nur einmal da steht wird die Datei erzeugt, wenn sie nicht vorhanden ist. Will man was anhängen, an eine vorhandene Datei, dann nimmt man >>
Das fertige Script
#!/bin/bash
###############################################################################
# Arbeitsverzeichnis einstellen
cd /backup/dump
# Nur die aktuellste Datei suchen
vm100=$(ls -1tr --group-directories-first vzdump-qemu-100*.vma.* | tail -n 1)
echo -e "$vm100" > /root/vmliste.txt
vm101=$(ls -1tr --group-directories-first vzdump-qemu-101*.vma.* | tail -n 1)
echo -e "$vm101" >> /root/vmliste.txt
vm102=$(ls -1tr --group-directories-first vzdump-qemu-102*.vma.* | tail -n 1)
echo -e "$vm102" >> /root/vmliste.txt
vm103=$(ls -1tr --group-directories-first vzdump-qemu-103*.vma.* | tail -n 1)
echo -e "$vm103" >> /root/vmliste.txt
vm104=$(ls -1tr --group-directories-first vzdump-qemu-104*.vma.* | tail -n 1)
echo -e "$vm104" >> /root/vmliste.txt
vm106=$(ls -1tr --group-directories-first vzdump-qemu-106*.vma.* | tail -n 1)
echo -e "$vm106" >> /root/vmliste.txt
vm107=$(ls -1tr --group-directories-first vzdump-qemu-107*.vma.* | tail -n 1)
echo -e "$vm107" >> /root/vmliste.txt
Die Datei vmliste.txt sieht dann wie folgt aus.
vzdump-qemu-100-2019_11_07-03_00_02.vma.lzo
vzdump-qemu-101-2019_11_08-00_00_02.vma.lzo
vzdump-qemu-102-2019_11_07-03_10_46.vma.lzo
vzdump-qemu-103-2019_11_08-00_00_42.vma.lzo
vzdump-qemu-104-2019_11_07-03_12_26.vma.lzo
vzdump-qemu-106-2019_11_05-00_00_01.vma.lzo
vzdump-qemu-107-2019_11_05-00_00_36.vma.lzo
Mit dieser Datei, die mir nun immer das letzte (aktuellste) Image anzeigt, möchte ich auf dem NAS weiter arbeiten.
NAS
Wir stellen im Script das Arbeitsverzeichnis ein, holen die Datei vom Host ab und laden dann Image für Image herunter.
Nicht sehr spannend, das Arbeitsverzeichnis einstellen.
# Arbeitsverzeichnis einstellen
cd /mnt/nas/Proxmox_Hetzner_VMs
Die Datei vom Host abholen.
# Dateiliste holen
scp -P 666 user@domain.com:/root/vmliste.txt .
echo "Datei gesichert"
Die Datei wird abgeholt und im eingestellten Arbeitsverzeichnis gespeichert. Wir speichern den Pfad der Datei.
# Name der Dateiliste
datei=/mnt/nas/Proxmox_Hetzner_VMs/vmliste.txt
Ok, so weit relativ easy, das kennen wir ja schon alles. Aber wie bekomme ich jetzt die Dateinamen aus der Datei?
Mein Ergebnis sieht so aus
# VM100
vm=$(head -n 1 $datei | tail -n 1)
echo $vm "wird gesichert"
scp -P 666 user@domain.com:/backup/dump/$vm .
Wir schreiben das Ergebnis wieder in eine Variable, die wir dann weiter verarbeiten können.
vm=$(..................)
Mit
head -n 1 $datei
hole ich mir eine Zeile der Datei und zwar die 1.
Was mache ich aber um z.B. die zweite Zeile zu bekommen?
head -n 2 $datei | tail -n 1
Würde zwei Zeilen holen und mit tail die letzte ausschneiden! Beispiel.
root@debian:/home/frank/Schreibtisch# head -n 2 test.txt
1
2
root@debian:/home/frank/Schreibtisch# head -n 2 test.txt | tail -n 1
2
Da fällt mir gerade auf, das hier ein unsinniger Schritt drin ist.
vm=$(head -n 1 $datei | tail -n 1)
Das tail -n 1 macht ja keinen Sinn, ich habe ja nur eine Zeile Hier mal eben getestet.
root@rockpro64:~# unset vm
root@rockpro64:~# echo $vm
root@rockpro64:~# vm=$(head -n 1 /mnt/nas/Proxmox_Hetzner_VMs/vmliste.txt)
root@rockpro64:~# echo $vm
vzdump-qemu-100-2019_11_07-03_00_02.vma.lzo
Ok, funktioniert.
Das komplette Script.
#!/bin/bash
###############################################################################
# Arbeitsverzeichnis einstellen
cd /mnt/nas/Proxmox_Hetzner_VMs
# Dateiliste holen
scp -P 666 user@domain.com:/root/vmliste.txt .
echo "Datei gesichert"
# Name der Dateiliste
datei=/mnt/nas/Proxmox_Hetzner_VMs/vmliste.txt
# VM100
vm=$(head -n 1 $datei)
echo $vm "wird gesichert"
scp -P 666 user@domain.com:/backup/dump/$vm .
# VM101
vm=$(head -n 2 $datei | tail -n 1)
echo $vm "wird gesichert"
scp -P 666 user@domain.com:/backup/dump/$vm .
# VM102
vm=$(head -n 3 $datei | tail -n 1)
echo $vm "wird gesichert"
scp -P 666 user@domain.com:/backup/dump/$vm .
# VM103
vm=$(head -n 4 $datei | tail -n 1)
echo $vm "wird gesichert"
scp -P 666 user@domain.com:/backup/dump/$vm .
# VM104
vm=$(head -n 5 $datei | tail -n 1)
echo $vm "wird gesichert"
scp -P 666 user@domain.com:/backup/dump/$vm .
# VM106
vm=$(head -n 6 $datei | tail -n 1)
echo $vm "wird gesichert"
scp -P 666 user@domain.com:/backup/dump/$vm .
# VM107
vm=$(head -n 7 $datei | tail -n 1)
echo $vm "wird gesichert"
scp -P 666 user@domain.com:/backup/dump/$vm .
echo "Done."
Das alles habe ich dann mit crontabs automatisiert, so das man sich nicht drum kümmern muss. Systemadministratoren sind einfach faul, oder?
Ein letzter Schritt fehlt noch, ich muss die Dateianzahl auf dem NAS kontrollieren. Nach dem Motto, nur die letzten 5 Images werden behalten, der Rest gelöscht. Sonst mülle ich mir das NAS ja irgendwann voll. Kommt noch