YOU-Updates für Clients immer aktuell

(1769 Worte insgesamt im Text)
(11935 mal aufgerufen)  Druckerfreundliche Ansicht [1]

Letzte Änderung: 14.06.2008

Inhalt

Bekanntlich überprüfen die per Autoinstallation installierten Clients bei jedem Bootvorgang ob neue Updates auf dem Server für Sie bereit liegen.

Da allerdings die Entwickler nicht wissen können, welche openSUSE [6] Version auf den Clients installiert ist, hält der OSS [7] nach einer Default-Installation noch keine Updates für die Clients bereit. Damit dies nicht so bleibt und die Aktualisierung der Clients zukünftig automatisch abläuft ohne das der Administrator sich noch weiter darum kümmern muss, sind noch drei Schritte auf dem OSS notwenig:

  1. Der OSS muss das Update-Verzeichnis für Updates lokal bereitstellen, d.h. er spiegelt dieses Verzeichnis von einem öffentlichen FTP-Server.
  2. Damit dieser Vorgang automatisch abläuft, muss noch ein Cron-Job eingerichtet werden, der diese Aufgabe automatisch übernimmt.
  3. Damit die Clients wissen ob Sie ein Update durchführen müssen ist noch ein zusätzlicher Eintrag für den Client im LDAP-Server notwendig - auch das läßt sich aber automatisieren.

Vorbereitungen auf dem Server

Wir haben einmal Beispielhaft direkt den rsync-Server von opensuse.org herausgesucht. Zunächst prüfen wir, ob der Server auch wirklich die von uns benötigten Verzeichnisse per rsync bereitstellt:

rsync rsync.opensuse.org::opensuse-updates

Dieser Befehl liefert bei erfolgreicher Ausführung eine Liste mit den zur Verfügung gestellten Update-Archiven. Jetzt haben wir den Server und den passenden Pfad um einmal einen Test mit rsync zu wagen:

rsync -navz rsync.opensuse.org::opensuse-updates/11.0

Durch den Schalter "n" wird nur ein Testlauf durchgeführt - die Übertragung passiert noch nicht wirklich. Allerdings können wir schon einmal abschätzen, wie groß der benötigte Platz ungefähr sein wird. Durch das "v" bekommen wir am Ende mehr Informationen angezeigt - so auch über die gesammte Größe (total size) des Verzeichnisses in Byte.

Um ein wenig Platz zu sparen laden wir keine Source-RPMs herunter - diese werden normalerweise an den Clients ja sowieso nicht installiert:

rsync -navz --exclude="*.src.rpm" rsync.opensuse.org::opensuse-updates/11.0

Nun wird schon weniger übertragen - und das ist gut so. Falls Sie nur Clients mit einer Architektur (etwa i386) haben, können Sie den Platzverbrauch noch weiter reduzieren: fügen Sie einfach weitere "--exclude="-Statements an. Der folgende Befehl würde etwa für reine 32bit Clients ausreichen und verbraucht lokal nur die Hälfte bis ein Drittel des Platzes::

rsync -navz --exclude="src" --exclude="x86_64" --exclude="ppc" rsync.opensuse.org::opensuse-updates/11.0

Nun soll es aber endlich losgehen - dafür benötigen wir noch das passende Verzeichnis auf dem Server in welchem die Clients später nach Updates suchen:

mkdir -p /srv/tftp/update/11.0

Damit können Sie auch "normale" Clients updaten. Sie müssen dazu nur an den Clients über 'YaST2' --> 'Software Repositories' einen neuen Server hinzufügen und dort folgenden Werte eintragen:

URL-Typ:FTP
Servername:install
Verzeichnis auf dem Server:update/11.0

Jetzt spiegeln wir die entsprechenden Verzeichnisse und Dateien lokal:

rsync -az --stats --delete --delete-after --exclude=*.src.rpm rsync.opensuse.org::opensuse-updates/11.0 /srv/tftp/update/ 1>>/var/log/rsync_11.0.log

Durch die Option "--stats" bekommen wir am Ende der Übertragung noch ein wenig Information und durch "--delete" werden auf dem Mirror-Server nicht mehr vorhandene Patches auch lokal gelöscht.

Da wir die normale Ausgabe des Befehls in die Datei /var/log/rsync_11.0.log umleiten, können wir später immer nachvollziehen, was wann passiert ist. Fehler werden nicht umgeleitet und damit immer direkt an den Admin per Mail geschickt.

Jetzt fehlt zu unserem Glück nur noch ein Eintrag in der "Crontab", damit der Datenaustausch zukünftig automatisch und ohne unser Eingreifen abläuft. Dazu rufen wir mit dem Befehl: crontab -e einen Editor auf und tragen dort die folgende, eine Zeile ein:

0 2 * * 4 /usr/bin/rsync -az --stats --delete --exclude=*.src.rpm rsync.opensuse.org::opensuse-updates/11.0 /srv/tftp/update/11.0 1>>/var/log/rsync_11.0.log

Damit wird jeden Donnerstag um 02:00 Uhr nachts der Abgleich durchgeführt. Sollte ein Fehler auftreten, werden wir per Mail informiert.

Jetzt fehlt nur noch ein Eintrag beim jeweiligen Client im LDAP-Server, der dem Client sagt, dass er seine Software updaten soll und woher er die Updates bekommt. Am Ende sind also bei jedem Client z.B. noch die LDAP-Attribute:

clientMustUpdate: yes
und
clientUpdatePath: online_update.sh

zu setzen. Auch dies kann man wieder automatisieren - damit suchen dann die Client dann nicht bei jedem neuen Bootvorgang auf dem Server sondern nur noch, wenn auch tatsächlich neue Updates vorliegen. Aber wir wollen ja nicht gleich alles verraten... icon_wink


Update-Einträge im LDAP [9]

Die Clients befragen bei jedem Bootvorgang den LDAP-Server und führen nur dann Skripte aus, wenn speziell für sie ein Eintrag im LDAP hinterlegt ist.

Daten zum ersten Mal eintragen

Um nun überhaupt erst einmal Einträge ins LDAP-Verzeichnis zu bringen, benötigen wir ein kleines Skript, welches in einem "Initialisierungsschritt" die Einträge anlegt. Später werden diese Einträge nur noch geändert.

Angenommen, Sie haben einen Klassenraum mit openSUSE 11.0-Clients, der "pc-raum" genannt wurde. Dann sieht die Struktur glücklicherweise schon so aus:

Das entsprechende Skript (klick zum Download) [10] zum Eintragen der nötigen Werte in die LDAP-Datenbank sieht dann wie folgt aus:
#!/bin/bash
# 
# init-script to add ldap-configuration for linux clients 
# who can retrieve updates from the server
#
LDIFDIR=$(mktemp -d /var/tmp/PCTMP-XXXXXX)
# ACHTUNG!
# Das hier angegebene Skript muss unterhalb von 
# /var/SuSE/update/
# liegen:
SCRIPTNAME=update.sh
ROOMS=`ldapsearch -x "(&(Objectclass=SchoolRoom)(description=*))" description |  awk '/description:/ {print $2}'`
if [ -x $LDIFDIR ]; then
echo "$LDIFDIR exists!"
echo "Please rm -rf $LDIFDIR and run me again!"
exit 1
fi
if [ "$ROOMS" == "" ]; then 
echo "YOU have to define some rooms first!"
exit 1
fi
echo "Defined rooms:"
echo $ROOMS
echo
echo -n "Please enter the Room-Name(s) or press [Enter] for all rooms: "
read room
echo -n "Please enter the Scriptname for the clients (must be beneath /var/SuSE/update) [update.sh]: " 
read scriptname
if [ "$scriptname" != "" ]; then
SCRIPTNAME=$scriptname;
fi
echo "Using $SCRIPTNAME for Updatepath."
echo
if [ "$room" == "" ]; then
echo "initialise all rooms ..."
for PCDN in `ldapsearch -x "(&(objectClass=SchoolWorkstation)(sn=*Workstation-User))" dn | grep dn  | cut -d " " -f 2 | grep -v requesting`; do
# Create an tempfile for each client
/bin/cat >> $LDIFDIR/$PCDN.ldiff << EOF_LDIF
dn: $PCDN
changetype: modify
add: lientUpdatePath
clientUpdatePath: $SCRIPTNAME
-
dn: $PCDN
changetype: modify
add: clientMustUpdate
clientMustUpdate: yes
EOF_LDIF
done
else
for ROOM in $room; do
echo "initialise $ROOM ..."
for PCDN in `ldapsearch -x "(&(objectClass=SchoolWorkstation)(sn=$ROOM*Workstation-User))" dn | grep dn  | cut -d " " -f 2 | grep -v requesting`; do 
# Create an tempfile for each client in room
/bin/cat >> $LDIFDIR/$PCDN.ldiff << EOF_LDIF
dn: $PCDN
changetype: modify
add: clientUpdatePath
clientUpdatePath: $SCRIPTNAME
-
dn: $PCDN
changetype: modify
add: clientMustUpdate
clientMustUpdate: yes
EOF_LDIF
done
done
fi
echo
echo "You can find my results in $LDIFDIR"
echo -n "Should I update the LDAP-Database now [y/N] ? "
read LDAP
if [ "$LDAP" == "y" ]; then
for i in $LDIFDIR/*; do
PASS=`/usr/sbin/get_admin_pw`
DN=`cat /etc/openldap/slapd.conf | grep -v "#" | awk '/rootdn/ {print }' | cut -d "\"" -f 2`
ldapadd -x -D $DN -w $PASS -f $i
done
fi
echo -n "Should I remove $LDIFDIR now [y/N] ? "
read answ
if [ "$answ" == "y" ]; then
rm -rf $LDIFDIR
fi
echo
echo "READY"
echo

Anschließend ist für jeden Client des entsprechenden Raumes (oder der Räume) ein entsprechender Eintrag im LDAP vorhanden. Jetzt werden die Clients beim Booten schon auf dem Server nach einem Skript suchen, dessen Pfad (und Namen) Sie angegeben haben.

Update der Daten im LDAP

Da man als Administrator ja irgendwann eine gewisse Faulheit an den Tag legt, sollen die Update-Daten der Clients zukünftig automatisch eingetragen werden, wenn man etwas geändert hat oder z.B. Updates für die Clients vorliegen. Dazu wird der anfangs angelegte Cronjob erweitert. So wird immer dann, wenn Daten vom externen original-Update-Rechner auf den OSS übertragen wurden, ein entsprechender Eintrag in der Datenbank gemacht und die Clients führen beim nächsten Booten ein Update durch.

Da man u.U. ja auch einfach einmal bestimmte Befehle nur an die Clients in einem bestimmten Raum ausführen möchte, ist das Skript zweigeteilt. Einerseits gibt es hier ein nützliches Skript [11], welches die Einträge im LDAP vornimmt:

#!/bin/bash
# UpdateClients.sh
# 
usage () {
echo Usage: `basename $0` "[--help] [--list] [--disable] [--room <room>] [--script </room>



  

[ zurück zu Open School Server (OSS und SLSS) [12] | Index [13] ]

Kommentare

Einen Kommentar hinzufügen


Links
  [1] http://www.linux-schulserver.de/index.php?name=Sections&req=viewarticle&artid=25&allpages=1&theme=Printer
  [2] http://www.linux-schulserver.de/Sections-article25-p2.phtml#prepare
  [3] http://www.linux-schulserver.de/Sections-article25-p3.phtml#ldap
  [4] http://www.linux-schulserver.de/Sections-article25-p3.phtml#init
  [5] http://www.linux-schulserver.de/Sections-article25-p3.phtml#update
  [6] http://www.opensuse.org/
  [7] http://www.extis.de/oss
  [8] http://mirrors.opensuse.org/list/all.html
  [9] http://de.wikipedia.org/wiki/LDAP
  [10] http://www.linux-schulserver.de//download/Linux/OpenSchoolServer/initUpdate.sh
  [11] http://www.linux-schulserver.de//download/Linux/OpenSchoolServer/UpdateClients.sh
  [12] http://www.linux-schulserver.de/index.php?name=Sections&req=listarticles&secid=7
  [13] http://www.linux-schulserver.de/index.php?name=Sections