Patches und Updates

Von Zeit zu Zeit müssen Änderungen an allen Maschinen vorgenommen werden. Der Klassiker sind natürlich Patches, aber auch andere Änderungen wie zum Beispiel die Umstellung des Mailservers sind von Zeit zu Zeit nötig. Der bei KOGS verwendete Mechanismus wird im folgenden Beschrieben.

Updates

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
    

Patches

Das Vorgehen beim Einspilen von Patches unterscheidet sich je nach Platform, wobei der Hauptunterschied zwischen Solaris und SuSE liegt.

SunOS

Da die Patches auf den SUNs praktisch immer mit einem reboot der Maschine verbunden sind, empfiehlt es sich, diese nur bei wirklich wichtigen Sicherheitsupdates oder ansonsten ca. alle 3 Monate einzuspielen. Der Vorgang selber ist im Prinzip vollautomatisiert; um ihn anzustoßen muss root auf der kogs1 das Skript
kogs1:/# /opt/etc/patch.all
starten.

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

  1. Download von 8_Recommended.zip
  2. Download von 2.6_Recommended.tar.Z
  3. Löschen des Verzeichnisses /opt/sbin/patches/8_Recommended
  4. Auspacken von /software/inst/8_Recommended.zip
  5. Löschen des Verzeichnisses /opt/sbin/patches/2.6_Recommended
  6. Auspacken von /software/inst/2.6_Recommended.tar.Z
  7. Download von /opt/patchdiag/patchdiag.xref
  8. Start des eigentlichen Patchens

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
auf der kogs1 startet. Darüber hinaus wird für jeden Rechner $host eine Datei /opt/etc/patch.$host.log angelegt. Ca 30 Minuten nach Start des eigentlichen Patchens kann man mal
# 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
laufen lassen, dort sieht man dann schon, ob es zu Problemen gekommen ist. Das häufigste Problem ist:
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:  213340
    
Die 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 {} \;
auf dem jeweiligen Rechner - statt 365 muss man eventuell eine kleinere Anzahl Tage eingeben. Anschließend kann man für diesen Rechner die Patches per Hand neu starten
kogs1:/# /opt/etc/patch.host kogsX >! /opt/etc/patch.kogsX.log

SuSE Linux

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
Sven Utcke

Valid HTML 4.0! Valid CSS!

last modified: 24-Aug-2006