From bd4384c36fdc6f1c25b6115d4e95bdd9e32ba835 Mon Sep 17 00:00:00 2001 From: Herb Date: Mon, 13 Jul 2026 13:11:24 +0200 Subject: [PATCH] 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 --- ANLEITUNG_NACH_KLONEN.md | 110 +++++++++++++++++++++++++ CLONEZILLA_AUTOMATISCH.md | 99 +++++++++++++++++++++++ README.md | 144 +++++++++++++++++++++++++++++++++ ansible.cfg | 12 +++ files/first-boot-setup.sh | 61 ++++++++++++++ inventory.yml | 62 ++++++++++++++ playbooks/install-software.yml | 37 +++++++++ playbooks/ping.yml | 17 ++++ playbooks/reboot.yml | 27 +++++++ playbooks/set-hostname.yml | 24 ++++++ playbooks/update.yml | 31 +++++++ update-ips.sh | 82 +++++++++++++++++++ 12 files changed, 706 insertions(+) create mode 100644 ANLEITUNG_NACH_KLONEN.md create mode 100644 CLONEZILLA_AUTOMATISCH.md create mode 100644 README.md create mode 100644 ansible.cfg create mode 100755 files/first-boot-setup.sh create mode 100644 inventory.yml create mode 100644 playbooks/install-software.yml create mode 100644 playbooks/ping.yml create mode 100644 playbooks/reboot.yml create mode 100644 playbooks/set-hostname.yml create mode 100644 playbooks/update.yml create mode 100755 update-ips.sh diff --git a/ANLEITUNG_NACH_KLONEN.md b/ANLEITUNG_NACH_KLONEN.md new file mode 100644 index 0000000..f0301bc --- /dev/null +++ b/ANLEITUNG_NACH_KLONEN.md @@ -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` diff --git a/CLONEZILLA_AUTOMATISCH.md b/CLONEZILLA_AUTOMATISCH.md new file mode 100644 index 0000000..d9f9fff --- /dev/null +++ b/CLONEZILLA_AUTOMATISCH.md @@ -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 | diff --git a/README.md b/README.md new file mode 100644 index 0000000..3fbbe6b --- /dev/null +++ b/README.md @@ -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 diff --git a/ansible.cfg b/ansible.cfg new file mode 100644 index 0000000..221bf8c --- /dev/null +++ b/ansible.cfg @@ -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 diff --git a/files/first-boot-setup.sh b/files/first-boot-setup.sh new file mode 100755 index 0000000..33a63b7 --- /dev/null +++ b/files/first-boot-setup.sh @@ -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 "" diff --git a/inventory.yml b/inventory.yml new file mode 100644 index 0000000..8997329 --- /dev/null +++ b/inventory.yml @@ -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: diff --git a/playbooks/install-software.yml b/playbooks/install-software.yml new file mode 100644 index 0000000..bd20e8c --- /dev/null +++ b/playbooks/install-software.yml @@ -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(', ') }}" diff --git a/playbooks/ping.yml b/playbooks/ping.yml new file mode 100644 index 0000000..0a57dc9 --- /dev/null +++ b/playbooks/ping.yml @@ -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 }}" diff --git a/playbooks/reboot.yml b/playbooks/reboot.yml new file mode 100644 index 0000000..ca18aac --- /dev/null +++ b/playbooks/reboot.yml @@ -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" diff --git a/playbooks/set-hostname.yml b/playbooks/set-hostname.yml new file mode 100644 index 0000000..7b6aacc --- /dev/null +++ b/playbooks/set-hostname.yml @@ -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) }}" diff --git a/playbooks/update.yml b/playbooks/update.yml new file mode 100644 index 0000000..93678cd --- /dev/null +++ b/playbooks/update.yml @@ -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 diff --git a/update-ips.sh b/update-ips.sh new file mode 100755 index 0000000..8c2e8f9 --- /dev/null +++ b/update-ips.sh @@ -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