From a6a96f1498afce8b9624060faa65238c60ea97a9 Mon Sep 17 00:00:00 2001 From: DerLinkman Date: Sat, 18 Jul 2026 00:07:44 +0200 Subject: [PATCH] Add ansible docker execution environment (Dockerfile, requirements, runner script) --- docker/Dockerfile | 35 +++++++++++++++++++++++ docker/ansible-functs.sh | 11 +++++++ docker/requirements.yml | 7 +++++ execute.sh | 62 ++++++++++++++++++++++++++++++++++++++++ 4 files changed, 115 insertions(+) create mode 100644 docker/Dockerfile create mode 100644 docker/ansible-functs.sh create mode 100644 docker/requirements.yml create mode 100755 execute.sh diff --git a/docker/Dockerfile b/docker/Dockerfile new file mode 100644 index 0000000..6e2ba27 --- /dev/null +++ b/docker/Dockerfile @@ -0,0 +1,35 @@ +FROM debian:trixie-slim +ARG DEBIAN_FRONTEND=noninteractive +ENV TZ=Europe/Berlin +ENV ANSIBLE_VERSION=2.20.6 +ENV PIP_BREAK_SYSTEM_PACKAGES=1 + +RUN apt update && apt install -y --no-install-recommends \ + nano \ + git \ + wget \ + unzip \ + curl \ + python3-pip \ + tzdata \ + openssh-client \ + iputils-ping \ + && rm -rf /var/lib/apt/lists/* + +RUN mkdir -p /etc/ssh/ssh_config.d \ + && printf 'Host *\n StrictHostKeyChecking no\n UserKnownHostsFile /dev/null\n' > /etc/ssh/ssh_config.d/99-no-hostkey-check.conf + +RUN pip3 install --no-cache-dir --upgrade \ + ansible-core~=${ANSIBLE_VERSION} + +RUN mkdir -p /root/.bashrc.d +COPY ansible-functs.sh /root/.bashrc.d/ansible-functs.sh +RUN chmod +x /root/.bashrc.d/ansible-functs.sh \ + && printf '\n[ -f /root/.bashrc.d/ansible-functs.sh ] && . /root/.bashrc.d/ansible-functs.sh\n' >> /root/.bashrc + +COPY requirements.yml /ansible/requirements.yml +RUN ansible-galaxy collection install -r /ansible/requirements.yml + +WORKDIR /ansible + +CMD ["ansible-playbook", "--version"] \ No newline at end of file diff --git a/docker/ansible-functs.sh b/docker/ansible-functs.sh new file mode 100644 index 0000000..ab29df3 --- /dev/null +++ b/docker/ansible-functs.sh @@ -0,0 +1,11 @@ +#!/bin/bash +# Useful bashrc functions for ansible in docker + +alias ll='ls -alF' +alias la='ls -A' +alias l='ls -CF' + +alias ap='ansible-playbook' +alias ag='ansible-galaxy' +alias av='ansible-vault' + diff --git a/docker/requirements.yml b/docker/requirements.yml new file mode 100644 index 0000000..4b46a6e --- /dev/null +++ b/docker/requirements.yml @@ -0,0 +1,7 @@ +collections: + - name: ansible.posix + version: 2.2.0 + - name: community.general + version: 13.0.1 + - name: community.docker + version: 5.2.0 \ No newline at end of file diff --git a/execute.sh b/execute.sh new file mode 100755 index 0000000..c20dcf5 --- /dev/null +++ b/execute.sh @@ -0,0 +1,62 @@ +#!/bin/bash + +defaultimage="ansible:deb13" + +export ANSIBLE_HOST_KEY_CHECKING=False +export ANSIBLE_SSH_ARGS='-o StrictHostKeyChecking=no -o UserKnownHostsFile=/dev/null' +export ANSIBLE_CONFIG=./ansible.cfg + +# Ermittle den nächsten freien Container-Namen +base_name="ansible" +network_name="ansible-dualstack" +counter=1 +while docker ps -a --format '{{.Names}}' | grep -q "^${base_name}-${counter}$"; do + counter=$((counter + 1)) +done +container_name="${base_name}-${counter}" + +if docker network inspect "$network_name" >/dev/null 2>&1; then + network_ipv6_enabled=$(docker network inspect -f '{{.EnableIPv6}}' "$network_name" 2>/dev/null) + if [ "$network_ipv6_enabled" != "true" ]; then + echo "Docker-Netzwerk '$network_name' existiert bereits ohne IPv6-Unterstuetzung." >&2 + echo "Bitte Netzwerk entfernen oder einen anderen Netzwerknamen verwenden." >&2 + exit 1 + fi +else + if ! docker network create --driver bridge --ipv6 "$network_name" >/dev/null; then + echo "Docker-Netzwerk '$network_name' mit IPv6 konnte nicht erstellt werden." >&2 + echo "Pruefe, ob Docker IPv6 fuer benutzerdefinierte Bridge-Netze unterstuetzt." >&2 + exit 1 + fi +fi + +docker run --rm -dit \ + --name "$container_name" \ + --hostname "$container_name" \ + --network "$network_name" \ + -e ANSIBLE_HOST_KEY_CHECKING=False \ + -e ANSIBLE_SSH_ARGS='-o StrictHostKeyChecking=no -o UserKnownHostsFile=/dev/null' \ + -e ANSIBLE_CONFIG=./ansible.cfg \ + -v "$(pwd):/ansible" \ + -v ansible_ssh_keys:/root/.ssh \ + -w /ansible \ + $defaultimage \ + "/bin/bash" + +docker exec "$container_name" sh -lc "mkdir -p /root/.ssh && chmod 700 /root/.ssh && printf 'Host *\n StrictHostKeyChecking no\n UserKnownHostsFile /dev/null\n' > /root/.ssh/config && chmod 600 /root/.ssh/config" + +container_ipv4=$(docker inspect -f '{{range .NetworkSettings.Networks}}{{if .IPAddress}}{{.IPAddress}}{{end}}{{end}}' "$container_name" 2>/dev/null) +container_ipv6=$(docker inspect -f '{{range .NetworkSettings.Networks}}{{if .GlobalIPv6Address}}{{.GlobalIPv6Address}}{{end}}{{end}}' "$container_name" 2>/dev/null) +container_os=$(docker exec "$container_name" sh -c 'grep PRETTY_NAME /etc/os-release 2>/dev/null | cut -d= -f2 | tr -d "\"" 2>/dev/null') + +echo "-----------------------------------" +echo "Container Name : $container_name" +echo "Container IPv4 : ${container_ipv4:-n/a}" +echo "Container IPv6 : ${container_ipv6:-n/a}" +echo "Container OS : ${container_os:-n/a}" +echo "-----------------------------------" + +docker attach "$container_name" + + +