Wie bereits in dem Artikel “XenServer 5.5 über PXE installieren“ beschrieben, kann der Citrix™ Xenserver 5.5 relativ einfach über PXE unbeaufsichtigt installiert werden. Nur nach der Installation muss in der Regel noch einiges konfiguriert werden. Hierfür bietet uns die XML Antwortdatei das Element <post-install-scripts>. Und genau an dieser Stelle greifen wir ein und konfigurieren unseren neu installierten XenServer.




Shell Skripte unter Linux/Unix sind auch für Windows User nichts aufregendes. Wer schon mal unter Windows Batchskripte erstellt hat, wird sich kaum umstellen müssen. Anders als das CLI/Shell auf einem Windows Rechner, ist die Bash (Bourne again Shell) wesentlich flexibler was die Kommandos angeht. Wer noch nie etwas mit Shell Programmierung zu tun hatte, dem empfehle ich folgende Websites:
Alle Skripte und Beispiele in diesem Artikel sind ausführlich Dokumentiert und sollten sich auch von Anfängern verstehen lassen.
Was passiert, wenn der Server auf das Element <post-install-scripts> stößt. Prinzipiell macht der XenServer nichts weiter, als die dort angegebene Datei von der angegebenen URL (oder NFS) per wget herunterzuladen, die Berechtigungen per chmod auf „executable“ zu setzen und das Skript dann auszuführen. Sieht einfach aus und wenn man ein paar Kleinigkeiten beachtet, ist es das im wesentlichen auch.
1. Antwortdatei
Beim Erstellen der unattend.xml Anwortdatei ist zu beachten, das unser Element <post-install-scripts> in einer Zeile stehen muss.
<post-install-scripts type="url">http://server/script.sh</post-install-scripts>
<post-install-scripts type="url"> http://server/script.sh </post-install-scripts>
2. Der Skript-Editor
Alle Windows User haben ja das Notepad für solche Skripte. Hier gleich der Hinweis ⇒ Vergesst dieses Tool !!!
Wenn eure Post-Install Skripte auch nur halbwegs laufen sollen, besorgt euch einen Texteditor der auch mit Unix Texten umgehen kann. Mit Notepad erzeugte Skripte laufen nicht auf einem Linux Rechner. Der Grund dafür ist relativ einfach, Windows und besonders Notepad in diesem Fall beenden eine Zeile mit CR & LF (Carriage Return [ASCII-Zeichen 13] und Linefeed [ASCII-Zeichen 10]). Unix und besonders Linux erwarten aber lediglich ein LF am Zeilenende, weshalb ein CR&LF am Zeilenende nicht interpretiert werden kann und es zu einem einfachen Syntax Error kommt. Mein Tip an dieser Stelle ist Notepad++.
Stolze Besitzer eines Macs (wie auch ich einer bin) können jetzt aufhören zu schmunzeln. Die meisten Texteditoren für Mac OS X beenden die Zeile nur mit einem CR, was unter Linux ebenfalls nicht funktioniert.
3. Der Ablauf
Wenn das Shell Skript fertig geschrieben (keine Angst, dazu kommen wir noch) und in die Antwortdatei eingebaut ist, müssen wir den zeitlichen Ablauf beachten. Das Shellskript das in der Installationsphase ausgeführt wird, läuft vor dem ersten Reboot. Dies bedeutet eigentlich nur, dass wir uns noch auf der zum Installationszeitpunkt erzeugten RAM-Disk befinden. Wenn wir in unserem Shellskript z.B. eine Datei nach /tmp kopieren, dann kopieren wir diese in die RAM-Disk. Nach einem Reboot ist diese RAM-Disk verschwunden und das /tmp Verzeichnis auf unserer Festplatte enthält alles mögliche, nur nicht unsere kopierte Datei. Aber auch dafür gibt es unterschiedliche Lösungen, zu einer davon komme gleich.
Um die zuvor genannten Probleme zu umgehen, macht das erste Skript (ich nenne es mal post-setup.sh) nichts weiter, als die benötigten weiteren Skripte von einem Webserver zu laden und an die richtige Stelle zu kopieren. Das eigentliche Post-Install Skript (ich nenne das dann post-install.sh) macht nach dem Reboot die eigentliche Arbeit.
1: #!/bin/bash 2: #----------------------------------- 3: # post-setup script 4: #----------------------------------- 5: wget /tmp http://10.0.0.1/post-install.sh 6: mv /tmp/post-install.sh /tmp/root/etc/rc3.d/S99post-install.sh 7: chmod +x /tmp/root/etc/rc3.d/S99post-install.sh
Erklärung
Zeile 1: Jedes Bash bzw. Shell Script enthält als erstes die Pfadangabe zum Interpreter. Da wir uns auf der bash befinden, liegt unser Interpreter im Verzeichnis /bin/bash deshalb der Verweis zu #!/bin/bash.
Zeile 2-4: Enthalten Kommentare, diese werden mit einer Raute (#) eingeleitet. Auch der Verweis in der Zeile 1 beginnt mit einer Raute, nicht übersehen.
Zeile 5: Hier laden wir uns mit dem Kommandozeilentool wget das eigentliche Post-Install Skript herunter und legen es in den Ordner /tmp (auf der RAM-Disk).
Zeile 6: Nun wird es interessant. Mit dem Kommando mv verschieben wir (move) unser Post-Install Skript in den Ordner /tmp/root/etc/rc3.d/ und benennen es gleichzeitig in S99post-install.sh um. Wie zuvor beschrieben befinden wir uns in dieser Phase auf der RAM-Disk, nach dem Formatieren der eigentlichen Festplatte wird diese im Ordner /tmp/root gemounted. Unser Skript befindet sich nach dem kopieren auf der Festplatte im Ordner /etc/rc3.d/. In diesem Ordner liegen die Startskripte, die ausgeführt werden sobald das Betriebssystem den entsprechenden Runlevel erreicht (hier Runlevel 3). Unser Skript mit dem schönen Namen S99post-install.sh wird also automatisch nach einem Reboot ausgeführt. Der Zusatz „S99“ vor dem Dateinamen ist übrigens zwingend erforderlich!
Zeile 7: Damit es auch ausgeführt werden kann, geben wir ihm hier noch die erforderlichen Berechtigungen.
Das fertige Skript könnt ihr euch auch direkt hier herunterladen. ⇒ post-setup.zip
Ok, der Dreizeiler war jetzt nicht wirklich schwer. Also machen wir uns an das eigentliche Skript, das die ganze Arbeit erledigen soll.
Unser eigentliches Post-Install Skript kann (muss aber nicht) wesentlich umfangreicher werden. Um das ganze jetzt nicht so extrem auszuführen, beschränke ich mich auf ein paar wesentliche Arbeitsschritte.
Das Prinzip des letzten Shell Skripts ist auch wieder relativ einfach. Wir definieren uns ein paar Variablen, erzeugen für die vorgenannenten drei Arbeitsschritte entsprechende Funktionen und führen diese dann in Abhängigkeit zu den Inhalten der Variablen aus. Klingt kompliziert ist aber eigentlich nicht schwer.
Fangen wir an. Das Grundgerüst sieht genauso wie unser erstes Skript aus.
1: #!/bin/bash 2: #----------------------------------- 3: # post-install script 4: #-----------------------------------
Dann folgen die noch Variablen (im Skript erklärt).
5: # Variablen einrichten 6: LOGPATH="/tmp" # In diesen Pfad wird das Post-Install-Logfile geschrieben (default: /tmp) 7: THISHOST=${HOSTNAME} # Der Hostname des XenServer Hosts wird automatisch ausgelesen (default: $HOSTNAME) 8: INSTALLTYPE="master" # Soll der Server ein Master eines neuen Pools oder ein Member eines bestehenden Pools werden. 9: POOLNAME="pxepool" # Der Name des Pools (bei Master neuer Pool, bei Member bestehender Pool) 10: POOLMASTER="" # Name des MasterServers des bestehenden Pools (nur wenn INSTALLTYPE="member") 11: POOLDOMAIN="local" # Die Domäne des MasterServers (z.B. xen.domain.com) 12: ROOTPASSWORD="Ruth" # Das Passwort für den User root (Achtung Klartext) 13: LICENSEPATH="http://..." # Der http Pfad zum License File (dort muss ein "servername.xslic" liegen) 14: BINPATH="http://..." # Pfad zu den Sourcen (z.B. für die HP SNMP Agents)
Abhängig von der Anzahl der nun folgenden Funktionen können es durchaus noch viel mehr Variablen werden. Widmen wir uns jetzt mal den Funktionen. Als erstes möchten wir unserer XenServer mit einer gültigen Lizenz ausstatten. Hier kopieren wir ein Lizenzfile auf unseren Webserver, wo wir es per Script abholen können. Um Verwechselungen zu vermeiden, benennen wir das Script mit dem Servernamen für den es gedacht ist (z.B. xenserver01.xslic). Die Funktion die wir jetzt schreiben holt das Lizenzfile einfach vom Webserver ab und aktiviert die Lizenz. Was dann so aussehen könnte:
25: function licensing { 26: # Kopiert einen Lizenzfile per http und aktiviert die Lizenz 27: wget -P /tmp $LICENSEPATH/$THISHOST.xslic 28: xe host-license-add license-file=/tmp/$THISHOST.xslic 29: }
Zeile 27 holt das Lizenzfile per http vom Webserver und speichert es im Verzeichnis /tmp (auf der Festplatte des XenServers).
Zeile 28 aktiviert die Lizenz mit dem bekannten xe Kommando.
Nun folgen drei weitere Funktionen die für uns das Pool-Management erledigen sollen.
31: function pool-create { 32: # Prüft ob der akuelle Server Master oder Member wird 33: echo "pool-create" 34: if [ "$INSTALLTYPE" = "master" ]; then 35: pool-master 36: 37: else 38: pool-member 39: fi 40: } 41: 42: function pool-master { 43: # Erzeugt einen neuen Pool und macht den aktuellen Server zum Master 44: POOLUUID=`xe pool-list --minimal` 45: xe pool-param-set uuid=$POOLUUID name-label=$POOLNAME 46: } 47: 48: function pool-member { 49: # Fügt den aktuellen Server zu einem bestehenden Pool hinzu 50: xe pool-join master-address=$POOLMASTER.$POOLDOMAIN master-username=root master-password=$ROOTPASSWORD 51: }
Zeile 32 - 40: Die Funktion pool-create prüft den Inhalt der Variablen $INSTALLTYPE in einer if … then …else Schleife. Ist der Inhalt der Variablen „master“ wird die Funktion create-master aufgerufen, steht etwas anderes in der Variablen wird die Funktion pool-member aufgerufen.
Zeile 42 - 46: Diese Funktion liest mit dem XE Kommando pool-list die aktuelle Pool UUID aus und schreibt diese dann zusammen mit dem Namen des neuen Pools aus der Variablen $POOLNAME mit dem Kommando pool-param-set in die Datenbank. Der aktuelle Server wird somit automatisch zum Master des „neuen“ Pools.
Zeile 48 - 52: In der letzten der drei Funktionen wird mit dem Kommando pool-join der neue Server in einen bestehenden Pool aufgenommen. An dieser Stelle bitte beachten, das root Passwort steht in den Skripten immer im Plain-Text.
Die letzte Funktion die in unser Post-Install Skript kommt, ist die Installation der HP SNMP Agents. Der manuelle Installationsvorgang ist in dem Artikel “HP SNMP Agents installieren“ beschrieben. Wir wollen diese aber hier unbeaufsichtigt installieren.
53: function hp-agents { 54: # Kopiert die Sourcen und den Answerfile 55: wget -P /tmp $BINPATH/hp-snmp-agents-xs-8.2.0-5 56: wget -P /tmp $BINPATH/hp-snmp-agents.conf 57: chmod +x /tmp/hp-snmp-agents-xs-8.2.0-5 58: cd /tmp 59: ./hp-snmp-agents-xs-8.2.0-5 -s 60: }
Wie ihr seht, ist das Installieren von solchen Paketen ebenfalls kein Problem. Die einzelnden Kommandos sind ja schon von der Funktion licensing bekannt. Dateien mit wget holen (hier ist es das Paket und eine Antwortdatei), das Paket berechtigen, kurz das Verzeichnis wechseln und das ganze dann ausführen. Die Informationen wie eine Antwortdatei aussehen muss, steht direkt in der readme.txt im Downloadpaket der HP SNMP Agents.
Alles vorstehende sollte erstmal als Gedankenanstoß helfen und euch in die Lage versetzen Post-Install-Skripte zu schreiben. Dieser Beitrag hat im unteren Bereich die Möglichkeit zur Diskussion, ihr könnt davon Gebrauch machen um Frage zu stellen und zu beantworten oder auch eigene Skriptvorschläge zu posten.
Letztendlich fehlt aber noch der wichtigste Teil. Unser Skript muss die erstellten Funktionen ja auch irgendwann ausführen. Das machen am Ende des Skripts mit folgenden Aufrufen:
61: echo "********************************************" 62: echo "Start post-installation-script" 63: echo "********************************************" 64: 65: licensing 66: pool-create 67: hp-agents
Zur Vollständigkeit könnt ihr das komplette post-install.sh Skript hier runterladen: ⇒ post-install.zip