setup-teilnehmer.sh
Pro Teilnehmer ausführen – setzt User, Ports, Lingering und Kursvariablen.
Download und ausführen:
curl -O https://podman.stic.ch/setup/setup-teilnehmer.sh
chmod +x setup-teilnehmer.sh
sudo ./setup-teilnehmer.sh teilnehmer01
sudo ./setup-teilnehmer.sh teilnehmer02
# ...
Was das Skript macht:
- User anlegen mit Passwort
- subuid/subgid für Rootless Podman konfigurieren
- Lingering aktivieren
- Podman prüfen / installieren
- PORT und USER_NAME in ~/.bash_profile setzen
- Kurs-Info Datei erstellen
- Login-Anzeige (MOTD) einrichten
- Kurztest durchführen
setup-teilnehmer.sh
#!/bin/bash
# =============================================================================
# setup-teilnehmer.sh – Podman Kurs Teilnehmer-Setup
# Verwendung: sudo ./setup-teilnehmer.sh <teilnehmername>
# Beispiel: sudo ./setup-teilnehmer.sh teilnehmer01
# =============================================================================
set -euo pipefail
# --- Farben für Output ---
RED='\033[0;31m'
GREEN='\033[0;32m'
YELLOW='\033[1;33m'
NC='\033[0m' # No Color
ok() { echo -e "${GREEN}[OK]${NC} $1"; }
info() { echo -e "${YELLOW}[INFO]${NC} $1"; }
err() { echo -e "${RED}[FEHLER]${NC} $1"; exit 1; }
# --- Parameter prüfen ---
if [[ $# -ne 1 ]]; then
echo "Verwendung: sudo $0 <teilnehmername>"
echo "Beispiel: sudo $0 teilnehmer01"
exit 1
fi
USERNAME="$1"
# Standardpasswort – vor dem Kurs ändern wenn gewünscht
PASSWORD="Kurs2024!"
# Port-Bereich basierend auf User-Nummer zuweisen
# teilnehmer01 → 8100-8199, teilnehmer02 → 8200-8299, etc.
NUM=$(echo "$USERNAME" | grep -oE '[0-9]+$' || true)
if [[ -n "$NUM" ]]; then
PORT_BASE=$((8000 + NUM * 100))
PORT_END=$((PORT_BASE + 99))
PORT_INFO="${PORT_BASE}–${PORT_END}"
else
PORT_BASE=8900
PORT_END=8999
PORT_INFO="8900–8999 (kein Nummer im Username erkannt)"
fi
SERVER_IP=$(hostname -I | awk '{print $1}')
echo ""
echo "=============================================="
echo " Podman Kurs – Teilnehmer Setup"
echo " User: ${USERNAME}"
echo "=============================================="
echo ""
# --- Root-Check ---
if [[ $EUID -ne 0 ]]; then
err "Dieses Skript muss als root ausgeführt werden (sudo)."
fi
# =============================================================================
# SCHRITT 1 – User anlegen
# =============================================================================
info "Lege User '${USERNAME}' an..."
if id "$USERNAME" &>/dev/null; then
info "User '${USERNAME}' existiert bereits – überspringe useradd."
else
useradd -m -s /bin/bash "$USERNAME"
ok "User '${USERNAME}' angelegt."
fi
# Passwort setzen
echo "${USERNAME}:${PASSWORD}" | chpasswd
ok "Passwort gesetzt."
# =============================================================================
# SCHRITT 2 – subuid / subgid für Rootless Podman
# =============================================================================
info "Prüfe subuid/subgid für Rootless Podman..."
if grep -q "^${USERNAME}:" /etc/subuid; then
ok "subuid Eintrag vorhanden."
else
# Letzte verwendete UID ermitteln und nächsten freien Block nehmen
LAST_END=$(awk -F: '{print $2+$3}' /etc/subuid 2>/dev/null | sort -n | tail -1)
START=${LAST_END:-100000}
usermod --add-subuids "${START}-$((START + 65535))" "$USERNAME"
ok "subuid konfiguriert (${START}-$((START + 65535)))."
fi
if grep -q "^${USERNAME}:" /etc/subgid; then
ok "subgid Eintrag vorhanden."
else
LAST_END=$(awk -F: '{print $2+$3}' /etc/subgid 2>/dev/null | sort -n | tail -1)
START=${LAST_END:-100000}
usermod --add-subgids "${START}-$((START + 65535))" "$USERNAME"
ok "subgid konfiguriert."
fi
# =============================================================================
# SCHRITT 3 – Lingering aktivieren
# =============================================================================
info "Aktiviere Lingering für '${USERNAME}'..."
if loginctl show-user "$USERNAME" 2>/dev/null | grep -q "Linger=yes"; then
ok "Lingering bereits aktiv."
else
loginctl enable-linger "$USERNAME"
ok "Lingering aktiviert – Container laufen nach Logout weiter."
fi
# =============================================================================
# SCHRITT 4 – Podman prüfen
# =============================================================================
info "Prüfe ob Podman installiert ist..."
if ! command -v podman &>/dev/null; then
info "Podman nicht gefunden – installiere..."
dnf install -y podman podman-compose container-tools podman-docker
ok "Podman installiert."
else
ok "Podman ist installiert ($(podman --version))."
fi
# =============================================================================
# SCHRITT 5 – Kurs-Info Datei erstellen
# =============================================================================
info "Erstelle Kurs-Info Datei..."
cat > "/home/${USERNAME}/.kurs-info" << EOF
====================================
Podman Kurs – Deine Umgebung
====================================
User: ${USERNAME}
Passwort: ${PASSWORD}
Port-Range: ${PORT_INFO}
Server-IP: ${SERVER_IP}
Schnellstart:
podman images
podman run -d -p ${PORT_BASE}:80 --name mein-nginx nginx
curl http://localhost:${PORT_BASE}
Nützliche Befehle:
podman ps – laufende Container
podman ps -a – alle Container
podman logs <name> – Logs anzeigen
podman exec -it <name> /bin/bash – in Container einloggen
====================================
EOF
chown "${USERNAME}:${USERNAME}" "/home/${USERNAME}/.kurs-info"
ok "Kurs-Info Datei erstellt unter /home/${USERNAME}/.kurs-info"
# =============================================================================
# SCHRITT 6 – Kursvariablen im bash_profile setzen
# =============================================================================
info "Setze Kursvariablen PORT und USER_NAME in ~/.bash_profile..."
BASH_PROFILE="/home/${USERNAME}/.bash_profile"
# Sicherstellen dass bash_profile existiert
touch "$BASH_PROFILE"
# Bestehende Kurs-Variablen-Einträge entfernen (idempotent)
sed -i '/# PODMAN KURS VARIABLEN/,/# END PODMAN KURS VARIABLEN/d' "$BASH_PROFILE" 2>/dev/null || true
# Variablen anhängen
cat >> "$BASH_PROFILE" << VARSEOF
# PODMAN KURS VARIABLEN
export USER_NAME="${USERNAME}"
export PORT=${PORT_BASE}
# END PODMAN KURS VARIABLEN
VARSEOF
chown "${USERNAME}:${USERNAME}" "$BASH_PROFILE"
ok "Kursvariablen gesetzt: USER_NAME=${USERNAME}, PORT=${PORT_BASE}"
# =============================================================================
# SCHRITT 7 – MOTD beim Login anzeigen
# =============================================================================
info "Konfiguriere Login-Anzeige..."
PROFILE_SCRIPT="/etc/profile.d/kurs-info.sh"
if [[ ! -f "$PROFILE_SCRIPT" ]]; then
echo 'cat ~/.kurs-info 2>/dev/null || true' > "$PROFILE_SCRIPT"
chmod +x "$PROFILE_SCRIPT"
ok "Login-Anzeige konfiguriert."
else
ok "Login-Anzeige bereits vorhanden."
fi
# =============================================================================
# ABSCHLUSS – Zusammenfassung und Kurztest
# =============================================================================
echo ""
echo "=============================================="
echo " Setup abgeschlossen – Kurztest läuft..."
echo "=============================================="
echo ""
# Test: kann User podman aufrufen?
if su - "$USERNAME" -c "podman --version" &>/dev/null; then
ok "Podman als '${USERNAME}' aufrufbar."
else
err "Podman als '${USERNAME}' nicht aufrufbar – bitte manuell prüfen."
fi
# Test: subuid gesetzt?
if su - "$USERNAME" -c "podman unshare cat /proc/self/uid_map" &>/dev/null; then
ok "Rootless Podman (UID-Mapping) funktioniert."
else
err "UID-Mapping funktioniert nicht – subuid/subgid prüfen."
fi
echo ""
echo "=============================================="
ok "User '${USERNAME}' ist bereit für den Kurs!"
echo ""
echo " SSH-Zugang: ssh ${USERNAME}@${SERVER_IP}"
echo " Passwort: ${PASSWORD}"
echo " Ports: ${PORT_INFO}"
echo "=============================================="
echo ""