78 lines
3.0 KiB
Bash
78 lines
3.0 KiB
Bash
#!/bin/bash
|
|||
|
|
|
||
|
|
# Konfiguration
|
||
|
|
NEW_HOST_NAME="zotac" # Name im Inventory
|
||
|
|
NEW_HOST_IP="192.168.0.155" # IP-Adresse
|
||
|
|
SSH_USER="ladm" # Remote Benutzer
|
||
|
|
INVENTORY_FILE="inventory.yml"
|
||
|
|
SSH_KEY_DIR="$HOME/.ssh"
|
||
|
|
SSH_KEY_NAME="id_rsa_${NEW_HOST_NAME}"
|
||
|
|
FULL_KEY_PATH="${SSH_KEY_DIR}/${SSH_KEY_NAME}"
|
||
|
|
|
||
|
|
echo ">>> Starte Onboarding für ${NEW_HOST_NAME} (${NEW_HOST_IP})..."
|
||
|
|
|
||
|
|
# 1. SSH-Key generieren (nur wenn nicht vorhanden)
|
||
|
|
if [ ! -f "${FULL_KEY_PATH}" ]; then
|
||
|
|
echo ">>> Generiere neuen SSH-Key: ${SSH_KEY_NAME}"
|
||
|
|
ssh-keygen -t ed25519 -f "${FULL_KEY_PATH}" -N "" -C "ansible-runner-${NEW_HOST_NAME}"
|
||
|
|
else
|
||
|
|
echo ">>> Key existiert bereits: ${SSH_KEY_NAME}"
|
||
|
|
fi
|
||
|
|
|
||
|
|
# 2. Passwort abfragen für initiale Verbindung
|
||
|
|
echo ">>> Bitte geben Sie das Passwort für ${SSH_USER}@${NEW_HOST_IP} ein, um den Key zu installieren:"
|
||
|
|
read -s SSH_PASS
|
||
|
|
|
||
|
|
# 3. Key installieren (ssh-copy-id)
|
||
|
|
echo ">>> Installiere SSH-Key auf dem Remote-Host..."
|
||
|
|
# Wir nutzen sshpass, um das Passwort für ssh-copy-id bereitzustellen
|
||
|
|
if command -v sshpass &> /dev/null; then
|
||
|
|
sshpass -p "${SSH_PASS}" ssh-copy-id -o StrictHostKeyChecking=no -i "${FULL_KEY_PATH}.pub" "${SSH_USER}@${NEW_HOST_IP}"
|
||
|
|
if [ $? -eq 0 ]; then
|
||
|
|
echo ">>> Key erfolgreich installiert."
|
||
|
|
else
|
||
|
|
echo ">>> FEHLER: Key-Installation fehlgeschlagen."
|
||
|
|
exit 1
|
||
|
|
fi
|
||
|
|
else
|
||
|
|
echo ">>> FEHLER: 'sshpass' nicht gefunden. Bitte installieren: sudo apt install sshpass"
|
||
|
|
exit 1
|
||
|
|
fi
|
||
|
|
|
||
|
|
# 4. Host zur Inventory.yml hinzufügen
|
||
|
|
echo ">>> Füge Host zu ${INVENTORY_FILE} hinzu..."
|
||
|
|
|
||
|
|
# Prüfen ob Inventory existiert, sonst Grundgerüst erstellen
|
||
|
|
if [ ! -f "${INVENTORY_FILE}" ]; then
|
||
|
|
cat > "${INVENTORY_FILE}" <<EOF
|
||
|
|
all:
|
||
|
|
children:
|
||
|
|
ubuntu_hosts:
|
||
|
|
hosts:
|
||
|
|
EOF
|
||
|
|
fi
|
||
|
|
|
||
|
|
# Prüfen ob Host schon existiert
|
||
|
|
if grep -q "^\s*${NEW_HOST_NAME}:" "${INVENTORY_FILE}"; then
|
||
|
|
echo ">>> Host ${NEW_HOST_NAME} existiert bereits im Inventory."
|
||
|
|
else
|
||
|
|
# Host einfügen (einfache Append-Logik für flache Struktur)
|
||
|
|
# Wir fügen ihn unter dem ersten 'hosts:' Eintrag ein oder erstellen die Struktur
|
||
|
|
if grep -q "hosts:" "${INVENTORY_FILE}"; then
|
||
|
|
# Einfügen nach der ersten 'hosts:' Zeile (vereinfacht für dieses Skript)
|
||
|
|
# Für komplexe YAML-Strukturen wäre ein Python/Ansible-Skript safer, aber dies reicht für flache Listen
|
||
|
|
sed -i "/hosts:/a\ ${NEW_HOST_NAME}:\n ansible_host: ${NEW_HOST_IP}\n ansible_user: ${SSH_USER}\n ansible_ssh_private_key_file: ${FULL_KEY_PATH}" "${INVENTORY_FILE}"
|
||
|
|
else
|
||
|
|
# Fallback falls Struktur anders ist
|
||
|
|
echo ">>> WARNUNG: Komplexe Inventory-Struktur erkannt. Manuelles Hinzufügen empfohlen."
|
||
|
|
echo "Fügen Sie manuell hinzu:"
|
||
|
|
echo " ${NEW_HOST_NAME}:"
|
||
|
|
echo " ansible_host: ${NEW_HOST_IP}"
|
||
|
|
echo " ansible_user: ${SSH_USER}"
|
||
|
|
echo " ansible_ssh_private_key_file: ${FULL_KEY_PATH}"
|
||
|
|
exit 1
|
||
|
|
fi
|
||
|
|
fi
|
||
|
|
|
||
|
|
echo ">>> Onboarding abgeschlossen!"
|
||
|
|
echo ">>> Testen Sie die Verbindung mit: ansible ${NEW_HOST_NAME} -i ${INVENTORY_FILE} -m ping"
|