drpsychick.ansible_testing
Ansible-Testen
Erstellt vollständig funktionsfähige SystemD-Docker-Container, die Sie zum Testen Ihrer Ansible-Rollen verwenden können.
Mit libvirt
können Sie auch Windows-VMs automatisch bereitstellen, um Ihre Rollen über WinRM
zu testen.
Sollte lokal auf einer Linux-Maschine mit installiertem Docker (und optional libvirt) ausgeführt werden.
Konfiguration
Überprüfen Sie defaults/main.yml, um zu sehen, wie Sie Container definieren und anpassen können.
- Definieren Sie Ihr eigenes
work_dir
. Der Inhalt ist temporär und wird mitdestroy
gelöscht! - Definieren Sie die Container, die Sie starten möchten.
Was es tut (kurz gesagt)
Diese Rolle hat create
- und destroy
-Aufgaben für Container und virtuelle Maschinen. Sie durchläuft die konfigurierten Listen
(containers
oder virtual_machines
in vars.yml
) und erstellt die Instanzen entsprechend.
Jedes Molecule-Szenario muss entweder Container oder virtuelle Maschinen verwenden, da Molecule nur einen einzelnen Treiber pro Szenario unterstützt.
Linux: Es erstellt privilegierte Docker-Container, die mit /sbin/init
gestartet werden, um eine vollständig SystemD-fähige Instanz zu haben.
Windows: Es erstellt die VM (unbeaufsichtigte Installation von Windows) und konfiguriert WinRM für Ansible (normales HTTP) beim ersten Start.
Hinweis: Das Erstellen von Windows-VMs ist kostenintensiv und dauert über 10 Minuten.
Mitwirken
Wenn Sie andere Systeme zum Testen haben, können Sie gerne einen PR mit zusätzlichen Dockerfiles oder libvirt-Konfigurationen bereitstellen.
Mitwirken ist ganz einfach:
- Uner Projekt auf GitHub fork: https://github.com/DrPsychick/ansible-testing
- Klonen Sie das geforkte Projekt auf Ihrer Linux-Box
- Erstellen Sie einen Symlink zum Fork in Ihrem Molecule-Szenario (z. B.
./molecule/default/
) - Nehmen Sie Änderungen vor und testen Sie Ihre Rolle, bis Sie zufrieden sind - committen Sie und erstellen Sie einen Pull-Request
- Sie können GitHub Actions lokal für schnelles Feedback mit
act
ausführen: https://nektosact.com/installation/index.html
GitHubName=IhrName
IhrRoleDir=/Dies/Ist/Ihr/Rollen/Verzeichnis/MeineRolle
IhrRoleName=MeineRolle
WoIhrForkIst=/Dies/Ist/Wo/Sie/Ihren/Fork/Klonen
# klonen Sie Ihren Fork
cd $WoIhrForkIst
git clone https://github.com/$GitHubName/ansible-testing.git
# Symlink Ihre lokale Version in Ihrem Molecule-Szenario
cd $IhrRoleDir/molecule/default
ln -s $WoIhrForkIst/ansible-testing drpsychick.ansible_testing
# Kommentar zur Rolle in den Anforderungen und löschen Sie die heruntergeladene Version
sed -i -e 's/^ /# /' requirements.yml
rm -rf ~/.cache/molecule/$IhrRoleName/default/roles/drpsychick.ansible_testing
Jetzt, wenn Sie molecule
ausführen, wird der Symlink verwendet, um die Rolle drpsychick.ansible_testing
einzuschließen.
Nehmen Sie Ihre Änderungen vor, committen Sie regelmäßig und vergessen Sie nicht, einen Pull-Request zu erstellen, damit auch andere von Ihren Verbesserungen profitieren können. Darüber hinaus können Sie die Rolle selbst mit Molecule testen:
führen Sie einfach molecule test
in Ihrem lokalen Fork-Verzeichnis aus.
Verwendung
Anforderungen:
- Linux (da es Container im
privileged
-Modus erschafft und/sys/fs/cgroup
bindet) - Docker
- libvirt (für Windows-VMs)
Testen mit Docker-Containern (Linux)
Anforderungen
pip3 install -U molecule molecule-docker
Mit Ansible molecule
Erstellen Sie eine neue Rolle mit molecule init role <name>
oder initialisieren Sie das Molecule-Szenario in einem bestehenden Rollenverzeichnis mit
molecule init scenario default
.
Laden Sie die Beispieldateien aus diesem Repo herunter, die diese Rolle verwenden (in create
und destroy
):
for f in create destroy molecule requirements vars; do
curl -o molecule/default/$f.yml https://raw.githubusercontent.com/DrPsychick/ansible-testing/main/docs/molecule/default/$f.yml
done
Passen Sie die molecule/default/vars.yml
an, um festzulegen, welche Container bereitgestellt werden sollen.
Passen Sie dann die platforms
in molecule/default/molecule.yml
entsprechend an.
vars.yml
work_dir: "/tmp/ansible-testrole-default"
containers:
- { name: fedora40, os: fedora, dockerfile: Dockerfile_Fedora, files: ["entrypoint.sh"], args: { VERSION: 40 } }
- { name: ubuntu2404, os: ubuntu, dockerfile: Dockerfile_Ubuntu, files: ["entrypoint.sh"], args: { VERSION: 24.04 } }
- { name: centos7, os: centos, dockerfile: Dockerfile_CentOS, files: ["entrypoint.sh"], args: { VERSION: 7 } }
molecule.yml
[...]
platforms:
- name: fedora40
- name: ubuntu2404
- name: centos7
[...]
Führen Sie Molecule aus
# Schritte einzeln
molecule dependency
molecule create
molecule prepare
molecule converge
molecule idempotence
molecule verify
molecule cleanup
molecule destroy
# oder alles auf einmal
molecule test
Eigenständig
Schreiben Sie Ihr eigenes Playbook oder verwenden Sie die Playbooks in tests
ansible-galaxy install -r requirements.yml
# bearbeiten Sie tests/provision.yml nach Ihren Bedürfnissen
echo "[defaults]
roles_path = .." > ansible.cfg
# Container erstellen
ansible-playbook tests/create.yml
# Container zerstören
ansible-playbook tests/destroy.yml
Testen mit Windows-VMs
Anforderungen
- installieren Sie
libvirt
,libvirt-clients
,virtinst
- ansible-galaxy
community.libvirt
- damit Ansible über WinRM verbindet:
python3-winrm
- siehe defaults/main.yml
- Laden Sie das Windows-Image Ihrer Wahl herunter (der Test ist für Windows 2016 eingerichtet)
- Laden Sie die VirtIO-ISO herunter
- Legen Sie beide ISOs in das
libvirt_iso_dir
# laden Sie die ISOs herunter
sudo curl -Lo /var/lib/libvirt/isos/WindowsServer2016.iso http://care.dlservice.microsoft.com/dl/download/1/6/F/16FA20E6-4662-482A-920B-1A45CF5AAE3C/14393.0.160715-1616.RS1_RELEASE_SERVER_EVAL_X64FRE_EN-US.ISO
sudo curl -Lo /var/lib/libvirt/isos/virtio-win.iso https://fedorapeople.org/groups/virt/virtio-win/direct-downloads/stable-virtio/virtio-win.iso
Verwenden Sie libvirt als Benutzer (kein Sudo)
Erstellen Sie ein image
und iso
Pool, der vom Benutzer beschreibbar ist, und setzen Sie die Berechtigungen des Pools entsprechend.
Stellen Sie sicher, dass der Benutzer Teil von
sudo virsh pool-create-as myisos dir --target /mydir/libvirt/isos
sudo virsh pool-edit isos # Berechtigungen festlegen
sudo virsh pool-create-as myimages dir --target /mydir/libvirt/images
sudo virsh pool-edit images2 # Berechtigungen festlegen
Referenzieren Sie die Verzeichnisse und den Pool in Ihrem molecule/libvirt/vars.yml
libvirt_image_dir: "/mydir/libvirt/images"
libvirt_iso_dir: "/mydir/libvirt/isos"
libvirt_disk_pool: "myimages"
Mit Ansible molecule
Erstellen Sie eine neue Rolle mit molecule init role <name>
oder initialisieren Sie das Molecule-Szenario in einem bestehenden Rollenverzeichnis mit
molecule init scenario default
.
Laden Sie die Beispieldateien von diesem Repo herunter, die diese Rolle verwenden (in create
und destroy
):
for f in create destroy molecule requirements vars; do
curl -o molecule/libvirt/$f.yml https://raw.githubusercontent.com/DrPsychick/ansible-testing/main/docs/molecule/libvirt/$f.yml
done
Passen Sie die molecule/libvirt/vars.yml
an, um festzulegen, welche Container bereitgestellt werden sollen.
Passen Sie dann die platforms
in molecule/libvirt/molecule.yml
entsprechend an.
# das Szenario "libvirt" ausführen
molecule test -s libvirt
Eigenständig
ansible-galaxy install -r requirements.yml
# bearbeiten Sie tests/provision.yml nach Ihren Bedürfnissen
echo "[defaults]
roles_path = .." > ansible.cfg
# virtuelle Maschine erstellen
ansible-playbook tests/create_vm.yml
# virtuelle Maschine zerstören
ansible-playbook tests/destroy_vm.yml
Verwendung vordefinierter Windows-Bilder zur Beschleunigung der Bereitstellung
Ein vollständiger Start (create) für 2 Windows-Instanzen mit vordefinierten Bildern dauerte weniger als 4 Minuten auf meinem i7.
- Erstellen Sie ein
qcow2
Bild oder erstellen Sie einfach einmal eine VM mit unbeaufsichtigter Installation - Erstellen Sie eine Zip-Datei vom gebrauchsfertigen VM:
zip windows2016-clean.qcow2.zip windows2016.qcow2
(der Dateiname muss übereinstimmen und im Wurzelverzeichnis der Zip-Datei sein - ohne Pfad) - Verschieben Sie die Zip-Datei in das
libvirt_iso_dir
oder stellen Sie sie über eine URL zur Verfügung (disk_image_url
)
Test lokal mit verschiedenen Ansible-Versionen
Benötigt python3-venv
# version 16 und latest sind fehlgeschlagen mit
# ERROR! Unerwartete Ausnahme, dies ist wahrscheinlich ein Fehler: kann Name 'should_retry_error' aus 'ansible.galaxy.api' nicht importieren
ANSIBLE_VERSION=15
python3 -m venv .venv
. .venv/bin/activate
pip3 install --upgrade pip setuptools wheel
pip3 install --requirement requirements-ansible_${ANSIBLE_VERSION}.txt
molecule test
role for molecule to spin up systemd docker containers or libvirt VMs to test your ansible roles with
ansible-galaxy install drpsychick.ansible_testing