This commit is contained in:
2026-08-15 22:17:32 +02:00
parent 2bc2921c00
commit 2d36bee975
10 changed files with 275 additions and 0 deletions
+27
View File
@@ -0,0 +1,27 @@
# Dockerfile.ansible-runner
FROM python:3.11-slim
# Systemabhängigkeiten installieren (SSH, Git, RSync für Ansible)
RUN apt-get update && \
apt-get install -y --no-install-recommends \
openssh-client \
sshpass \
git \
rsync \
curl \
&& rm -rf /var/lib/apt/lists/*
# Ansible und spezifische Collections installieren
RUN pip install --no-cache-dir ansible ansible-lint
# Wichtige Collections für Docker und allgemeine Systemverwaltung installieren
RUN ansible-galaxy collection install \
community.docker \
community.general \
ansible.posix
# Arbeitsverzeichnis setzen
WORKDIR /ansible
# Standardbefehl (kann via docker run überschrieben werden)
CMD ["ansible", "--version"]
+2
View File
@@ -0,0 +1,2 @@
# Image bauen
docker build -t ansible-runner:latest .
View File
+10
View File
@@ -0,0 +1,10 @@
all:
children:
ubuntu:
hosts:
zotac:
ansible_host: 192.168.0.155
ansible_user: ladm
ansible_ssh_private_key_file: ~/.ssh/id_rsa
vars:
ansible_python_interpreter: /usr/bin/python3
+78
View File
@@ -0,0 +1,78 @@
#!/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"
@@ -0,0 +1,78 @@
---
- name: Installiere Docker Engine, Compose V2 und Buildx
hosts: all
become: true
vars:
docker_dir: "/opt/docker"
docker_group: "docker"
tasks:
- name: Installiere notwendige Voraussetzungen
ansible.builtin.apt:
name:
- ca-certificates
- curl
- gnupg
- lsb-release
state: present
update_cache: true
- name: Füge Docker GPG Schlüssel hinzu
ansible.builtin.apt_key:
url: https://download.docker.com/linux/ubuntu/gpg
state: present
register: add_key_result
failed_when: add_key_result.failed and "KEYEXPIRED" not in add_key_result.msg
- name: Füge Docker Repository hinzu
ansible.builtin.apt_repository:
repo: "deb [arch=amd64] https://download.docker.com/linux/ubuntu {{ ansible_distribution_release }} stable"
state: present
filename: docker
- name: Installiere Docker Engine, CLI und Containerd
ansible.builtin.apt:
name:
- docker-ce
- docker-ce-cli
- containerd.io
- docker-buildx-plugin
- docker-compose-plugin
state: present
update_cache: true
- name: Stelle sicher, dass die Docker Gruppe existiert
ansible.builtin.group:
name: "{{ docker_group }}"
state: present
- name: Erstelle Docker Verzeichnis {{ docker_dir }}
ansible.builtin.file:
path: "{{ docker_dir }}"
state: directory
mode: '0755'
owner: root
group: "{{ docker_group }}"
- name: Aktiviere und starte Docker Dienst
ansible.builtin.systemd:
name: docker
enabled: true
state: started
- name: Verifiziere Installation (Docker Version)
ansible.builtin.command: docker --version
register: docker_version
changed_when: false
- name: Verifiziere Installation (Compose Version)
ansible.builtin.command: docker compose version
register: compose_version
changed_when: false
- name: Zeige Installationsstatus
ansible.builtin.debug:
msg:
- "Docker: {{ docker_version.stdout }}"
- "Compose: {{ compose_version.stdout }}"
- "Verzeichnis {{ docker_dir }} wurde erstellt."
+32
View File
@@ -0,0 +1,32 @@
---
- name: Konfiguriere passwordlosen Sudo Zugriff für ladm
hosts: all
become: true
vars:
sudo_user: "ladm"
sudoers_file: "/etc/sudoers.d/{{ sudo_user }}"
tasks:
- name: Stelle sicher, dass das Verzeichnis /etc/sudoers.d existiert
ansible.builtin.file:
path: /etc/sudoers.d
state: directory
mode: '0750'
owner: root
group: root
- name: Füge passwordlose Sudo Regel für {{ sudo_user }} hinzu
ansible.builtin.lineinfile:
path: "{{ sudoers_file }}"
line: "{{ sudo_user }} ALL=(ALL) NOPASSWD: ALL"
create: true
mode: '0440'
owner: root
group: root
validate: 'visudo -cf %s'
register: sudoers_result
- name: Ausgabe bei Erfolg
ansible.builtin.debug:
msg: "Sudo Zugriff für {{ sudo_user }} erfolgreich eingerichtet."
when: sudoers_result.changed
+7
View File
@@ -0,0 +1,7 @@
# Ansible Runner starten
docker run --rm -it \
-v ~/.ssh:/root/.ssh:ro \
-v $(pwd):/ansible:rw \
-v /var/run/docker.sock:/var/run/docker.sock \
ansible-runner:latest \
$1
+12
View File
@@ -0,0 +1,12 @@
services:
dockhand:
image: fnsys/dockhand:latest
container_name: Dockhand
ports:
- 3000:3000
volumes:
- /volume1/docker/dockhand:/app/data:rw
- /var/run/docker.sock:/var/run/docker.sock
- /etc/timezone:/etc/timezone:ro
- /etc/localtime:/etc/localtime:ro
restart: always
+29
View File
@@ -0,0 +1,29 @@
services:
opencloud:
image: opencloudeu/opencloud-rolling:latest
container_name: opencloud
restart: unless-stopped
ports:
- "9200:9200"
environment:
# WICHTIG: Deine externe Domain, unter der OpenCloud erreichbar sein soll
- OC_URL=https://data.rpcloud.org
- OC_DOMAIN=data.rpcloud.org
# Da NPM das SSL-Zertifikat übernimmt, muss OpenCloud kein eigenes SSL erzwingen:
- PROXY_TLS=false
- OC_INSECURE=false
# Bindet den internen Server an alle Interfaces, damit NPM ihn erreicht
- PROXY_HTTP_ADDR=0.0.0.0:9200
# Zwingend erforderlich beim allerersten Start, sonst bricht der Container ab!
- INITIAL_ADMIN_PASSWORD=Admin123#
volumes:
- /volume1/docker/opencloud/config:/etc/opencloud
- /volume1/docker/opencloud/data:/var/lib/opencloud
# Führt beim Start die Initialisierung aus, falls sie noch nicht existiert, und startet den Server
entrypoint: ["/bin/sh", "-c"]
command: ["opencloud init || true; opencloud server"]