KVM Migrate Skript

4 Dez 2015 Lesezeit: 4 Minuten

Es wäre gelogen wenn ich sagen würde, das ich "immer wieder" in die Situation gelange KVM Hosts zu bearbeiten oder zu migrieren. Dennoch ist KVM ein toller Hypervisor der sowohl Spaß macht, als auch interessante Features mit sich bringt und gleichzeitig vom Handling her den Eindruck vermittelt vieles noch handhaben zu können, auch wenn es mal zu dicken Schwierigkeiten kommt.

Daher habe ich für mein Setup ein Skript gebastelt, welches mir die Konfigurationen (XML - Daten) der eingerichteten virtuellen Maschinen mittels virsh exportiert um im falle eines Ausfalls die Maschinen wieder rekonstruieren zu können (mit wirsch define oder wirsch create).

Wichtig dafür ist natürlich das es ein externes Medium gibt auf dem die Daten gespeichert werden können. In meinem Fall ist es ein zentrales FreeNAS Storage.

Wenn man noch zwischen unterschiedlichen Linux Distributionen hin- und her switched hat man unter umständen das Problem, dass bestimmte Maschine types nicht vorhanden sind oder andere Werte angepasst werden müssen. Dazu nutze ich einfach "sed" das mir unter die Arme greift.

Als Ergebnis habe ich mittels Cron alle voll Stunde frische Konfigurationsdateien die ich einfach auf einem anderen KVM Host importieren kann.

Mit Hilfe meines Skript kann ich nun mit Hilfe von Parametern sowohl alle virtuellen Maschinen an ohne Angabe eines Parameters an einen in "CONFIGDESTDIR" definiertenOrt speichern, oder diesen angeben.

  • Alle Konfigurationen im Pfad speichern der im Skript angegeben ist
    • kvm-export.sh
  • Alle Konfigurationen im Pfad speichern der als Parameter angegeben wird
    • kvm-export.sh export /PATH/TO/NEW/STORAGE

Beim Import verhält es sich ein wenig anders. Hier kann ich zusätzlich noch eine bestimmte Maschine angeben

  • Alle Konfigurationen im Pfad speichern der im Skript angegeben ist
    • kvm-export.sh
  • Alle Konfigurationen im Pfad speichern der als Parameter angegeben wird
    • kvm-export.sh import /PATH/TO/NEW/STORAGE
  • Eine bestimmte Maschine importieren
    • kvm-export.sh import /PATH/TO/NEW/STORAGE
#!/bin/bash
CONFIGDESTDIR=/PATH/TO/STORAGE/

if [ "$1" == "export" ]; then
 if [ -z "$2" ]; then
    echo "Konfigurationen werden nach $CONFIGDESTDIR exportiert!";
   else 
    CONFIGDESTDIR=$2
    echo "Konfigurationen werden nach $CONFIGDESTDIR exportiert!";
 fi

 if [ -d $CONFIGDESTDIR ]; then
  echo "Exportverzeichnis ist vorhanden.";
  else
  echo "Exportverzeichnis ist nicht vorhanden und wird angelegt!";
  mkdir $CONFIGDESTDIR;
 fi

for i in $(virsh list --all | sed '1,2d' | awk '{print $2}')
 do
  VMNAME=$(basename $i .xml)
  virsh dumpxml --migratable $VMNAME > $CONFIGDESTDIR/$VMNAME.xml;
  sed -i "s/\/usr\/bin\/kvm/\/usr\/libexec\/qemu-kvm/" $CONFIGDESTDIR/$VMNAME.xml;
  sed -i "s/machine='pc-1.1'/machine='pc-i440fx-rhel7.0.0'/" $CONFIGDESTDIR/$VMNAME.xml;
  sed -i "s/machine='pc-0.12'/machine='pc-i440fx-rhel7.0.0'/" $CONFIGDESTDIR/$VMNAME.xml;
  sed -i "s/type='vmvga'/type='vga'/" $CONFIGDESTDIR/$VMNAME.xml;
 done
fi
if [ "$1" == "import" ]; then
 if [ -z "$2" ]; then
   echo "Konfigurationen werden aus $CONFIGDESTDIR importert!";
  else
   CONFIGDESTDIR=$2
   echo "Konfigurationen werden aus $CONFIGDESTDIR importert!";
  fi
 if [ -d $CONFIGDESTDIR ]; then
   echo "Importverzeichnis ist vorhanden.";
  else
   echo "Importverzeichnis ist nicht vorhanden!";
  exit;
 fi
 if [ -z "$3" ]; then
   echo "Es werden alle Maschinen importiert!";
  for i in $(ls $CONFIGDESTDIR/*.xml)
   do
    echo "Definiere Maschine $i";
    virsh define $i;
    echo "Richte Autostart ein fuer: $i";
    virsh autostart $i;
   done
 else
   echo "Definiere Maschine $3";
   virsh define $CONFIGDESTDIR/$3;
   echo "Richte Autostart ein fuer: $3";
   virsh autostart $CONFIGDESTDIR/$3;
 fi
fi

Erste Schritte in Ansible

3 Okt 2015 Lesezeit: 2 Minuten

In meinem vorherigen Beitrag habe ich erwähnt, wie cool ich Ansible finde. Dabei hab ich wohl nicht genug erwähnt, wie logisch und dennoch verspätet die Entwicklung kam. Mich fragt ja keiner…

Nun gut, da Ansible das logische nächste Level des Qualitätsbewussten, Keep it stupid and simple Administrator ist, ist es nur plausible dass man damit beginnt es zu benutzen.

In Ansible dreht sich alles um das zu verwaltende Inventar. Dieses wird in einer „hosts“ Datei definiert. Das coole daran: wenn man unterwegs in verschiedenen Netzwerken ist, kann man diese Datei zum Beispiel für jeden Kunden eigens definieren. In der Hosts Datei wird im einfachsten Falle einfach eine Liste mit Rechnernamen und IP-Adressen geführt.

Rechner1
192.168.2.189
weibserver.domain.com

und schon kann es los gehen.

Auf allen Adressen im Inventar kann man direkt nach dem einpflegen schon so genannten Ad-Hoc Kommandos absetzen. Also Kommandos auf der Shell welche auf den entfernen Rechner ausgeführt werden.

ansible all -a „ifconfig eth0“

würde in einem solchen Fall dafür sorgen, dass die Ausgabe des Kommandos „ifconfig eth0“ auf dem entfernen Rechner ausgeführt wird und man das Ergebnis ausgegeben bekommt.

An dieser Stelle hat man mit Ansible schon ein mächtiges Werkzeug, denn es gibt einen ganzen Eimer voller Module, die schon implementiert sind und daher fast keine Wünsche offen lassen. Angefangen vom einfachen Ausführen von Kommandos, über das kopieren von Dateien bis hin zum Ansprechen von Diensten, Programmen und Funktionen (List der Ansible Module).

Wer jetzt noch nicht überzeugt ist, dass Ansible die Erfüllung von Adminträumen ist, der soll doch bitte Windows benutzen :).


Warum Ansible die geile Sau der Massenadministration ist

8 Sep 2015 Lesezeit: 3 Minuten

Seit ein paar Wochen beschäftige ich mich erneut mit der Strukturierung, Organisation und Administration von Servierlandschaften im Linux-Umfeld.

Wie die Jungfrau zum Kinde ergab es sich, dass mein Bauchgefühl mich auf die Reise schickte um nach Möglichkeiten eine vorhandene, gewachsene Struktur sowohl zu begreifen, als auch zu übernehmen.

Nach meinem Leitbild von "Keep it stupid and simple" sind einige "prominente" Lösungen schon gleich durch das Raster gefallen.

  • Schlank sollte es sein.
  • Einfach zu verstehen sollte es sein.
  • Mitwachen können muss es
  • und natürlich auch flexibel
  • und kurzfristig einsetzbar

wenn es im Alltag einen Platz finden muss. Nach ein paar Stichproben war die Entscheidung schon gefallen. Ansible sollte es sein. Es hatte von Anfang an die Wirkung einer ausgereiften Skiptsammlung. Das allein macht es zwar schon sympathisch, doch oben drauf kommen die Funktionen die wirklich nützlich sind und dennoch "nur" abstrahiert. So können Dienste über ihren Namen angesprochen werden wenn man sie in einem Task neustarten mag und Ansible erledigt den Rest. Ebenso das installieren von Software und so weiter.

Maßlos überzeugt wurde ich allerdings durch die Python typische Eigenschaft, dass man sich ein wenig disziplinieren und Einrückungen einhalten muss. Dadurch ergibt sich eine saubere Datei schon fast von allein.

Den Anfang findet man darin überhaupt einen Überblick über sein Inventar zu bekommen indem man die hosts Datei pflegt. Hier hinein kommen Geräte über DNS Namen oder IP-Adresse und auch Variablen und Tags könnten hier gleich mit gepflegt werden. Eine Gruppierung von Geräten ist selbstverständlich und so können auch logische Strukturen oder Geografische Abbildungen geschaffen werden. 

Weiter geht es mit dem einfachen Aufbau von Playbook. Den Batch-Files von Ansible. Hier werden Themenmäßig Aufgaben zusammengefasst um sie dann gezielt auf einem Host, einer Gruppe oder allen Maschinen anzuwenden. Beispielsweise das ein- oder auspflegen von SSH-Keys, aktualisieren von Systemen und so weiter. Die Krönung allerdings ist das erschaffen von Rollen. In diesen Rollen können Variablen, Aufgaben, Templates, Dateien und alles weitere zusammengefasst werden um eben diese Rolle zu definieren.

Mit Rollen schafft man sich quasi einen Status Quo zu einem System und kann so die Grundlage für einheitliche Konfiguration schaffen. Wie immer für mich steht die Kommunizierbarkeit im Vordergrund. Durch mein Vorgehen gleich zu Beginn die sich mir bietende Struktur zu begreifen und sie in Ansible abzubilden hatte ich quasi so etwas wie den heiligen Gral der kausalen Zusammenhänge und Prozessketten. Denn wenn eine Aufgabe einmal ordentlich in ein Playbook oder eine Rolle gepresst wurde, hat man in aller Regel verstanden worum es geht. Noch besser: man kann es auch gleich dokumentieren und stellt zusätzlich sicher, dass auch die lieben Kollegen nicht sonderlich vom Weg abweichen.

In diesem Sinne kann ich Ansible nur empfehlen und vor allem ein Blick in die Ansible-Galaxy lässt keine Wünsche mehr offen. Man kann sich also sicherlich darüber freuen, dass in Zukunft wieder mehr zu technisch/praktischen Themen hier zu lesen sein wird.