Ansible Molecule: Der DevOps-Baustein für stabile Playbooks

Seite 2: Testen von Ansible Playbooks mit Molecule

Inhaltsverzeichnis

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