{{tag>linbo postsync}}
====== Universelles postsync-Skript für Linux ======
Dieses Vorgehen ist veraltet. Bitte lesen Sie hier weiter: [[dokumentation:handbuch62:linbo:cloudclient-singleboot|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/'' 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
* '''': für alle Rechner des Raumes mit diesem Namen
* '''': 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''. ((Die Raum und Rechnernamen müssen natürlich an die örtlichen Gegebenheitenangepasst werden))
== 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 haben((Root-Login muss erlaubt sein)) 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 =====
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.((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))
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.
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:\\
# 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 "" "" "" "" "" ""
/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/