Ansible Molecule: Der DevOps-Baustein für stabile Playbooks
Seite 2: Testen von Ansible Playbooks mit Molecule
Speziell für das Testen von Ansible-Rollen unter verschiedenen Betriebssystemen steht das Tool Molecule zur Verfügung. Es verwendet das Ansible Playbook, um zu bestimmen, welche Ansible-Rolle getestet werden soll. Molecule greift auf Serverspec, Testinfra oder Goss als Verifier-Backend zurück – wobei es mehrere Backends wie Vagrant, Docker und OpenStack unterstützt. Alle genannten Frameworks sind Bibliotheken, die speziell für das Testen von Infrastruktur im Python-Ökosystem entwickelt wurden.
Mit Molecule können auch Serverspec (wie Test Kitchen), aber auch Testinfra verwendet werden. Wie Serverspec ist Testinfra ein Werkzeug zum Erstellen von Unit-Tests und in Python geschrieben. Um mit Molecule anzufangen, wird es als Python-Bibliothek, zusammen mit dem Docker per pip installiert:
pip install ansible molecule docker
Molecule braucht lediglich eine aktuelle Python-Umgebung – das gesamte Tooling findet darin statt. Zusammen mit der Installation von Molecule erfolgt auch die von Testinfra. Als Referenz dient im Folgenden die Ansible-Docker-Hardening-Rolle docker-hardening role
([ansible-role-secure-docker]).
Molecule lässt sich auch unmittelbar beim Erzeugen neuer Ansible-Rollen nutzen und liefert dabei direkt das Grundgerüst für das Testen:
molecule init --driver docker --role role_name
Im Beispielprojekt enthält der Quellcode bereits einen Ordner namens molecule. Die Molecule-Konfiguration befindet sich in der Datei molecule/default/molecule.yml:
driver:
name: docker
lint:
name: yamllint
Docker dient in diesem Beispiel als Backend und auch das Validieren der YAML-Dateien erfolgt mit yamllint
. Um Docker zu konfigurieren, generiert Molecule aus einer Vorlage ein Docker-Image und startet es:
platforms:
- name: instance
image: debian:9
privileged: true
volumes:
- /var/run/docker.sock:/var/run/docker.sock:rw
- /sys/fs/cgroup:/sys/fs/cgroup:ro
command: /sbin/init
capabilities:
- SYS_ADMIN
exposed_ports:
- 80/udp
- 80/tcp
published_ports:
- 0.0.0.0:8888:80/udp
- 0.0.0.0:8888:80/tcp
groups:
- debian
Um systemd in Docker verwenden zu können, muss in den Image-Abschnitten "privileged" und "capabilities" so konfiguriert sein, dass systemd in Docker-Containern läuft. Die Konfiguration erfordert die Freigabe des Containerkerns, um der Anwendung Zugriff auf den aufrufenden Systemprozess zu erlauben (privilegiert). Darüber hinaus ist der SELinux-Container (capabilities) so zu konfigurieren, dass er in den Host-Speicher schreiben darf.
Die so erzeugten Container taugen lediglich als Testumgebung und eignen sich nicht für den Produktionseinsatz. Ein Molecule-Test läuft in der Praxis normalerweise in der folgenden Reihenfolge ab:
- lint
- destroy
- dependency
- syntax
- create
- prepare
- converge
- idempotence
- side_effect
- verify
- cleanup
- destroy