Ansible Rollen testen mit Molecule

Einer der Vorzüge des Configuration Management Tools Ansible ist der einfach zu lesende sowie zu schreibende Code in YAML. Dazu gehört die Möglichkeit, seinen Code unkompliziert zu testen.

Je nach Umfang der geschriebenen Rollen ist eine direkte Ausführung auf dem Entwicklungsgerät nicht empfehlenswert. Ebenso sollten Tests von neu geschriebenem Code nicht auf der Produktivumgebung ausgeführt werden. Daher bietet sich ein Testsystem an.

Eine der Best Practices bei Ansible ist, zusammengehörende Tasks in Rollen zu strukturieren und parametrisierbar zu halten. Dadurch kann der Code auf unkomplizierte Art und Weise wiederverwendet werden. Zum Test der Funktionalität und der Eigenständigkeit einer Rolle bietet sich das mittlerweile vom Ansible Core Team entwickelte „Ansible Molecule“ an. Hier wird die Rolle standardmäßig auf einem lokal laufenden Docker-Container ausgeführt. Alternativ besteht die Möglichkeit des Tests in einer Vagrantbox oder bei diversen Cloud Providern lauf zu lassen.

Molecule basiert größtenteils auf Ansible. Dementsprechend werden auch die bei Ansible mitgelieferten providerspezifischen Module zum Provisionieren der Testinstanzen verwendet.

Beispiel:

Um eine bereits bestehende Rolle mit Ansible zu testen, muss zuerst ein Szenario erstellt werden:

molecule init scenario -r my-role-name

In molecule/default/ befindet sich die primäre Konfigurationsdatei molecule.yml, die zum Beispiel so aussehen kann:

dependency:
  name: galaxy
  options:
    role-file: requirements.yaml
driver:
  name: docker
lint:
  name: yamllint
platforms:
  - name: c6
    image: centos:6
  - name: c7
    image: centos:7
  - name: d10
    image: debian:10
provisioner:
  name: ansible
  lint:
    name: ansible-lint
verifier:
  name: testinfra
  lint:
    name: flake8

Molecule prüft auch Abhängigkeiten, die vor der Ausführung vorhanden sein müssen. Dazu wird standardmäßig ansible-galaxy verwendet. Dafür kann man eine requirements.yml angeben, in der die erforderlichen Ansible Galaxy Rollen aufgelistet sind. Falls für die verwendeten Module und Plugins bestimmte Python Pakete auf dem Ansible Host vorhanden sein müssen ließen sich diese über den „shell“ Dependency Manager installieren.

Um möglichst den Best Practices zu folgen überprüft Molecule vor Ausführung den Code mit ansible-lint und yamllint.

In der Konfigurationsdatei ist es möglich, verschiedene Plattformen zum Test anzugeben – beispielsweise einen Docker-Containter mit CentOS 7 und Debian 10 als Basis. Plattformunabhängiger Code ist ebenfalls einer der Best Practices von Ansible. Docker ist der Standardprovider. Daher liegt ein dazugehöriges Dockerfile als jinja2-Template vor. Dieses kann beliebig erweitert werden.

Zur Verifizierung von Änderungen nach dem Ausführen der Rolle ist mittels des TestInfra Frameworks das Schreiben von Testcases möglich.

Nach der Initialisierung können mittels molecule create die vorher angegebenen Plattformen erstellt werden. Die Erstellung der Testresourcen kann mittels molecule list verifiziert werden.

Um die Rolle nun auszuführen reicht ein molecule converge.

Falls die Testcases noch nicht 100%ig automatisiert sind, ist die Anmeldung mittels molecule login [–host ] auf einer der Testinstanzen und somit die manuelle Prüfung der Ergebnisse möglich.

Nach erfolgreichem Durchlauf kann man die erstellten Instanzen mittels molecule destroy wieder ausschalten bzw. löschen.

Den kompletten oben beschriebenen Workflow kann man mit dem Kommando molecule test ausführen.

Wie auch Ansible selbst ist die Einstiegshürde für Molecule relativ gering. Gleichzeitig können komplexe Anwendungsfälle durch die Pluginstruktur bedingte hohe Konfigurierbarkeit abgedeckt werden.

The following two tabs change content below.
ATIX-Crew

ATIX-Crew

Der ATIX-Crew gehören Mitglieder aus den unterschiedlichsten Bereichen an. Neben Consultants und Entwicklern schließt sie auch die Kollegen aus dem Support sowie aus Vertrieb und Marketing mit ein.

This post is also available in: Englisch