Testen von Ansible Rollen mittels Molecule –
Seit längerem setzen wir bei unseren Kunden und bei uns das Automatisierungstool Ansible für die Installation und Konfiguration von Systemen ein. Mehrere Aufgaben werden bei Ansible in Rollen zusammengefasst. Um diese Rollen zu testen nutzen wir die Testumgebung Molecule.
Molecule führt beim Testen Syntax- und Lint-Checks (Checks, die die Struktur und Lesbarkeit des Codes testen) aus, erstellt dann eine oder mehrere VMs/Container (unterstützt werden als Driver unter anderem Docker, Vagrant, Openstack). Dann wird auf den zu testenden Maschinen das Ansible Playbook ausgeführt und die Idempotenz (das Ansible-Playbook liefert auch bei mehrfacher Ausführung das gleiche Ergebnis) getestet. Zum Schluss kann der Erfolg des Playbooks mittels Testinfra verifiziert werden.
Beispiel
Installation
Molecule lässt sich einfach über Python-Pip installieren:
1 |
$ pip install --user molecule |
Eine vollständige Installationsanleitung mit betriebssystemspezifischen Abhängigkeiten ist in der offiziellen Dokumentation zu finden. https://molecule.readthedocs.io/en/latest/installation
Konfiguration
Eine neue leere Molecule Rolle lässt sich mittels folgendem Befehl erstellen:
1 |
$ molecule init role -r test-rolle |
die Konfiguration der Testumgebung erfolgt wie bei Ansible mittels YAML Dateien. Die Hauptkonfiguration bildet dabei die Datei “test-rolle/molecule/default/molecule.yml”
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 |
--- driver: name: vagrant provider: name: virtualbox lint: name: yamllint options: config-data: ignore: "**/lib/" platforms: - name: common.localdomain box: debian/stretch64 interfaces: - auto_config: true network_name: private_network type: static ip: 192.168.11.7 groups: - common provisioner: name: ansible env: ANSIBLE_ROLES_PATH: "../../galaxy-axxeo:../../galaxy:../../roles" playbooks: converge: ../../site.yml inventory: links: group_vars: ../../inventories/testing/group_vars/ host_vars: ../../inventories/testing/host_vars/ lint: name: ansible-lint scenario: name: default verifier: name: testinfra lint: name: flake8 |
Ausführung
Ein vollständiger Test wird mittels folgendem Befehl ausgeführt:
1 |
$ molecule test |
Um einzelne Test/Aufgaben wie z.B. nur das Playbook auszuführen führt man folgenden Befehl aus:
1 |
$ molecule converge |
In der folgenden Datei (tasks/main.yml) wurde ein Fehler bei der Einrückung eingebaut, um den Syntax Check zu testen.
1 2 3 4 5 6 7 |
--- # tasks file for test-rolle - name: install nginx package: name: nginx state: present |
Der Syntax Check zeigt dann die dazugehörige Fehlermeldung mit Stelle im Code an.

Im zweiten Beispiel testen wir den Lint Check. Dieser zeigt an, dass die default Meta-Informationen, mit passenden Werten gefüllt werden sollen. In disem Fall mit Platformen für die das Ansible-Playbook gedacht ist. Auch hier wird wieder die passende Stelle im Code angezeigt.

Fazit
Mit Molecule kann man schnell und einfach Ansible Rollen/Playbooks lokal testen, bevor man Sie produktiv einsetzt.