Initial
This commit is contained in:
@@ -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"]
|
||||
@@ -0,0 +1,2 @@
|
||||
# Image bauen
|
||||
docker build -t ansible-runner:latest .
|
||||
@@ -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
|
||||
@@ -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."
|
||||
@@ -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
|
||||
@@ -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
|
||||
@@ -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
|
||||
@@ -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"]
|
||||
Reference in New Issue
Block a user