Benutzer-Werkzeuge

Webseiten-Werkzeuge


 [[anwenderwiki:linbo:postsync_scripte:linux_universalscript]] 

Universelles postsync-Skript für Linux

Dieses Vorgehen ist veraltet. Bitte lesen Sie hier weiter: Ein fertiges cloop-Image aus dem Internet für die Clients integrieren

Im Folgenden wird ein „universelles“ postsync-Skript vorgestellt, das als Grundlage für Anpassungen beim linux-Client in linuxmuster.net dienen kann.

Funktionsweise

Das Skript synchronisiert zunächst den Verzeichnisbaum /var/linbo/linuxmuster-client/<patchklasse> in den Cache des Clients.

Anschließend wird in der Reihenfoge wachsender Spezifizität der Inhalt der Unterverzeichtnisse

  • common: für alle Rechner des Images
  • <raumname>: für alle Rechner des Raumes mit diesem Namen
  • <hostname>: für genau den Rechner mit diesem Namen

über das ausgepackte Betriebssystem kopiert.

Anwendung

Die Anwendung macht man sich am besten mit einem Beispiel klar:

Man legt auf dem Server das Verzeichnis /var/linbo/linuxmuster-client/ubuntu1204/ und dort die Unterverzeichnisse common r201, r202, r123 und r201-ws01. 1)

ssh-Konfiguration

Nun möchte man beispielsweise, dass man vom Server als root passwortlos auf alle Client gelangen kann. Dazu muss man eine passende sshd_config Datei auf den Clients haben2) und der öffentliche Schlüssel des Benutzers root auf dem Server muss sich in der authorized_keys-Datei des Benutzers root auf dem Client befinden.

Man passt also auf dem Client diese beiden Einstellungen an und kopiert die Dateien mit vollem Pfad anschließend auf den Server nach /var/linbo/linuxmuster-client/ubuntu1204/common. Nach common, weil das für alle Clients gelten soll. In der Dateiliste sind die Dateien zu sehen.

Drucker

Anschließend konfiguriert man auf dem Client die Drucker, die in Raum r123 zur Verfügung stehen sollen - die Einstellungen finden sich nach der Konfiguration in der Datei /etc/cups/printers.conf wieder. Diese kopiert man inklusive Pfad auf den Server nach /var/linbo/linuxmuster-client/ubuntu1204/r123. Wenn in anderen Räumen andere Druckereinstellungen gewünscht sind, verfährt man ebenso. Das postsync-Skript kopiert dann die für den jeweiligen Raum passende printers.conf ins System.

Analog werden im Beispiel unten die Drucker für r201 gesetzt, der Rechner r201-ws01 hat noch einen lokalen Drucker und weil die Dateien für einzelne Hosts zuletzt kopiert werden, werden zunächst die Einstellungen für den Raum kopiert und beim Rechner r201-ws01 danach nochmals mit der passenden printers.conf ersetzt.

Abweichende Partitionierungen

Die Rechner in Raum r201 und r202 starten mit Dualboot (Windows und Linux parallel), darum benötigen Sie eine andere fstab, als die Maschinen die ausschließlich mit Linux bedient werden, beide verwenden aber dasselbe Image. Das Vorgehen ist wie oben: die korrekte /etc/fstab muss mit Pfad in das jeweilige Raumverzeichnis auf dem Server in /var/linbo/linuxmuster-client/ubuntu1204/ und wird dann vom postsync Skript nach dem Synchronisieren (aber vor dem Booten) an die richtige Stelle geschrieben.

Serverbeispielverzeichnis

Auf dem Server stellt sich das dann so dar:

18:11/1 server /var/linbo # find linuxmuster-client/ -name '*'
linuxmuster-client/
linuxmuster-client/ubuntu1204
linuxmuster-client/ubuntu1204/common
linuxmuster-client/ubuntu1204/common/etc
linuxmuster-client/ubuntu1204/common/etc/ssh
linuxmuster-client/ubuntu1204/common/etc/ssh/sshd_config
linuxmuster-client/ubuntu1204/common/root
linuxmuster-client/ubuntu1204/common/root/.ssh
linuxmuster-client/ubuntu1204/common/root/.ssh/authorized_keys
linuxmuster-client/ubuntu1204/r201
linuxmuster-client/ubuntu1204/r201/etc
linuxmuster-client/ubuntu1204/r201/etc/fstab
linuxmuster-client/ubuntu1204/r201/etc/cups
linuxmuster-client/ubuntu1204/r201/etc/cups/printers.conf
linuxmuster-client/ubuntu1204/r202
linuxmuster-client/ubuntu1204/r202/etc
linuxmuster-client/ubuntu1204/r202/etc/fstab
linuxmuster-client/ubuntu1204/r123
linuxmuster-client/ubuntu1204/r123/etc
linuxmuster-client/ubuntu1204/r123/etc/cups
linuxmuster-client/ubuntu1204/r123/etc/cups/printers.conf
linuxmuster-client/ubuntu1204/r201-ws01/etc
linuxmuster-client/ubuntu1204/r201-ws01/etc/cups
linuxmuster-client/ubuntu1204/r201-ws01/etc/cups/printers.conf

Das Basisskript

postsync.sh
echo "##### POSTSYNC BEGIN #####"
 
# IP-Adresse des Server
SERVERIP=10.16.1.1
 
# Raum feststellen. Dieses Skript geht davon aus
# dass die Rechner Namen der Form
# raumname-hostname haben, also z.B. cr01-pc18
RAUM=${HOSTNAME%-*}
# wenn der string leer ist, raum auf unknown setzen
if [ "x${RAUM}" == "x" ]; then 
    RAUM="unknown"
fi
 
# Das Verzeichnis, in dem die Serverpatches
# local synchronisiert werden.
PATCHCACHE=/linuxmuster-client/serverpatches
# UVZ auf dem Server. Mit diesem Variablen kann 
# man verschiedene Images bedienen (was bei linux
# selten nötig ist) 
PATCHCLASS="ubuntu1204"
 
echo ""
echo "Hostname:      ${HOSTNAME}"
echo "Raum:          ${RAUM}"
echo "Patchcache:    ${PATCHCACHE}"
echo "Patchclass:    ${PATCHCLASS}"
echo ""
 
# -----------------------------------------
# Patchdateien auf das lokale Image rsyncen
# ----------------------------------------- 
echo " - getting patchfiles"
 
# RAUM     -> Raumname
# HOSTNAME -> Rechnername
# Verzeichnis anlegen, damit es sicher existiert
mkdir -p /cache/${PATCHCACHE}
rsync --progress --delete -r "${SERVERIP}::linbo/linuxmuster-client/${PATCHCLASS}" "/cache/${PATCHCACHE}"
 
echo " - patching local files"
# zuerst alles in common
if [ -d /cache/${PATCHCACHE}/${PATCHCLASS}/common ]; then 
    cp -ar /cache/${PATCHCACHE}/${PATCHCLASS}/common/* /mnt/ 
fi
 
# dann raumspezifisch
if [ -d /cache/${PATCHCACHE}/${PATCHCLASS}/${RAUM} ]; then 
    cp -ar /cache/${PATCHCACHE}/${PATCHCLASS}/${RAUM}/* /mnt/ 
fi
 
# dann rechnerspezifisch
if [ -d /cache/${PATCHCACHE}/${PATCHCLASS}/${HOSTNAME} ]; then 
    cp -ar /cache/${PATCHCACHE}/${PATCHCLASS}/${HOSTNAME}/* /mnt/ 
fi
 
# -----------------------------------
# Sonstige Aktionen
# -----------------------------------
 
echo " - special postsync actions"
 
# hostname in /etc/hosts patchen
sed -i "s/HOSTNAME/$HOSTNAME/g" /mnt/etc/hosts
sed -i "s/#SERVERIP/$SERVERIP/g" /mnt/etc/hosts
 
# fstab anpassen, damit Swap-Partition stimmt
SWAP=$(sed ':a;N;$!ba;s/\n/;UMBRUCH;/g' $STARTCONF | sed 's/ //g'|sed 's/\[Partition\]/\n/g' | grep -i 'fstype=swap' | sed 's/;UMBRUCH;/\n/g' | grep -i 'dev=/' | cut -d'=' -f2 | head -c9)
echo "$SWAP"
sed -i "s#\#dummyswap#$SWAP#g" /mnt/etc/fstab
 
# -----------------------------------
# Berechtigungen anpassen, wenn nötig
# -----------------------------------
 
echo " - setting permissions of patched local files"
 
# printers.conf
[ -f /mnt/etc/cups/printers.conf ] && chmod 600 /mnt/etc/cups/printers.conf 
 
# .ssh verzeichnis
chmod 700 /mnt/root/.ssh/
chmod 600 /mnt/root/.ssh/authorized_keys
 
# Epoptes Serverkey - Rechte
if [ -e /mnt/etc/epoptes/server.key ]; 
then chmod 600 /mnt/etc/epoptes/server.key
fi
 
# Besitzverhältnisse für linuxadmin (hier GID 1000; ggf. anpassen) reparieren
# chown -R 1000:1000 /mnt/home/linuxadmin
 
echo "##### POSTSYNC END #####"

Erweiterung: Virtuelles Windows

Man kann auf diese Weise auch ein virtuelles Windows, das in einer Virtualbox läuft und auf einer eigenen Partition liegt synchron halten.3)

Dazu richtet man die virtuelle Maschine auf dem Client ein und kopiert dann das ganze Verzeichnis nach /var/linbo/ auf den Server in ein Unterverzeichnis, das man im folgenden Skript korrekt konfigurieren muss.

Dann wir nach dem Sync noch die virtuelle Maschine mir rsync in Ihren Ursprungszustand versetzt.

postsync-virtual.sh
echo "##### POSTSYNC BEGIN #####"
 
# IP-Adresse des Server
SERVERIP=10.16.1.1
 
# Raum feststellen. Dieses Skript geht davon aus
# dass die Rechner Namen der Form
# raumname-hostname haben, also z.B. cr01-pc18
RAUM=${HOSTNAME%-*}
# wenn der string leer ist, raum auf unknown setzen
if [ "x${RAUM}" == "x" ]; then 
    RAUM="unknown"
fi
 
# Das Verzeichnis, in dem die Serverpatches
# local synchronisiert werden.
PATCHCACHE=/linuxmuster-client/serverpatches
# UVZ auf dem Server. Mit diesem Variablen kann 
# man verschiedene Images bedienen (was bei linux
# selten nötig ist) 
PATCHCLASS="ubuntu1204"
 
# Die Partition auf der das 
# Virtualbox-Windows liegt, 
# muss raumabhängig angepasst 
# werden, solange es dualboot
# Maschinen gibt
VIRTUALDEVICE=/dev/sda3
 
# im Raum 201 und 202 ist das virtuelle Windows auf /dev/sda5
if [ ${RAUM} == "r201" ]; then
    VIRTUALDEVICE=/dev/sda5
fi
 
if [ ${RAUM} == "r202" ]; then
    VIRTUALDEVICE=/dev/sda5
fi
 
 
# Verzeichnis innerhalb /var/linbo/ auf dem Server, 
# in dem die Virtuelle Maschine liegt.
# Im folgenden Beispiel ist die Maschine im Verzeichnis 
# /var/linbo/virtualmachines/winxp/
# abgelegt.
VIRTUALMACHINESERVERDIR=virtualmachines/winxp/
 
 
echo ""
echo "Hostname:      ${HOSTNAME}"
echo "Raum:          ${RAUM}"
echo "Patchcache:    ${PATCHCACHE}"
echo "Patchclass:    ${PATCHCLASS}"
echo ""
 
# -----------------------------------------
# Patchdateien auf das lokale Image rsyncen
# ----------------------------------------- 
echo " - getting patchfiles"
 
# RAUM     -> Raumname
# HOSTNAME -> Rechnername
# Verzeichnis anlegen, damit es sicher existiert
mkdir -p /cache/${PATCHCACHE}
rsync --progress --delete -r "${SERVERIP}::linbo/linuxmuster-client/${PATCHCLASS}" "/cache/${PATCHCACHE}"
 
echo " - patching local files"
# zuerst alles in common
if [ -d /cache/${PATCHCACHE}/${PATCHCLASS}/common ]; then 
    cp -ar /cache/${PATCHCACHE}/${PATCHCLASS}/common/* /mnt/ 
fi
 
# dann raumspezifisch
if [ -d /cache/${PATCHCACHE}/${PATCHCLASS}/${RAUM} ]; then 
    cp -ar /cache/${PATCHCACHE}/${PATCHCLASS}/${RAUM}/* /mnt/ 
fi
 
# dann rechnerspezifisch
if [ -d /cache/${PATCHCACHE}/${PATCHCLASS}/${HOSTNAME} ]; then 
    cp -ar /cache/${PATCHCACHE}/${PATCHCLASS}/${HOSTNAME}/* /mnt/ 
fi
 
# -----------------------------------
# Berechtigungen anpassen, wenn nötig
# -----------------------------------
echo " - setting permissions of patched local files"
 
# printers.conf
[ -f /mnt/etc/cups/printers.conf ] && chmod 600 /mnt/etc/cups/printers.conf 
 
# .ssh verzeichnis
chmod 700 /mnt/root/.ssh/
chmod 600 /mnt/root/.ssh/authorized_keys
 
 
# -----------------------------------
# Virtuelles Windows rsyncen
# -----------------------------------
echo " - getting virtual windows"
 
mkdir -p /virtual > /dev/null 2>&1
# unmounten (to be shure)
umount /virtual > /dev/null 2>&1
mount $VIRTUALDEVICE /virtual && \
  rsync --progress -r "${SERVERIP}::linbo/${VIRTUALMACHINESERVERDIR}" "/virtual/" 
 
echo " - setting permissions for virtual windows"
cd /
chmod -R 777 /virtual
umount /virtual
 
echo "##### POSTSYNC END #####"

Alternativ kann man für das syncen auch die linbo-eigene Funktionalität bemühen:

postsync-virtual.sh
# Name des Basisimages das zusaetzlich synchronisert werden soll (muss angepasst werden)
mybaseimage=vbox.cloop
# Name des Rsyncimages, ggf. eintragen
myrsyncimage=""
# Zielpartition auf die gesynct werden werden soll, muss angepasst werden
myrootpartition=/dev/sda3
 
# Ab hier muss nichts mehr veraendert werden.
 
# IP des LINBO-Servers, wird automatisch aus dhcp.log ermittelt
myserverip="$(grep ^linbo_server /tmp/dhcp.log | tail -1 | awk -F\' '{ print $2 }')"
 
# Ausgabe der Parameter auf der LINBO-Konsole
echo "cachepartition:  $1"
echo "myserverip:      $SERVERIP"
echo "mybaseimage:     $mybaseimage"
echo "myrsyncimage:    $myrsyncimage"
echo "myrootpartition: $myrootpartition"
 
# Syntax fuer linbo_cmd synconly:
# /usr/bin/linbo_cmd synconly "<LINBO-Server-IP>" "<Cachepartition>" "<Basisimage>" "<Rsyncimage>" "<Bootpartition>" "<Rootpartition>"
  /usr/bin/linbo_cmd synconly "$SERVERIP"         "$1"               "$mybaseimage" "$myrsyncimage" ""               "$myrootpartition" 

Wenn ein chown des Home-Verzeichnisses nötig ist

Hat man mit Hilfe des Postsync-Scripts z.B. Desktop-Icons in das Home-Verzeichnis des linuxadmin kopiert, also nach /home/linuxadmin/Desktop, so stimmen die Rechte von /home/linuxadmin nicht mehr, mit der Folge, dass der linuxadmin sich nicht mehr anmelden kann. Dies kann man nicht per chown linuxadmin:linuxadmin korrigieren, da LINBO den Benutzer linuxadmin zum Zeitpunkt des Postsyncs noch nicht kennt. Statt dessen muss man mit der Benutzer-ID des linuxadmin arbeiten. Normalerweise ist diese die 1000 (erster angelegter Benutzer des Clients). Sie kann auf dem Client mit folgendem Befehl ermittelt werden:

# id linuxadmin

Sollte es sich um die ID 1000 handeln, so baut man am Ende des Postsync-Scripts die folgende Zeile ein:

chown 1000:1000 /mnt/home/linuxadmin

Jetzt sind die Rechte wieder richtig gesetzt.

Ergänzende Hinweise

Das obige universelle Skript lässt sich besonders gut im Zusammenspiel mit Hardlinks oder Softlinks verwenden. Bsp: Es gibt innerhalb der Hardwareklasse ubuntu1204 einige Räume, dieselbe printers.conf bekommen sollen, diese kann man dann außerhalb des Unterbaumes ablegen (/var/linbo/printers.conf) und dann mit Hilfe von softlinks in den Baum verlinken.

Hardlinks können auch von Vorteil sein, wenn zunächst an mehreren Stellen dieselbe (große) Datei liegen soll, ohne dass sie auf dem Server den Platz mehrfach verbraucht. Wenn sie dann an einer Stelle geändert wird, passiert das nicht für die anderen Stellen, bspw. enthält /var/linbo/virtual/ ein virtuelles Windows, dann kann man es in die gesamte Klasse mit folgendem Befehl „kopieren“:

rsync -va --link-dest=/var/linbo/virtual/ /var/linbo/virtual/ /var/linbo/linuxmuster-client/ubuntu1204/common/virtual/
1)
Die Raum und Rechnernamen müssen natürlich an die örtlichen Gegebenheitenangepasst werden
2)
Root-Login muss erlaubt sein
3)
Das ist eine von vielen Möglichkeiten das zu tun, hat evtl. beim Ausrollen ein kleines Netzlastproblem - wobei es in einem 100MBit Netz mit 40 Clients problemlos klappt
 [[anwenderwiki:linbo:postsync_scripte:linux_universalscript]] anwenderwiki/linbo/postsync_scripte/linux_universalscript.txt · Zuletzt geändert: 2015/10/16 09:27 (Externe Bearbeitung)