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:
$ pip install --user molecule
Eine vollständige Installationsanleitung mit betriebssystemspezifischen Abhängigkeiten ist in der offiziellen Dokumentation zu finden. https://molecule.readthedocs.io/installation
Konfiguration
Eine neue leere Molecule Rolle lässt sich mittels folgendem Befehl erstellen:
$ 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”
---
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:
$ molecule test
Um einzelne Test/Aufgaben wie z.B. nur das Playbook auszuführen führt man folgenden Befehl aus:
$ molecule converge
In der folgenden Datei (tasks/main.yml) wurde ein Fehler bei der Einrückung eingebaut, um den Syntax Check zu testen.
---
# 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.