drpsychick.ansible_testing

Ansible-Testen

Build Status Lizenz Paypal GitHub Sponsor

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 mit destroy 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:

  1. Uner Projekt auf GitHub fork: https://github.com/DrPsychick/ansible-testing
  2. Klonen Sie das geforkte Projekt auf Ihrer Linux-Box
  3. Erstellen Sie einen Symlink zum Fork in Ihrem Molecule-Szenario (z. B. ./molecule/default/)
  4. Nehmen Sie Änderungen vor und testen Sie Ihre Rolle, bis Sie zufrieden sind - committen Sie und erstellen Sie einen Pull-Request
  5. 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.

  1. Erstellen Sie ein qcow2 Bild oder erstellen Sie einfach einmal eine VM mit unbeaufsichtigter Installation
  2. 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)
  3. 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
Über das Projekt

role for molecule to spin up systemd docker containers or libvirt VMs to test your ansible roles with

Installieren
ansible-galaxy install drpsychick.ansible_testing
Lizenz
mit
Downloads
1.7k
Besitzer
individual, curious, human