#!/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