README auf Pull-Workflow umstellen, Push-Teil als Legacy markieren

Co-Authored-By: Claude Fable 5 <noreply@anthropic.com>
This commit is contained in:
2026-07-13 13:17:14 +02:00
parent d349595aec
commit 78b8e68f9f

178
README.md
View File

@@ -1,144 +1,78 @@
# Ansible Setup - Schul-Laptops # schul-laptops
12 Linux Mint Laptops verwalten mit Ansible + Clonezilla Backup. 1216 Linux-Mint-Laptops verwalten: **ansible-pull** (laufende Updates) +
**Clonezilla** (Komplett-Image ~1×/Jahr). Ueberblick: `COCKPIT.md` · Status:
`CLAUDE.md` · Architektur: `docs/architektur.md`.
## Erstes Setup (einmalig auf diesem Rechner) ## So funktioniert es (Normalfall)
### 1. Passwordless Sudo einrichten Jeder Laptop zieht sich alle 30 Minuten (und bei jedem Boot) selbst dieses Repo
von `https://git.lehrstun.de/admin/schul-laptops.git` und fuehrt `local.yml` aus.
Es gibt keinen Push mehr — das Schul-WLAN laesst das nicht zu.
Damit Ansible ohne Passwort arbeiten kann: **Aenderung ausrollen:**
```bash ```bash
sudo visudo cd ~/projekte/schul-laptops
# z.B. Paket ergaenzen in group_vars/all.yml oder Task in local.yml
git add -A && git commit -m "..." && git push
# fertig — die Laptops holen es sich beim naechsten Timer-Lauf
``` ```
Am Ende hinzufuegen: **Auf einem Laptop nachsehen:**
```
puettmann ALL=(ALL) NOPASSWD: ALL
```
Speichern mit `Ctrl+X`, dann `Y`, dann `Enter`.
### 2. Inventory anpassen
Bearbeite `inventory.yml` und trage die richtigen IP-Adressen ein:
```bash ```bash
nano ~/ansible-schule/inventory.yml systemctl list-timers ansible-pull* # laeuft der Timer?
journalctl -u ansible-pull -n 50 # letztes Pull-Log
sudo systemctl start ansible-pull.service # sofort ziehen statt warten
``` ```
## Workflow: Image auf andere Rechner spielen ## Komplett-Image (~1×/Jahr, nach den Ferien)
### Schritt 1: Image erstellen (Clonezilla) Details in `CLONEZILLA_AUTOMATISCH.md`. Kurzfassung:
1. Clonezilla Live USB-Stick erstellen - **Erstinstallation:** Clonezilla-USB-Stick + externe Platte `DEZNTRSICHERUNG`,
2. Von USB booten danach einmalig `sudo files/first-boot-setup.sh laptopXX` (vergibt den Namen).
3. "device-image" → "savedisk" waehlen - **Danach ohne Stick:** Platte anstecken, Laptop einschalten. Ist das neueste
4. Image auf externen Datentraeger speichern Image auf der Platte neuer als das installierte, bespielt sich der Laptop
selbst neu — der Hostname bleibt erhalten.
### Schritt 2: Image auf Clients aufspielen - **Neues Master-Image:** auf laptop03 im GRUB-Menue „Schul-Neuinstallation“
waehlen → „IMAGE ERSTELLEN“.
1. Von Clonezilla USB booten
2. "device-image" → "restoredisk" waehlen
3. Image auswaehlen, auf Festplatte spielen
### Schritt 3: First-Boot Setup (auf jedem geklonten Rechner)
```bash
sudo ~/ansible-schule/files/first-boot-setup.sh laptop05
```
(Ersetze `laptop05` durch den jeweiligen Hostnamen)
## Ansible Befehle
Alle Befehle aus dem Verzeichnis `~/ansible-schule` ausfuehren:
```bash
cd ~/ansible-schule
```
### Alle Rechner pingen
```bash
ansible-playbook playbooks/ping.yml
```
### System-Update auf allen Clients
```bash
ansible-playbook playbooks/update.yml
```
### Software installieren
```bash
# Standard-Pakete (in der Datei definiert)
ansible-playbook playbooks/install-software.yml
# Bestimmte Pakete
ansible-playbook playbooks/install-software.yml -e "packages=['firefox','vlc','gimp']"
```
### Nur bestimmte Rechner
```bash
ansible-playbook playbooks/update.yml --limit laptop05,laptop06
```
### Alle Clients neustarten
```bash
ansible-playbook playbooks/reboot.yml
```
### Schnelle Befehle ohne Playbook
```bash
# Shell-Befehl auf allen Clients
ansible clients -m shell -a "df -h"
# Paket installieren
ansible clients -m apt -a "name=htop state=present" --become
# Datei kopieren
ansible clients -m copy -a "src=./files/test.txt dest=/tmp/"
```
## Verzeichnisstruktur ## Verzeichnisstruktur
``` ```
~/ansible-schule/ ~/projekte/schul-laptops/
├── ansible.cfg # Ansible-Konfiguration ├── local.yml # DAS Playbook (laeuft per ansible-pull auf jedem Laptop)
├── inventory.yml # Liste aller Laptops mit IPs ├── group_vars/all.yml # Paketliste u.a. Variablen
├── README.md # Diese Datei ├── files/
├── playbooks/ │ ├── schul-pull.sh # Pull-Wrapper (HTTPS, SSH-Fallback)
│ ├── ping.yml # Erreichbarkeit testen │ ├── ansible-pull.service # systemd-Units
│ ├── update.yml # System-Updates │ ├── ansible-pull.timer
── install-software.yml ── first-boot-setup.sh # einmalig nach Erstinstallation
│ ├── reboot.yml ├── docs/ # Architektur, Entscheidungslog
│ └── set-hostname.yml └── playbooks/, inventory.yml, update-ips.sh, ansible.cfg # LEGACY, s.u.
└── files/
└── first-boot-setup.sh # Nach Klonen ausfuehren
``` ```
## Legacy: Push-Betrieb (nur Heimnetz)
Das alte Push-Setup funktioniert weiterhin, aber **nur wenn die Laptops im
eigenen WLAN haengen** (Schul-WLAN blockiert SSH/mDNS zwischen Geraeten):
```bash
./update-ips.sh # IPs per mDNS einsammeln
ansible-playbook playbooks/ping.yml # Erreichbarkeit
ansible-playbook playbooks/update.yml # Updates pushen
ansible clients -m shell -a "df -h" # Ad-hoc-Befehl
```
Voraussetzung auf neuen Controllern: passwordless sudo fuer `puettmann`
(`sudo visudo``puettmann ALL=(ALL) NOPASSWD: ALL`).
## Problemloesungen ## Problemloesungen
### "Permission denied" bei SSH - **Laptop zieht nichts:** `journalctl -u ansible-pull` — HTTPS blockiert? Dann
```bash greift automatisch der SSH-Fallback (Port 2222, Deploy-Key unter /root/.ssh).
# SSH-Key manuell kopieren - **Pull sofort ausloesen:** `sudo systemctl start ansible-pull.service`
ssh-copy-id puettmann@192.168.1.105 - **Push: Permission denied:** `ssh-copy-id puettmann@<IP>`;
``` Host-Key-Warnung: `ssh-keygen -R <IP>`
### Rechner nicht erreichbar
```bash
# Einzelnen Rechner testen
ansible laptop05 -m ping -vvv
```
### Host-Key Warnung
Ist in ansible.cfg deaktiviert. Falls es trotzdem auftritt:
```bash
ssh-keygen -R 192.168.1.105
```
## Tipps
1. **Bandbreite sparen:** Updates nachts oder gestaffelt ausfuehren
2. **Grosse Aenderungen:** Besser per Clonezilla-Image
3. **Kleine Aenderungen:** Ansible (schneller, kein Neustart)
4. **Testen:** Erst mit `--limit laptop05` auf einem Rechner testen