Compare commits

..

4 Commits

Author SHA1 Message Date
aa5a1fcf0a Sitzungsende: naechste Schritte fuer 2026-07-15 festgehalten
Wichtigster Punkt fuer die naechste Sitzung: Herb prueft laptop03 auf
Image-Reife, BEVOR das Master-Image erstellt wird. Danach Stick/Platte-
Schritte in fester Reihenfolge.

Co-Authored-By: Claude Fable 5 <noreply@anthropic.com>
2026-07-13 13:32:17 +02:00
f81dbd8d54 Projektstatus: Teile A-C umgesetzt, offene Stick/Platte-Schritte notiert
Co-Authored-By: Claude Fable 5 <noreply@anthropic.com>
2026-07-13 13:25:57 +02:00
313cfae828 Clonezilla- und Klon-Anleitung auf neuen Reimage-Ablauf umstellen
Co-Authored-By: Claude Fable 5 <noreply@anthropic.com>
2026-07-13 13:25:57 +02:00
72d0b11647 Jahres-Reimage: Boot-Check, GRUB-Eintrag, Clonezilla-Batch-Skript
reimage-check erkennt die Platte DEZNTRSICHERUNG mit neuerem Image und
bootet in den GRUB-Eintrag Schul-Neuinstallation (Clonezilla toram).
schul-reimage.sh: Mini-Menue (AUFSPIELEN auto nach 20 s / IMAGE ERSTELLEN /
Abbrechen), ocs-sr im Batch-Modus ohne Nachpruefung (E-004), Hostname
bleibt erhalten, Admin-Key nur auf laptop03 (E-005). local.yml haelt
alles per Pull aktuell.

Co-Authored-By: Claude Fable 5 <noreply@anthropic.com>
2026-07-13 13:21:32 +02:00
9 changed files with 377 additions and 182 deletions

View File

@@ -1,110 +1,36 @@
# Anleitung: Nach dem Klonen # Anleitung: Nach dem Klonen
Diese Anleitung gilt NACHDEM du: Gilt fuer die **Erstinstallation per USB-Stick** (Weg 3 in
- Das Image mit Clonezilla aufgespielt hast `CLONEZILLA_AUTOMATISCH.md`). Beim automatischen Jahres-Reimage von der
- Das First-Boot-Script ausgefuehrt hast (`sudo ~/ansible-schule/files/first-boot-setup.sh laptopXX`) externen Platte ist NICHTS davon noetig — dort passiert alles von selbst.
--- ## Auf dem frisch geklonten Laptop (einmalig)
## Auf dem Controller (laptop03)
### Schritt 1: IPs aktualisieren
```bash ```bash
cd ~/ansible-schule sudo ~/projekte/schul-laptops/files/first-boot-setup.sh laptopXX
./update-ips.sh
``` ```
Das Script findet automatisch alle eingeschalteten Laptops im Netzwerk und traegt ihre IPs in die inventory.yml ein. Das Script setzt Hostname, SSH-Host-Keys und Machine-ID, entfernt den
Admin-Key (ausser auf laptop03) und aktiviert den ansible-pull-Timer.
**Das war's** — ab jetzt holt sich der Laptop alle 30 Minuten selbst
Updates und Konfiguration aus Gitea, egal in welchem Netz er haengt.
**Erwartete Ausgabe:** ## Kontrolle (optional)
```
=== IP-Adressen aktualisieren ===
laptop01: 192.168.x.x
laptop02: nicht erreichbar
laptop03: 192.168.x.x
...
=== Fertig ===
Aktualisiert: 5
Nicht erreichbar: 11
```
---
### Schritt 2: Verbindung testen
```bash ```bash
ansible all -m ping systemctl list-timers ansible-pull* # Timer aktiv?
journalctl -u ansible-pull -n 30 # letzter Pull-Lauf ok?
cat /etc/schul-image-version # installiertes Image
``` ```
**Erfolg sieht so aus:**
```
laptop03 | SUCCESS => { "ping": "pong" }
laptop10 | SUCCESS => { "ping": "pong" }
```
**Fehler ignorieren** fuer Laptops die nicht eingeschaltet sind - das ist normal.
---
### Schritt 3: Updates auf alle erreichbaren Laptops
```bash
ansible-playbook playbooks/update.yml
```
Oder nur auf bestimmte:
```bash
ansible-playbook playbooks/update.yml --limit laptop10,laptop11
```
---
## Schnellreferenz
| Was | Befehl |
|-----|--------|
| IPs aktualisieren | `./update-ips.sh` |
| Alle pingen | `ansible all -m ping` |
| System-Update | `ansible-playbook playbooks/update.yml` |
| Software installieren | `ansible-playbook playbooks/install-software.yml -e "packages=['vlc']"` |
| Neustarten | `ansible-playbook playbooks/reboot.yml` |
| Nur bestimmte Rechner | `--limit laptop05,laptop06` |
---
## Problemloesungen
### "nicht erreichbar" bei update-ips.sh
- Ist der Laptop eingeschaltet?
- Ist er im gleichen Netzwerk (WLAN/Kabel)?
- Wurde das First-Boot-Script ausgefuehrt?
### SSH-Fehler "Host key verification failed"
```bash
ssh-keygen -R 192.168.x.x
```
(Die IP durch die tatsaechliche IP ersetzen)
### Ansible findet inventory nicht
Immer aus dem richtigen Verzeichnis ausfuehren:
```bash
cd ~/ansible-schule
```
---
## Checkliste neuer Laptop ## Checkliste neuer Laptop
- [ ] Image mit Clonezilla aufgespielt - [ ] Image per Stick aufgespielt (nimmt automatisch das neueste)
- [ ] First-Boot-Script: `sudo ~/ansible-schule/files/first-boot-setup.sh laptopXX` - [ ] `sudo files/first-boot-setup.sh laptopXX` ausgefuehrt
- [ ] Auf Controller: `./update-ips.sh` - [ ] `journalctl -u ansible-pull` zeigt einen erfolgreichen Lauf
- [ ] Testen: `ansible laptopXX -m ping`
## Legacy: Push-Betrieb im Heimnetz
Nur noetig, wenn du aktiv per Push arbeiten willst (funktioniert nicht im
Schul-WLAN) — siehe README.md, Abschnitt „Legacy“ (`update-ips.sh`,
`ansible-playbook playbooks/...`).

View File

@@ -1,5 +1,24 @@
# Changelog # Changelog
## 2026-07-13 — Umbau umgesetzt (Teile AC)
- **Server:** DNS `git.lehrstun.de` (A-Record via Server-Token angelegt),
Nginx-vHost mit Let's-Encrypt-Zertifikat → Gitea; Read-only-Deploy-Key
`ansible-pull-deploy` am Repo, privater Key unter `/root/.ssh/` auf laptop03.
Beide Pull-Wege (HTTPS + SSH 2222) Ende-zu-Ende getestet.
- **Pull-Mechanik:** `local.yml`, `schul-pull.sh`, systemd-Timer (Boot + 30 min)
— laeuft auf laptop03, verwaltet sich selbst per Pull.
- **Jahres-Reimage:** `reimage-check.service` (auf laptop03 deaktiviert),
GRUB-Eintrag „Schul-Neuinstallation“ (custom.cfg, GRUB_DEFAULT=saved),
`schul-reimage.sh` mit Mini-Menue und ocs-sr-Batch-Aufrufen. Per Pull verteilt.
- **Doku:** README, CLONEZILLA_AUTOMATISCH, ANLEITUNG_NACH_KLONEN auf den neuen
Ablauf umgestellt.
- **Offen:** Live-Dateien vom Stick, Image umbenennen, Stick-Update,
Reimage-Test (siehe [[CLAUDE]]).
- **Sitzungsende:** Weiter am 2026-07-15. Erster Schritt dann: Herb prueft
laptop03 auf Image-Reife (was soll geklont werden?) — erst danach
Master-Image. Reihenfolge steht unmissverstaendlich in [[CLAUDE]].
## 2026-07-13 — Projektgruendung & Kurswechsel auf Pull ## 2026-07-13 — Projektgruendung & Kurswechsel auf Pull
- Alter git-loser Ordner `~/ansible-schule` (Jan/Feb 2026) nach - Alter git-loser Ordner `~/ansible-schule` (Jan/Feb 2026) nach

View File

@@ -1,6 +1,6 @@
# schul-laptops — Projektstatus # schul-laptops — Projektstatus
Status: aktiv · Stand: 2026-07-13 Status: aktiv · Stand: 2026-07-13 · Pull-Mechanik LAEUFT auf laptop03, Reimage-Skripte verteilt — es fehlt nur noch der Hardware-Teil (Stick/Platte)
## Worum es geht ## Worum es geht
@@ -31,15 +31,38 @@ Benutzer auf den Laptops: `puettmann` (Admin, passwordless sudo), `schueler` (oh
## Blocker ## Blocker
- Keine. - Keine Software-Blocker. Es fehlt nur Hardware am laptop03:
CLONEZILLA-Stick + Platte DEZNTRSICHERUNG (siehe naechste Schritte).
## Naechste Schritte ## Naechste Schritte — GENAU IN DIESER REIHENFOLGE (naechste Sitzung: 2026-07-15)
- [ ] Teil A: Server — DNS `git.lehrstun.de`, Nginx-vHost, Deploy-Key **Als Erstes, BEVOR irgendein Image erstellt wird:**
- [ ] Teil B: Pull-Mechanik (local.yml, schul-pull.sh, systemd-Units, first-boot)
- [ ] Teil C: Jahres-Reimage (Clonezilla lokal, Boot-Check, Mini-Menue) 1. [ ] **Herb prueft laptop03 auf Image-Reife.** Herb will kontrollieren, ob
- [ ] Teil D: Aktivierung auf laptop03 + Verifikation alles auf diesem Rechner ist, was geklont werden soll (Software, Einstellungen,
- [ ] Master-Image erstellen, Rollout auf laptop0116 (auch laptop10 neu) schueler-Account). Die naechste Instanz soll ihn dabei aktiv unterstuetzen:
installierte Programme durchgehen, Home-Verzeichnisse auf Muell/Privates
pruefen (z.B. `~/RS41ng` bleibt — ist ok, wird mitgeklont), offene Fragen stellen.
**Kein Master-Image erstellen, bevor Herb das freigegeben hat!**
**Danach (Stick + Platte muessen an laptop03 stecken):**
2. [ ] Clonezilla-Live-Dateien vom Stick (Ordner `/live/`: vmlinuz, initrd.img,
filesystem.squashfs) nach `/boot/clonezilla/` kopieren
3. [ ] Bestandsimage auf der Platte umbenennen: `schule-laptop`
`schule-laptop-2026-02-01` (Datums-Schema, neuestes gewinnt)
4. [ ] Stick-Menue (syslinux.cfg + grub.cfg auf dem Stick) auf
„neuestes Image“-Logik + `files/clonezilla/schul-reimage.sh` umstellen
5. [ ] Reimage-Kette TROCKEN testen (auf laptop03 nur den Check, nie den Restore:
`sudo /usr/local/bin/reimage-check.sh` mit angesteckter Platte ausfuehren —
wegen Hostname-Schutz muss er ohne Aktion beenden; Logik ggf. mit
ueberschriebenem Hostname-Check auf einer Wegwerf-Kopie pruefen)
6. [ ] Neues Master-Image erstellen: laptop03 neu starten, GRUB-Eintrag
„Schul-Neuinstallation“ → Taste `i` (IMAGE ERSTELLEN)
7. [ ] ECHTER Reimage-Test auf laptop10 (Opfer-Laptop): Platte dran, einschalten,
warten — muss sich danach als laptop10 mit neuem Image melden
8. [ ] Rollout auf laptop0116 (Erstinstallation per Stick, Weg 3 in
`CLONEZILLA_AUTOMATISCH.md`)
## Hinweise ## Hinweise

View File

@@ -1,99 +1,82 @@
# Clonezilla Automatisiert - USB + Externe Festplatte # Clonezilla — Images erstellen & aufspielen
## Setup ## Setup
- **USB-Stick:** CLONEZILLA (7,6 GB) - enthält Clonezilla Live - **Externe Festplatte:** `DEZNTRSICHERUNG` (1,8 TB) — traegt die Images
- **Externe Festplatte:** DEZNTRSICHERUNG (1,8 TB) - enthält das Image - **Images:** Ordner `schule-laptop-JJJJ-MM-TT` — es koennen mehrere liegen,
- **Image-Name:** `schule-laptop` **das neueste (Datumsname) gewinnt immer**
- **USB-Stick:** `CLONEZILLA` — nur noch fuer die **Erstinstallation** und als
Rettung, falls ein Laptop gar nicht mehr bootet
- Jeder Laptop merkt sich sein installiertes Image in `/etc/schul-image-version`
## Boot-Menü ## Weg 1: Jahres-Reimage OHNE Stick (der Normalfall)
Beim Booten vom USB-Stick erscheinen zwei Hauptoptionen: 1. Platte `DEZNTRSICHERUNG` an den Laptop anstecken
2. Laptop einschalten — mehr nicht
3. Der Laptop erkennt beim Boot, dass ein neueres Image auf der Platte liegt,
und startet automatisch in die Image-Station (Clonezilla aus `/boot/clonezilla`,
laeuft komplett im RAM)
4. Mini-Menue erscheint:
- **AUFSPIELEN** — vorausgewaehlt, startet nach 20 s von selbst
- **IMAGE ERSTELLEN** — diesen Rechner als neues Image sichern
- **Abbrechen** — normaler Neustart
5. Beim Aufspielen bleibt der **Hostname erhalten** (laptop11 bleibt laptop11);
SSH-Host-Keys, Machine-ID und Versionsdatei werden automatisch neu gesetzt.
Danach: Poweroff. Fertig — kein first-boot-Script noetig.
``` Steckt die Platte beim naechsten Boot noch, passiert nichts mehr
>>> IMAGE AUFSPIELEN (Laptop bespielen) <<< [Standard] (Versionsvergleich). **laptop03 (Master) bespielt sich nie selbst**
>>> IMAGE ERSTELLEN (Laptop sichern) <<< dort ist der Boot-Check deaktiviert.
```
**Nach der Auswahl läuft alles automatisch** - keine weitere Eingabe nötig! ## Weg 2: Neues Master-Image erstellen (auf laptop03)
Der Computer fährt nach Abschluss automatisch herunter.
## Workflow 1. Platte anstecken, laptop03 neu starten
2. Im GRUB-Menue **„Schul-Neuinstallation“** waehlen (Eintrag ist im normalen
Boot nicht sichtbar, ggf. `Esc`/`Shift` beim Boot halten)
3. Im Mini-Menue **„IMAGE ERSTELLEN“** (Taste `i`) — Image heisst automatisch
`schule-laptop-<heutiges Datum>` und ist damit sofort das neueste
4. Rechner faehrt herunter, wenn fertig
### 1. Master-Image erstellen (einmalig) ## Weg 3: Erstinstallation per USB-Stick
1. Master-Laptop (laptop03) vorbereiten und testen 1. Stick `CLONEZILLA` **und** Platte anstecken, per `F12` vom Stick booten
2. USB-Stick und externe Festplatte anschließen 2. „IMAGE AUFSPIELEN“ waehlen — nimmt automatisch das neueste Image
3. Von USB booten (F12) 3. Nach dem Poweroff booten und einmalig den Namen vergeben:
4. **"IMAGE ERSTELLEN"** wählen
5. Warten bis Computer herunterfährt
6. Image liegt dann auf der externen Festplatte als Ordner `schule-laptop`
### 2. Image auf andere Laptops aufspielen
1. USB-Stick und externe Festplatte anschließen
2. Von USB booten (F12)
3. **"IMAGE AUFSPIELEN"** wählen (ist bereits vorausgewählt)
4. Warten bis Computer herunterfährt (~5-10 Min mit SSD)
5. First-Boot-Script ausführen:
```bash ```bash
sudo ~/ansible-schule/files/first-boot-setup.sh laptop05 sudo ~/projekte/schul-laptops/files/first-boot-setup.sh laptop05
``` ```
Ab dann laeuft ansible-pull und der Laptop haelt sich selbst aktuell.
## Technische Details ## Technische Details
### Clonezilla-Parameter für Image erstellen - Alle `ocs-sr`-Aufrufe laufen im **Batch-Modus ohne Sicherheitsabfragen und
``` ohne Nachpruefung** (`-batch -scs/-scr -icds -sfsck`, Entscheidung E-004 —
ocs-sr -q2 -c -j2 -z5p -i 4096 -sfsck -senc -p poweroff savedisk schule-laptop sda 12x identische Hardware, Fehlerfaelle macht Herb von Hand)
``` - Restore: `ocs-sr -g auto -e1 auto -e2 -r -j2 -icds -k1 -scr -batch -p true restoredisk <image> sda`
- `-q2` - Priorität: partclone > partimage > dd - Save: `ocs-sr -q2 -j2 -z5p -i 4096 -sfsck -senc -scs -batch -p true savedisk <image> sda`
- `-z5p` - Kompression mit zstd (schnell, gut) - Menue/Ablauf: `files/clonezilla/schul-reimage.sh` (liegt auf jedem Laptop
- `-i 4096` - Splitgröße 4GB unter `/boot/clonezilla/`, wird per ansible-pull aktuell gehalten)
- `-sfsck` - Filesystem-Check überspringen (schneller) - GRUB-Eintrag: `files/clonezilla/grub-custom.cfg` → `/boot/grub/custom.cfg`
- `-p poweroff` - Nach Abschluss herunterfahren - Boot-Check: `files/reimage-check.sh` + `.service`
### Clonezilla-Parameter für Image aufspielen ## Voraussetzung: Clonezilla-Live-Dateien im Image
```
ocs-sr -g auto -e1 auto -e2 -r -j2 -icds -k1 -p poweroff restoredisk schule-laptop sda
```
- `-g auto` - Geometrie automatisch
- `-e1 auto -e2` - MBR/Partitionstabelle wiederherstellen
- `-r` - Partitionsgrößen anpassen
- `-icds` - Bestätigung überspringen
- `-k1` - Partitionstabelle der Zielfestplatte erstellen
- `-p poweroff` - Nach Abschluss herunterfahren
## Weitere Boot-Optionen `/boot/clonezilla/` braucht einmalig `vmlinuz`, `initrd.img` und
`filesystem.squashfs` vom Clonezilla-Stick (Ordner `/live/`). Sie sind zu gross
fuer git und kommen ueber das Master-Image auf alle Laptops. Fehlen sie, meldet
der Pull-Lauf einen Hinweis im Journal.
- **Clonezilla manuell** - Alle Optionen, für Experten ## Problemloesungen
- **Von Festplatte starten** - Normaler Boot
- **Erweiterte Optionen:**
- Image aufspielen (in RAM) - USB kann nach Start entfernt werden
- Failsafe-Modus - Bei Boot-Problemen
- Memtest - RAM-Test
## Problemlösungen - **„Mount failed“ / Platte nicht gefunden:** Label pruefen:
`sudo ntfslabel /dev/sdX1 DEZNTRSICHERUNG`
- **Kein Image gefunden:** Liegt ein Ordner `schule-laptop-*` auf der Platte?
- **Laptop bootet nach Reimage nicht:** Stick benutzen (Weg 3) — der Stick ist
die Rettungsleine und funktioniert immer
### "Mount failed" für externe Festplatte ## Zeiten (12x gleiche Hardware, SSD + USB 3.0)
- Prüfen ob Festplatte das Label "DEZNTRSICHERUNG" hat
- Festplatte neu formatieren und Label setzen:
```bash
sudo ntfslabel /dev/sdX1 DEZNTRSICHERUNG
```
### Image existiert nicht (beim Aufspielen) | Aktion | Dauer |
- Erst "IMAGE ERSTELLEN" auf dem Master-Laptop ausführen |---|---|
- Prüfen ob Ordner `schule-laptop` auf der externen Festplatte existiert | Image erstellen | ~1015 Min |
| Image aufspielen | ~510 Min |
### Falsches Device (nicht sda)
- Manuellen Modus verwenden und Device anpassen
- Oder Konfiguration auf USB-Stick anpassen:
- BIOS: `/syslinux/syslinux.cfg`
- UEFI: `/boot/grub/grub.cfg`
## Zeiten (geschätzt)
| Aktion | SSD + USB 3.0 | HDD + USB 2.0 |
|--------|---------------|---------------|
| Image erstellen | ~10-15 Min | ~30-45 Min |
| Image aufspielen | ~5-10 Min | ~20-30 Min |

View File

@@ -0,0 +1,9 @@
# Wird von GRUB (41_custom) zur Boot-Zeit gelesen — kein update-grub noetig.
# Ziel von "grub-reboot Schul-Neuinstallation" (reimage-check.service).
# Bootet Clonezilla-Live aus /boot/clonezilla komplett ins RAM (toram),
# damit die eigene Platte ueberschrieben werden kann.
menuentry "Schul-Neuinstallation" {
search --no-floppy --file --set=root /boot/clonezilla/vmlinuz
linux /boot/clonezilla/vmlinuz boot=live union=overlay username=user config components noswap edd=on noprompt nosplash live-media-path=/boot/clonezilla toram=filesystem.squashfs locales=de_DE.UTF-8 keyboard-layouts=de ocs_live_batch="yes" ocs_live_run="bash /run/live/medium/boot/clonezilla/schul-reimage.sh"
initrd /boot/clonezilla/initrd.img
}

View File

@@ -0,0 +1,118 @@
#!/bin/bash
#
# Laeuft in der Clonezilla-Live-Umgebung (via ocs_live_run, toram).
# Eigenes Mini-Menue statt Clonezilla-TUI, alle Sicherheitsschranken aus (E-004):
#
# AUFSPIELEN - neuestes Image von der Platte, Hostname bleibt erhalten
# (vorausgewaehlt, startet nach 20 s automatisch)
# IMAGE ERSTELLEN - sichert diesen Rechner als schule-laptop-<Datum>
# ABBRECHEN - Neustart ins normale System
#
set -u
DISK="sda"
ROOT_PART="/dev/sda2" # 12x identische Hardware: UEFI, sda1=EFI, sda2=System
LABEL="DEZNTRSICHERUNG"
IMG_MNT="/home/partimag" # Clonezilla-Standardpfad fuer Images
VERSION_FILE="/etc/schul-image-version"
rot() { echo -e "\033[0;31m$*\033[0m"; }
gruen(){ echo -e "\033[0;32m$*\033[0m"; }
gelb() { echo -e "\033[1;33m$*\033[0m"; }
# ---------- Image-Platte einbinden ----------
mkdir -p "$IMG_MNT"
if ! mountpoint -q "$IMG_MNT"; then
DEV=$(blkid -L "$LABEL" 2>/dev/null)
if [ -z "$DEV" ] || ! mount "$DEV" "$IMG_MNT"; then
rot "Platte '$LABEL' nicht gefunden — Neustart in 15 s."
sleep 15; reboot; exit 1
fi
fi
NEWEST=$(find "$IMG_MNT" -maxdepth 1 -name 'schule-laptop-*' -type d -printf '%f\n' | sort | tail -1)
# ---------- Hostname aus dem alten System retten ----------
OLD_HOSTNAME=""
mkdir -p /mnt/altes-system
if mount -o ro "$ROOT_PART" /mnt/altes-system 2>/dev/null; then
OLD_HOSTNAME=$(cat /mnt/altes-system/etc/hostname 2>/dev/null | tr -d '[:space:]')
umount /mnt/altes-system
fi
# ---------- Mini-Menue ----------
clear
gruen "==============================================="
gruen " SCHUL-LAPTOPS — IMAGE-STATION"
gruen "==============================================="
echo "Rechner: ${OLD_HOSTNAME:-unbekannt}"
echo "Neuestes Image: ${NEWEST:-KEINES GEFUNDEN}"
echo
echo " [a] AUFSPIELEN (Standard, startet automatisch)"
echo " [i] IMAGE ERSTELLEN (diesen Rechner sichern)"
echo " [x] Abbrechen (Neustart ins normale System)"
echo
gelb "AUFSPIELEN startet in 20 Sekunden ..."
WAHL="a"
read -t 20 -n 1 -r WAHL_INPUT && WAHL="${WAHL_INPUT:-a}"
echo
case "$WAHL" in
i|I)
NEU="schule-laptop-$(date +%Y-%m-%d)"
gelb "Erstelle Image '$NEU' von /dev/$DISK ..."
# Batch, zstd-Kompression, KEINE Nachpruefung des Images (-scs, E-004)
/usr/sbin/ocs-sr -q2 -j2 -z5p -i 4096 -sfsck -senc -scs -batch -p true savedisk "$NEU" "$DISK"
# Eigene Versionsdatei nachziehen: der gesicherte Rechner ist damit "aktuell"
# und bespielt sich nicht beim naechsten Boot selbst mit dem eigenen Image.
if mount "$ROOT_PART" /mnt/altes-system 2>/dev/null; then
echo "$NEU" > /mnt/altes-system$VERSION_FILE
umount /mnt/altes-system
fi
gruen "Image '$NEU' erstellt — Rechner faehrt herunter."
sleep 5; poweroff
;;
x|X)
gelb "Abgebrochen — Neustart."
sleep 3; reboot
;;
*)
if [ -z "$NEWEST" ]; then
rot "Kein Image auf der Platte — Neustart in 15 s."
sleep 15; reboot; exit 1
fi
gelb "Spiele '$NEWEST' auf /dev/$DISK auf ..."
# Batch, KEINE Bestaetigungen, KEINE Nachpruefung (-scr), Groessencheck aus (E-004)
/usr/sbin/ocs-sr -g auto -e1 auto -e2 -r -j2 -icds -k1 -scr -batch -p true restoredisk "$NEWEST" "$DISK"
# ---------- Frisches System personalisieren ----------
gelb "Personalisiere frisches System (${OLD_HOSTNAME:-laptopXX}) ..."
mkdir -p /mnt/neues-system
if mount "$ROOT_PART" /mnt/neues-system; then
if [ -n "$OLD_HOSTNAME" ]; then
echo "$OLD_HOSTNAME" > /mnt/neues-system/etc/hostname
sed -i "s/127.0.1.1.*/127.0.1.1\t$OLD_HOSTNAME/" /mnt/neues-system/etc/hosts
fi
# Neue SSH-Host-Keys + Machine-ID (jeder Klon muss eindeutig sein)
rm -f /mnt/neues-system/etc/ssh/ssh_host_*
chroot /mnt/neues-system ssh-keygen -A
rm -f /mnt/neues-system/etc/machine-id /mnt/neues-system/var/lib/dbus/machine-id
chroot /mnt/neues-system dbus-uuidgen --ensure=/etc/machine-id
cp /mnt/neues-system/etc/machine-id /mnt/neues-system/var/lib/dbus/machine-id
# Versionsdatei: dieses Image ist jetzt installiert
echo "$NEWEST" > /mnt/neues-system$VERSION_FILE
# Privater Gitea-Admin-Key gehoert nur auf laptop03 (E-005)
if [ "$OLD_HOSTNAME" != "laptop03" ]; then
rm -f /mnt/neues-system/home/puettmann/.ssh/id_ed25519 \
/mnt/neues-system/home/puettmann/.ssh/id_ed25519.pub
fi
umount /mnt/neues-system
gruen "Fertig: ${OLD_HOSTNAME:-unbenannt} mit Image '$NEWEST'."
else
rot "Konnte frisches System nicht mounten — Personalisierung uebersprungen!"
rot "Bitte von Hand: first-boot-setup.sh ausfuehren."
sleep 15
fi
sleep 5; poweroff
;;
esac

View File

@@ -0,0 +1,11 @@
[Unit]
Description=Schul-Laptops: Pruefen ob ein neues Image aufgespielt werden soll
[Service]
Type=oneshot
# USB-Platte braucht einen Moment, bis sie erkannt ist
ExecStartPre=/bin/sleep 5
ExecStart=/usr/local/bin/reimage-check.sh
[Install]
WantedBy=multi-user.target

37
files/reimage-check.sh Normal file
View File

@@ -0,0 +1,37 @@
#!/bin/bash
#
# Prueft beim Boot, ob die Image-Platte (DEZNTRSICHERUNG) angeschlossen ist
# und ein neueres Image traegt als das installierte. Wenn ja: einmaliger
# Reboot in den GRUB-Eintrag "Schul-Neuinstallation" (Clonezilla, toram).
#
# Sicherungen gegen Fehlausloesung:
# - laptop03 (Master) bespielt sich nie selbst (E-004)
# - Versionsvergleich verhindert Reimage-Schleifen bei steckender Platte
#
set -u
LABEL="DEZNTRSICHERUNG"
VERSION_FILE="/etc/schul-image-version"
GRUB_ENTRY="Schul-Neuinstallation"
# Der Master ist tabu — doppelte Absicherung zusaetzlich zum deaktivierten Service
[ "$(hostname)" = "laptop03" ] && exit 0
DEV=$(blkid -L "$LABEL" 2>/dev/null) || exit 0
[ -n "$DEV" ] || exit 0
MNT=$(mktemp -d)
mount -o ro "$DEV" "$MNT" 2>/dev/null || { rmdir "$MNT"; exit 0; }
NEWEST=$(find "$MNT" -maxdepth 1 -name 'schule-laptop-*' -type d -printf '%f\n' 2>/dev/null | sort | tail -1)
umount "$MNT"
rmdir "$MNT"
[ -n "$NEWEST" ] || exit 0
INSTALLED=$(cat "$VERSION_FILE" 2>/dev/null || echo "0")
if [ "$NEWEST" \> "$INSTALLED" ]; then
echo "Neues Image '$NEWEST' gefunden (installiert: '$INSTALLED') — Neuinstallation beim naechsten Boot."
grub-reboot "$GRUB_ENTRY" && systemctl reboot
fi
exit 0

View File

@@ -50,6 +50,75 @@
enabled: yes enabled: yes
state: started state: started
# --- Jahres-Reimage: Boot-Check + GRUB-Eintrag aktuell halten ---
- name: reimage-check-Script installieren
copy:
src: files/reimage-check.sh
dest: /usr/local/bin/reimage-check.sh
mode: "0755"
- name: reimage-check.service installieren
copy:
src: files/reimage-check.service
dest: /etc/systemd/system/reimage-check.service
mode: "0644"
register: reimage_unit
- name: systemd neu laden, falls reimage-Unit geaendert
systemd:
daemon_reload: yes
when: reimage_unit.changed
- name: reimage-check aktivieren (alle ausser Master laptop03)
systemd:
name: reimage-check.service
enabled: "{{ 'no' if ansible_hostname == 'laptop03' else 'yes' }}"
- name: GRUB auf gespeicherten Default umstellen (fuer grub-reboot)
lineinfile:
path: /etc/default/grub
regexp: '^GRUB_DEFAULT='
line: 'GRUB_DEFAULT=saved'
register: grub_default
- name: update-grub ausfuehren, falls GRUB-Konfig geaendert
command: update-grub
when: grub_default.changed
- name: Normalen Boot als gespeicherten Default setzen
command: grub-set-default 0
args:
creates: /boot/grub/grubenv
- name: GRUB-Eintrag Schul-Neuinstallation installieren
copy:
src: files/clonezilla/grub-custom.cfg
dest: /boot/grub/custom.cfg
mode: "0644"
- name: Verzeichnis /boot/clonezilla anlegen
file:
path: /boot/clonezilla
state: directory
mode: "0755"
- name: Reimage-Skript nach /boot/clonezilla verteilen
copy:
src: files/clonezilla/schul-reimage.sh
dest: /boot/clonezilla/schul-reimage.sh
mode: "0755"
- name: Pruefen ob Clonezilla-Live-Dateien vorhanden sind
stat:
path: /boot/clonezilla/filesystem.squashfs
register: clonezilla_live
- name: Hinweis falls Clonezilla-Live-Dateien fehlen
debug:
msg: "HINWEIS: /boot/clonezilla ohne Live-Dateien (vmlinuz, initrd.img, filesystem.squashfs) — Reimage ohne Stick nicht moeglich."
when: not clonezilla_live.stat.exists
# --- Status melden --- # --- Status melden ---
- name: Pruefen ob ein Neustart noetig ist - name: Pruefen ob ein Neustart noetig ist