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.

Testen von Ansible Rollen mittels Molecule
Markiert in: