Nach langem ist es mal wieder Zeit für einen Artikel 🙂
Zunächst einmal zur Ausgangslage: Wir befinden uns in einem Windows Client Umfeld, möchten aber Linux Server und Applikationen darauf mit Ansible verwalten. Wir können Docker Desktop auf dem Windows Client ausführen, was mit dem WSL2 Backend läuft.
Jetzt könnte man sagen „Naja, dann installiere doch eine Linux Distribution über die WSL2 und führe Ansible darüber aus!“. Aber ich möchte nicht so viel Overhead auf dem Windows Client. Außerdem kann ich später meinen Ansible Runner nehmen und auf jeder anderen Maschine mit Docker ausführen.
Das können wir anschließend durchführen:
- Ausführen von Ansible Playbooks mit Hilfe eines lokalen Docker Containers
- Laden von Ansible Roles für die Ausführung
- Testen von Ansible Playbooks
Los geht’s!
Vorbereitung des Images
Zunächst müssen wir uns ein Docker Image bauen, mit dem wir Ansible ausführen können. Das kann folgendermaßen aussehen:
FROM ubuntu:22.04
ENV container=docker
ENV pip_packages "ansible"
ENV ANSIBLE_HOST_KEY_CHECKING "False"
# Update System
RUN apt -y update && apt -y upgrade
# Install requirements.
RUN apt -y install python3 python3-pip openssh-client
# Upgrade Pip
RUN pip3 install --upgrade pip
# Install Ansible via Pip.
RUN pip3 install $pip_packages
CMD ["/bin/bash"]
Ich verwende die aktuelle Ubuntu LTS Version als Basisimage. Danach wird ein Systemupdate und die Installation der Python Pakete über APT durchgeführt. Anschließend wird pip3 noch einmal aktualisiert, falls nötig. Danach werden die Pakete aus der Environment Variable „pip_packages“ installiert. In dem Fall ist es nur „ansible“. Für Testzwecke können hier noch weitere Pakete angegeben werden und in ein weiteres Image gepackt werden.
Erstellen des Images
Jetzt kann das Docker Image erstellt werden. Dazu führen wir im Ordner in dem sich auch das „Dockerfile“ befindet, folgenden Befehl aus:
docker build -t dkr-ansible-runner:0.1 .
Damit wird das Image erstellt.

Anschließend kann das Image über folgenden Befehl gestartet werden:
docker run -it dkr-ansible-runner:0.1 /bin/bash
Damit gehen wir in eine interaktive Sitzung in den Container und starten eine Bash. So können wir Befehle erste einmal testen. Später werden wir ein entsprechendes Volume mit unseren Playbook und ggf. Roles, sowie Inventory und SSH Key Dateien laden und die Auführung auf einem Server im Netzwerk testen.

Playbook und Inventory
Um einen Lauf mit „ansible-playbook“ durchzuführen, benötigen wir ein Playbook und eine Inventory Definition. Weiterhin sollten wir für die Anmeldung die SSH Keys verteilt haben.
Unter Windows kann für die Generierung eines SSH Key Pairs das Tool „puttygen“ verwendet werden. Die Datei kann hier bezogen werden:
https://www.chiark.greenend.org.uk/~sgtatham/putty/latest.html
Damit Ansible ohne weitere Probleme nutzbar ist, sollte auf die Passphrase an dieser Stelle verzichtet werden.

Danach kann der Key, Linux kompatibel über „Conversions“ -> „Export OpenSSH Key“ gespeichert werden.
Wir legen auf unserer Windows Maschine einen Ordner an, in dem wir das Ansible Playbook, das Inventory und das SSH Key File speichern. In meinem Fall ist das „D:\DEV\ansible\test-playbook“.
Das Inventory File besteht aus zwei Zeilen:
[all]
192.168.0.123 ansible_ssh_private_key_file=/opt/test-playbook/id_rsa
In der ersten Zeile wird die Hostgruppe angegeben, in diesem Fall „[all]“. In der zweiten Zeile wird die IP Adresse des Hosts angegeben und danach wird eine Host Variable definiert. In dieser lege ich fest, wo sich der SSH Private Key befindet, den ich für die SSH Anmeldung am Server benötige. Den Key haben wir gerade erzeugt. Später beim Containerstart wird dieser Key über einen Mount auf „/opt/test-playbook/“ eingehangen.
Das Playbook sieht folgendermaßen aus:
---
- hosts: all
remote_user: root
tasks:
- name: Ansible Example Ping
ansible.builtin.ping:
Hier wird gesagt, dass wir auf die Hostgruppe „all“, als User „root“ die Aufgabe „ping“ ausführen möchten. Diese ist im Ansible enthalten und ist dafür gedacht um die Verbindung zum Zielhost zu testen.
Nun haben wir alle Dateien zusammen um einen Testlauf durchzuführen.
Ausführen des Playbooks
Um das Playbook nun auszuführen, müssen wir den erstellten Container mit den entsprechenden Paramtern und einer Befehlszeile starten.
Das sieht in meinem Beispiel so aus:
docker run --rm -v /d/DEV/ansible/test-playbook:/opt/test-playbook dkr-ansible-runner:0.1 /bin/bash -c "ansible-playbook -i /opt/test-playbook/inventory.ini /opt/test-playbook/play.yml"
Ich definiere mit „–rm“ das ich den Container nach erfolgtem Durchlauf wieder löschen möchte. Danach sage ich mit „-v“, welchen lokalen Ordner ich auf welchen Ordner im Container mounten möchte. Da ich mich auf Windows befinde, muss ich den lokalen Ordner in der Syntax „/laufwerk/ordner/“ angeben. Danach wird das von mir erstellte Image angegeben. Anschließend kann ein Kommando angegeben werden, was mit dem Container gestartet werden soll. In meinem Fall möchte ich hier ein „ansible-playbook“ starten. Ich führe das aus Gründen der besseren Lesbarkeit und Kompatibilität in einer Bash Sitzung aus.

Somit können wir nun alle Playbooks oder Roles ausführen, die wir möchten, wenn wir sie nur in den richtigen Ordner legen!