Bestand aus ~/ansible-schule uebernehmen (Push-Setup, Stand Feb 2026)
Playbooks, Inventory, update-ips.sh, first-boot-setup.sh und Doku unveraendert aus dem alten git-losen Ordner uebernommen. Co-Authored-By: Claude Fable 5 <noreply@anthropic.com>
This commit is contained in:
110
ANLEITUNG_NACH_KLONEN.md
Normal file
110
ANLEITUNG_NACH_KLONEN.md
Normal file
@@ -0,0 +1,110 @@
|
||||
# Anleitung: Nach dem Klonen
|
||||
|
||||
Diese Anleitung gilt NACHDEM du:
|
||||
- Das Image mit Clonezilla aufgespielt hast
|
||||
- Das First-Boot-Script ausgefuehrt hast (`sudo ~/ansible-schule/files/first-boot-setup.sh laptopXX`)
|
||||
|
||||
---
|
||||
|
||||
## Auf dem Controller (laptop03)
|
||||
|
||||
### Schritt 1: IPs aktualisieren
|
||||
|
||||
```bash
|
||||
cd ~/ansible-schule
|
||||
./update-ips.sh
|
||||
```
|
||||
|
||||
Das Script findet automatisch alle eingeschalteten Laptops im Netzwerk und traegt ihre IPs in die inventory.yml ein.
|
||||
|
||||
**Erwartete Ausgabe:**
|
||||
```
|
||||
=== 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
|
||||
ansible all -m ping
|
||||
```
|
||||
|
||||
**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
|
||||
|
||||
- [ ] Image mit Clonezilla aufgespielt
|
||||
- [ ] First-Boot-Script: `sudo ~/ansible-schule/files/first-boot-setup.sh laptopXX`
|
||||
- [ ] Auf Controller: `./update-ips.sh`
|
||||
- [ ] Testen: `ansible laptopXX -m ping`
|
||||
99
CLONEZILLA_AUTOMATISCH.md
Normal file
99
CLONEZILLA_AUTOMATISCH.md
Normal file
@@ -0,0 +1,99 @@
|
||||
# Clonezilla Automatisiert - USB + Externe Festplatte
|
||||
|
||||
## Setup
|
||||
|
||||
- **USB-Stick:** CLONEZILLA (7,6 GB) - enthält Clonezilla Live
|
||||
- **Externe Festplatte:** DEZNTRSICHERUNG (1,8 TB) - enthält das Image
|
||||
- **Image-Name:** `schule-laptop`
|
||||
|
||||
## Boot-Menü
|
||||
|
||||
Beim Booten vom USB-Stick erscheinen zwei Hauptoptionen:
|
||||
|
||||
```
|
||||
>>> IMAGE AUFSPIELEN (Laptop bespielen) <<< [Standard]
|
||||
>>> IMAGE ERSTELLEN (Laptop sichern) <<<
|
||||
```
|
||||
|
||||
**Nach der Auswahl läuft alles automatisch** - keine weitere Eingabe nötig!
|
||||
Der Computer fährt nach Abschluss automatisch herunter.
|
||||
|
||||
## Workflow
|
||||
|
||||
### 1. Master-Image erstellen (einmalig)
|
||||
|
||||
1. Master-Laptop (laptop03) vorbereiten und testen
|
||||
2. USB-Stick und externe Festplatte anschließen
|
||||
3. Von USB booten (F12)
|
||||
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
|
||||
sudo ~/ansible-schule/files/first-boot-setup.sh laptop05
|
||||
```
|
||||
|
||||
## Technische Details
|
||||
|
||||
### Clonezilla-Parameter für Image erstellen
|
||||
```
|
||||
ocs-sr -q2 -c -j2 -z5p -i 4096 -sfsck -senc -p poweroff savedisk schule-laptop sda
|
||||
```
|
||||
- `-q2` - Priorität: partclone > partimage > dd
|
||||
- `-z5p` - Kompression mit zstd (schnell, gut)
|
||||
- `-i 4096` - Splitgröße 4GB
|
||||
- `-sfsck` - Filesystem-Check überspringen (schneller)
|
||||
- `-p poweroff` - Nach Abschluss herunterfahren
|
||||
|
||||
### Clonezilla-Parameter für Image aufspielen
|
||||
```
|
||||
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
|
||||
|
||||
- **Clonezilla manuell** - Alle Optionen, für Experten
|
||||
- **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" für externe Festplatte
|
||||
- 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)
|
||||
- Erst "IMAGE ERSTELLEN" auf dem Master-Laptop ausführen
|
||||
- Prüfen ob Ordner `schule-laptop` auf der externen Festplatte existiert
|
||||
|
||||
### 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 |
|
||||
144
README.md
Normal file
144
README.md
Normal file
@@ -0,0 +1,144 @@
|
||||
# Ansible Setup - Schul-Laptops
|
||||
|
||||
12 Linux Mint Laptops verwalten mit Ansible + Clonezilla Backup.
|
||||
|
||||
## Erstes Setup (einmalig auf diesem Rechner)
|
||||
|
||||
### 1. Passwordless Sudo einrichten
|
||||
|
||||
Damit Ansible ohne Passwort arbeiten kann:
|
||||
|
||||
```bash
|
||||
sudo visudo
|
||||
```
|
||||
|
||||
Am Ende hinzufuegen:
|
||||
```
|
||||
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
|
||||
nano ~/ansible-schule/inventory.yml
|
||||
```
|
||||
|
||||
## Workflow: Image auf andere Rechner spielen
|
||||
|
||||
### Schritt 1: Image erstellen (Clonezilla)
|
||||
|
||||
1. Clonezilla Live USB-Stick erstellen
|
||||
2. Von USB booten
|
||||
3. "device-image" → "savedisk" waehlen
|
||||
4. Image auf externen Datentraeger speichern
|
||||
|
||||
### Schritt 2: Image auf Clients aufspielen
|
||||
|
||||
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
|
||||
|
||||
```
|
||||
~/ansible-schule/
|
||||
├── ansible.cfg # Ansible-Konfiguration
|
||||
├── inventory.yml # Liste aller Laptops mit IPs
|
||||
├── README.md # Diese Datei
|
||||
├── playbooks/
|
||||
│ ├── ping.yml # Erreichbarkeit testen
|
||||
│ ├── update.yml # System-Updates
|
||||
│ ├── install-software.yml
|
||||
│ ├── reboot.yml
|
||||
│ └── set-hostname.yml
|
||||
└── files/
|
||||
└── first-boot-setup.sh # Nach Klonen ausfuehren
|
||||
```
|
||||
|
||||
## Problemloesungen
|
||||
|
||||
### "Permission denied" bei SSH
|
||||
```bash
|
||||
# SSH-Key manuell kopieren
|
||||
ssh-copy-id puettmann@192.168.1.105
|
||||
```
|
||||
|
||||
### 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
|
||||
12
ansible.cfg
Normal file
12
ansible.cfg
Normal file
@@ -0,0 +1,12 @@
|
||||
[defaults]
|
||||
inventory = ./inventory.yml
|
||||
remote_user = puettmann
|
||||
host_key_checking = False
|
||||
retry_files_enabled = False
|
||||
stdout_callback = yaml
|
||||
|
||||
[privilege_escalation]
|
||||
become = True
|
||||
become_method = sudo
|
||||
become_user = root
|
||||
become_ask_pass = False
|
||||
61
files/first-boot-setup.sh
Executable file
61
files/first-boot-setup.sh
Executable file
@@ -0,0 +1,61 @@
|
||||
#!/bin/bash
|
||||
#
|
||||
# First-Boot Setup fuer geklonte Rechner
|
||||
#
|
||||
# Dieses Script nach dem Klonen EINMAL ausfuehren auf jedem Rechner:
|
||||
# sudo ~/ansible-schule/files/first-boot-setup.sh laptop05
|
||||
#
|
||||
# Es macht:
|
||||
# 1. Neuen Hostnamen setzen
|
||||
# 2. Neue SSH-Host-Keys generieren (wichtig!)
|
||||
# 3. Neue Machine-ID generieren
|
||||
#
|
||||
|
||||
set -e
|
||||
|
||||
# Farben
|
||||
RED='\033[0;31m'
|
||||
GREEN='\033[0;32m'
|
||||
YELLOW='\033[1;33m'
|
||||
NC='\033[0m'
|
||||
|
||||
echo -e "${GREEN}=== First-Boot Setup ===${NC}"
|
||||
|
||||
# Hostname als Parameter oder interaktiv
|
||||
if [ -n "$1" ]; then
|
||||
NEW_HOSTNAME="$1"
|
||||
else
|
||||
read -p "Neuer Hostname (z.B. laptop05): " NEW_HOSTNAME
|
||||
fi
|
||||
|
||||
if [ -z "$NEW_HOSTNAME" ]; then
|
||||
echo -e "${RED}Fehler: Kein Hostname angegeben${NC}"
|
||||
exit 1
|
||||
fi
|
||||
|
||||
echo -e "${YELLOW}Setze Hostname auf: $NEW_HOSTNAME${NC}"
|
||||
|
||||
# 1. Hostname setzen
|
||||
hostnamectl set-hostname "$NEW_HOSTNAME"
|
||||
sed -i "s/127.0.1.1.*/127.0.1.1\t$NEW_HOSTNAME/" /etc/hosts
|
||||
|
||||
# 2. Neue SSH-Host-Keys generieren
|
||||
echo -e "${YELLOW}Generiere neue SSH-Host-Keys...${NC}"
|
||||
rm -f /etc/ssh/ssh_host_*
|
||||
ssh-keygen -A
|
||||
|
||||
# 3. Neue Machine-ID generieren
|
||||
echo -e "${YELLOW}Generiere neue Machine-ID...${NC}"
|
||||
rm -f /etc/machine-id /var/lib/dbus/machine-id
|
||||
dbus-uuidgen --ensure=/etc/machine-id
|
||||
cp /etc/machine-id /var/lib/dbus/machine-id
|
||||
|
||||
# 4. SSH-Dienst neustarten
|
||||
systemctl restart ssh
|
||||
|
||||
echo ""
|
||||
echo -e "${GREEN}=== Setup abgeschlossen ===${NC}"
|
||||
echo -e "Hostname: ${GREEN}$NEW_HOSTNAME${NC}"
|
||||
echo ""
|
||||
echo "Optional: Rechner neustarten mit 'sudo reboot'"
|
||||
echo ""
|
||||
62
inventory.yml
Normal file
62
inventory.yml
Normal file
@@ -0,0 +1,62 @@
|
||||
# Ansible Inventory - Schul-Laptops
|
||||
#
|
||||
# IPs werden automatisch aktualisiert mit ./update-ips.sh
|
||||
# Das Script fragt hostname.local via mDNS ab
|
||||
#
|
||||
all:
|
||||
children:
|
||||
schul_laptops:
|
||||
hosts:
|
||||
laptop01:
|
||||
ansible_host: 0.0.0.0
|
||||
laptop02:
|
||||
ansible_host: 0.0.0.0
|
||||
laptop03:
|
||||
ansible_host: 192.168.1.78
|
||||
laptop04:
|
||||
ansible_host: 0.0.0.0
|
||||
laptop05:
|
||||
ansible_host: 0.0.0.0
|
||||
laptop06:
|
||||
ansible_host: 0.0.0.0
|
||||
laptop07:
|
||||
ansible_host: 0.0.0.0
|
||||
laptop08:
|
||||
ansible_host: 0.0.0.0
|
||||
laptop09:
|
||||
ansible_host: 0.0.0.0
|
||||
laptop10:
|
||||
ansible_host: 192.168.178.68
|
||||
laptop11:
|
||||
ansible_host: 0.0.0.0
|
||||
laptop12:
|
||||
ansible_host: 0.0.0.0
|
||||
laptop13:
|
||||
ansible_host: 0.0.0.0
|
||||
laptop14:
|
||||
ansible_host: 0.0.0.0
|
||||
laptop15:
|
||||
ansible_host: 0.0.0.0
|
||||
laptop16:
|
||||
ansible_host: 0.0.0.0
|
||||
vars:
|
||||
ansible_python_interpreter: /usr/bin/python3
|
||||
|
||||
# Gruppe ohne den Controller (fuer Remote-Updates)
|
||||
clients:
|
||||
hosts:
|
||||
laptop01:
|
||||
laptop02:
|
||||
laptop04:
|
||||
laptop05:
|
||||
laptop06:
|
||||
laptop07:
|
||||
laptop08:
|
||||
laptop09:
|
||||
laptop10:
|
||||
laptop11:
|
||||
laptop12:
|
||||
laptop13:
|
||||
laptop14:
|
||||
laptop15:
|
||||
laptop16:
|
||||
37
playbooks/install-software.yml
Normal file
37
playbooks/install-software.yml
Normal file
@@ -0,0 +1,37 @@
|
||||
# Software auf allen Rechnern installieren
|
||||
#
|
||||
# Verwendung:
|
||||
# ansible-playbook playbooks/install-software.yml
|
||||
#
|
||||
# Oder einzelnes Paket:
|
||||
# ansible-playbook playbooks/install-software.yml -e "packages=['firefox','vlc']"
|
||||
#
|
||||
---
|
||||
- name: Software installieren
|
||||
hosts: clients
|
||||
become: yes
|
||||
|
||||
vars:
|
||||
# Standard-Pakete die installiert werden sollen
|
||||
packages:
|
||||
- htop
|
||||
- git
|
||||
- curl
|
||||
- vim
|
||||
# Weitere Pakete hier hinzufuegen
|
||||
|
||||
tasks:
|
||||
- name: APT Cache aktualisieren
|
||||
apt:
|
||||
update_cache: yes
|
||||
cache_valid_time: 3600
|
||||
|
||||
- name: Pakete installieren
|
||||
apt:
|
||||
name: "{{ packages }}"
|
||||
state: present
|
||||
register: install_result
|
||||
|
||||
- name: Installierte Pakete anzeigen
|
||||
debug:
|
||||
msg: "Installiert: {{ packages | join(', ') }}"
|
||||
17
playbooks/ping.yml
Normal file
17
playbooks/ping.yml
Normal file
@@ -0,0 +1,17 @@
|
||||
# Test-Playbook: Pruefen ob alle Rechner erreichbar sind
|
||||
---
|
||||
- name: Ping alle Laptops
|
||||
hosts: schul_laptops
|
||||
gather_facts: no
|
||||
tasks:
|
||||
- name: Ping
|
||||
ping:
|
||||
|
||||
- name: Zeige Hostname
|
||||
command: hostname
|
||||
register: result
|
||||
changed_when: false
|
||||
|
||||
- name: Ausgabe
|
||||
debug:
|
||||
msg: "{{ inventory_hostname }} antwortet als {{ result.stdout }}"
|
||||
27
playbooks/reboot.yml
Normal file
27
playbooks/reboot.yml
Normal file
@@ -0,0 +1,27 @@
|
||||
# Neustart aller Clients
|
||||
#
|
||||
# Verwendung:
|
||||
# ansible-playbook playbooks/reboot.yml
|
||||
#
|
||||
# Nur bestimmte Rechner:
|
||||
# ansible-playbook playbooks/reboot.yml --limit laptop05,laptop06
|
||||
#
|
||||
---
|
||||
- name: Rechner neustarten
|
||||
hosts: clients
|
||||
become: yes
|
||||
|
||||
tasks:
|
||||
- name: Neustart durchfuehren
|
||||
reboot:
|
||||
reboot_timeout: 300
|
||||
msg: "Neustart durch Ansible"
|
||||
|
||||
- name: Warten bis Rechner wieder erreichbar
|
||||
wait_for_connection:
|
||||
delay: 10
|
||||
timeout: 300
|
||||
|
||||
- name: Bestaetigung
|
||||
debug:
|
||||
msg: "{{ inventory_hostname }} ist wieder online"
|
||||
24
playbooks/set-hostname.yml
Normal file
24
playbooks/set-hostname.yml
Normal file
@@ -0,0 +1,24 @@
|
||||
# Hostname setzen
|
||||
#
|
||||
# Verwendung:
|
||||
# ansible-playbook playbooks/set-hostname.yml --limit laptop05 -e "new_hostname=laptop05"
|
||||
#
|
||||
---
|
||||
- name: Hostname setzen
|
||||
hosts: all
|
||||
become: yes
|
||||
|
||||
tasks:
|
||||
- name: Hostname setzen
|
||||
hostname:
|
||||
name: "{{ new_hostname | default(inventory_hostname) }}"
|
||||
|
||||
- name: /etc/hosts aktualisieren
|
||||
lineinfile:
|
||||
path: /etc/hosts
|
||||
regexp: '^127\.0\.1\.1'
|
||||
line: "127.0.1.1\t{{ new_hostname | default(inventory_hostname) }}"
|
||||
|
||||
- name: Neuer Hostname
|
||||
debug:
|
||||
msg: "Hostname gesetzt auf: {{ new_hostname | default(inventory_hostname) }}"
|
||||
31
playbooks/update.yml
Normal file
31
playbooks/update.yml
Normal file
@@ -0,0 +1,31 @@
|
||||
# System-Update auf allen Rechnern
|
||||
---
|
||||
- name: System Update
|
||||
hosts: clients # Ohne den Controller
|
||||
become: yes
|
||||
|
||||
tasks:
|
||||
- name: APT Cache aktualisieren
|
||||
apt:
|
||||
update_cache: yes
|
||||
cache_valid_time: 3600
|
||||
|
||||
- name: Alle Pakete upgraden
|
||||
apt:
|
||||
upgrade: safe
|
||||
register: upgrade_result
|
||||
|
||||
- name: Zeige aktualisierte Pakete
|
||||
debug:
|
||||
msg: "{{ upgrade_result.stdout_lines | default(['Keine Updates']) }}"
|
||||
when: upgrade_result.stdout_lines is defined
|
||||
|
||||
- name: Pruefen ob Neustart noetig
|
||||
stat:
|
||||
path: /var/run/reboot-required
|
||||
register: reboot_required
|
||||
|
||||
- name: Hinweis wenn Neustart noetig
|
||||
debug:
|
||||
msg: "ACHTUNG: {{ inventory_hostname }} benoetigt einen Neustart!"
|
||||
when: reboot_required.stat.exists
|
||||
82
update-ips.sh
Executable file
82
update-ips.sh
Executable file
@@ -0,0 +1,82 @@
|
||||
#!/bin/bash
|
||||
#
|
||||
# Aktualisiert die IP-Adressen in inventory.yml via mDNS (hostname.local)
|
||||
#
|
||||
# Ausfuehren aus ~/ansible-schule:
|
||||
# ./update-ips.sh
|
||||
#
|
||||
|
||||
INVENTORY="$(dirname "$0")/inventory.yml"
|
||||
|
||||
# Farben
|
||||
GREEN='\033[0;32m'
|
||||
RED='\033[0;31m'
|
||||
YELLOW='\033[1;33m'
|
||||
NC='\033[0m'
|
||||
|
||||
echo "=== IP-Adressen aktualisieren ==="
|
||||
echo ""
|
||||
|
||||
# Alle Hostnamen aus inventory.yml extrahieren (Zeilen mit "laptop" am Anfang)
|
||||
HOSTNAMES=$(grep -E '^\s+laptop[0-9]+:$' "$INVENTORY" | sed 's/://g' | tr -d ' ')
|
||||
|
||||
if [ -z "$HOSTNAMES" ]; then
|
||||
echo -e "${RED}Keine Laptops in inventory.yml gefunden${NC}"
|
||||
exit 1
|
||||
fi
|
||||
|
||||
UPDATED=0
|
||||
FAILED=0
|
||||
|
||||
CURRENT_HOSTNAME=$(hostname)
|
||||
|
||||
for HOST in $HOSTNAMES; do
|
||||
printf "%-12s " "$HOST:"
|
||||
|
||||
IP=""
|
||||
|
||||
# Wenn es der lokale Rechner ist, eigene IPv4 verwenden
|
||||
if [ "$HOST" = "$CURRENT_HOSTNAME" ]; then
|
||||
IP=$(hostname -I | awk '{print $1}')
|
||||
if [ -n "$IP" ]; then
|
||||
echo -e "${GREEN}$IP${NC} (localhost)"
|
||||
fi
|
||||
else
|
||||
# Methode 1: getent hosts (nur IPv4 filtern)
|
||||
IP=$(getent hosts "${HOST}.local" 2>/dev/null | grep -E '^[0-9]+\.' | awk '{print $1}')
|
||||
|
||||
# Methode 2: avahi-resolve mit IPv4
|
||||
if [ -z "$IP" ]; then
|
||||
IP=$(avahi-resolve -4 -n "${HOST}.local" 2>/dev/null | awk '{print $2}')
|
||||
fi
|
||||
|
||||
# Methode 3: ping (extrahiert IP aus Antwort)
|
||||
if [ -z "$IP" ]; then
|
||||
IP=$(ping -4 -c 1 -W 2 "${HOST}.local" 2>/dev/null | grep -oP '(\d+\.){3}\d+' | head -1)
|
||||
fi
|
||||
|
||||
if [ -n "$IP" ]; then
|
||||
echo -e "${GREEN}$IP${NC}"
|
||||
fi
|
||||
fi
|
||||
|
||||
if [ -n "$IP" ]; then
|
||||
# IP in inventory.yml aktualisieren
|
||||
sed -i "/${HOST}:$/,/ansible_host:/ s/ansible_host:.*/ansible_host: $IP/" "$INVENTORY"
|
||||
((UPDATED++))
|
||||
else
|
||||
echo -e "${RED}nicht erreichbar${NC}"
|
||||
((FAILED++))
|
||||
fi
|
||||
done
|
||||
|
||||
echo ""
|
||||
echo "=== Fertig ==="
|
||||
echo -e "Aktualisiert: ${GREEN}$UPDATED${NC}"
|
||||
echo -e "Nicht erreichbar: ${RED}$FAILED${NC}"
|
||||
|
||||
if [ $UPDATED -gt 0 ]; then
|
||||
echo ""
|
||||
echo "Inventory testen:"
|
||||
echo " ansible all -m ping"
|
||||
fi
|
||||
Reference in New Issue
Block a user