Von Zeit zu Zeit ist es Nötig, an allen Rechnern die gleichen Wartungsarbeiten vorzunehmen. Im Prinzip kann man dazu wie folgt vorgehen:
kogs1:/#
foreach rechner ( alle Rechner )
foreach?
ssh $rechner Änderung1
foreach?
ssh $rechner Änderung2
foreach?
ssh $rechner Änderung3
foreach?
end
Das Problem bei diesem Vorgehen ist jedoch, dass nicht alle Rechner immer angeschaltet sind: Bürorechner werden oft zu Beginn des Urlaubs ausgeschaltet, SUNs bieten im Prinzip die Möglichkeit, nach einiger Zeit der Inaktivität in einen Suspend-Zustand zu gehen, und einige PCs sind als Dual-Boot Rechner mit Windows und Linux installiert. Um sicherzugehen, dass wirklich alle Änderungen auf allen Rechnern eingespielt werden, müsste man also nicht nur die aktuellen, sondern gegebenenfalls auch die letzten N Updates einspielen.
Genau diesem Zweck dient das Bash-Skript /opt/etc/update.host. Dort werden immer nur Änderungen hinzugefügt, aber niemals entfernt. Jede Änderung hat die Form:
# This block does blubber
case $system in
Linux)
case $platform in
SuSE-9.*)
# SuSE 9.0 needs special blubber treatment
# check if this was already done
$SSH $host grep "Something or Other" /some/file/or/other > /dev/null 2>&1
# check the result
res=$?
case $res in
0)
# relax: tell people not to worry
$DECHO "$host: CHECK_ETC_HOSTS=no in /etc/sysconfig/suseconfig"
;;
1)
# we need to do the update
$ECHO $SSH $host do_something_to_fix_the_problem
;;
*)
echo "$host: This can not happen: error-code $res while blubbing"
;;
esac
# This is a predefined function
CopyIfNewer $host $system $release /some/local/file /some/remote/file
;;
SuSE-10.0)
# apparently SuSE 10.0 does not need this fix
;;
esac
;;
SunOS)
CopyIfNewer $host $system $release /some/local/file /some/remote/file
LinkIfNewer $host $system $release /some/remote/path /some/other/remote/path
;;
esac
Um je nach Rechnertyp unterschiedliche Änderungen vornehmen zu können, stellt update.host die folgenden Variablen zur Verfügung:
Variabel | mögliche Belegung |
---|---|
$host | kogs1, kogspc2, ... |
$system | SunOS, Linux |
$release | 5.6, 5.8, 2.4.21-303-smp4G, ... |
$platform | SunOS-5.6, SunOS-5.8, SuSE-8.3, SuSE-9.0, SuSE-10.0 |
Weitere Variabeln dienen als Abkürzungen für Programmnamen:
Variabel | Programm |
---|---|
$ECHO | "" oder echo |
$DECHO | relax oder echo |
$SSH | /opt/bin/ssh |
$SCP | /opt/bin/scp -q |
$LS | /bin/ls |
$LN | /bin/ln |
$RM | /bin/rm |
$MV | /bin/mv |
$AT | /bin/at |
$MKDIR | /usr/bin/mkdir |
Und schließlich stehen noch eine Reihe von vordefinierten Funktionen zur Verfügung:
Funktion | Argumente | Funktion |
---|---|---|
relax | - | do nothing... |
CommentCron | [host] [system] [release] [regexp] | auskommentieren einer cron-Zeile |
IsNewer | [host] [file1] [file2] | Vergleich zweier Dateien |
CopyIfNewer | [host] [system] [release] [source] [target] | wie der Name sagt... |
SoftLinkIfNewer | [host] [system] [release] [source] [target] | wie der Name sagt... |
LinkIfNewer | [host] [system] [release] [source] [target] | wie der Name sagt... |
CheckDataLink | [host] [system] [release] [source] [target] | lege Link an falls nötig |
RemoveDataLink | [host] [link] | entferne Link |
rhup | [host] [system] [release] [job-name-regexp] | kille einen Job |
Das Skript update.host kann mit den folgenden Parametern aufgerufen werden:
usage: /opt/etc/update.host [-n] [-f] host -n Do Not update, only pretend -f Also run (interactive!) fou4s Updates host, testing for all necessary updates. This assumes that host is up and running either Solaris or SuSE Linux
In aller Regel wird man es jedoch nicht direkt aufrufen, sondern wird stattdessen das Skript update.all starten, welches quasi die obige foreach-Schleife nachempfindet; die Parameter sind:
usage: /opt/etc/update.all [-n] [-f] [-pc|-sun] -n Do Not update, only pretend -f Also run (interactive!) fou4s -pc Only update (SuSE Linux) PCs -sun Only update Suns Updates all UNIX-host, testing for all necessary updates. This uses rup to find running hosts
kogs1:/#
/opt/etc/patch.all
Dieses Skript lädt die recommended Patches für SunOS 5.6 und Solaris 8 runter, packt sie aus und entfernt den sendmail-Patch (da wir Reinhards sendmail Version benutzen); außerdem lädt es die aktuelle patchdiag.xref (so dass man mit patchdiag überprüfen kann, auf welchem Stand das System ist). Danach ermittelt es mittels rup (auf der kogspc2, um Probleme mit den SuSE 9.0 Versionen des rstatd zu vermeiden) welche Rechner laufen und startet auf allen SUNs /opt/etc/patch.host -q.
In der aktuellen Version muss man von Zeit zu Zeit (über einen Zeitraum von mehreren Stunden) Return drücken, um die einzelnen Aktionen des Skripts zu bestätigen. Im einzelnen sind das
Bis auf den eigentlichen Start des Patchens wird jeweils die Fehlerfreiheit der Aktion bestätigt (d.h. nach abgeschlossener Aktion). Alternativ zur manuellen Bestätigung könnte man jeweils den Exit-Status der Programme abfragen und gegebenenfalls weitere Überprüfungen vornehmen.
Bestandteil des eigentlichen Patchens ist ein reboot; dieser erfolgt automatisch auf allen Maschinen (außer der kogs1) zwischen 21:00 und 7:00; die kogs1 muss manuell rebootet werden, möglichst noch vor 21:00 oder nachdem alle anderen Maschinen rebootet haben.
Ob alle Jobs durch sind, siehst man am besten, indem man
kogs1:/#
ps -ef | grep patch
# Der häufigste Fehler ist zuwenig Platz in /var
kogs1:/#
grep Insufficient /opt/etc/patch.*.log
# Hier sieht man auch, ob ein Rechner fehlt
kogs1:/#
ls -lt /opt/etc/patch.*.log
kogsX SunOS 5.8 kogsX Determining if sufficient save space exists... kogsX Insufficient space in /var/sadm/patch to save old files. kogsX Space required in bytes: 254102 kogsX Space available in bytes: 213340Die offensichtliche Lösung ist, dort Platz zu schaffen, indem man
# lösch alles, was älter als 365 Tage ist
kogsX:/#
find /var/sadm/pkg/*/save -mtime +365 -ls -exec rm {} \;
kogs1:/#
/opt/etc/patch.host kogsX >! /opt/etc/patch.kogsX.log
Für SuSE Linux 9.0 gibt es keine Patches mehr; unter SuSE Linux 10.0 werden die Patches dankenswerterweise automatisch eingespielt, und zwar zur Zeit jeweils in der Nacht von Sonntag auf Montag. Hierzu benutzen wir fou4s, das Fast OnlineUpdate for SuSE. Nur einige wenige (meistens Kernel-) Patches müßen interaktiv eingespielt werden, am besten geht das mit dem oben beschriebenem Skript /opt/etc/update.all:
# -f: run fou4s interactively
# -pc: Only update (SuSE Linux) PCs
kogs1:/#
/opt/etc/update.all -pc -f