So testen Sie Ansible-Rollen mit Molecule unter Ubuntu 18.04

Der Autor hat dieMozilla Foundationausgewählt, um eine Spende im Rahmen desWrite for DOnations-Programms zu erhalten.

Einführung

Unit-Tests inAnsible sind der Schlüssel, um sicherzustellen, dass die Rollen wie beabsichtigt funktionieren. Molecule erleichtert diesen Prozess, indem Sie Szenarien angeben können, in denen Rollen in verschiedenen Umgebungen getestet werden. Mit Ansible unter der Haube verlagert Molecule Rollen an einen Provisioner, der die Rolle in einer konfigurierten Umgebung bereitstellt und einen Verifizierer (z. B.Testinfra) aufruft, um die Konfigurationsdrift zu überprüfen. Dadurch wird sichergestellt, dass Ihre Rolle alle erwarteten Änderungen an der Umgebung in diesem bestimmten Szenario vorgenommen hat.

In diesem Handbuch erstellen Sie eine Ansible-Rolle, dieApache auf einem Host bereitstellt undfirewalld unter CentOS 7 konfiguriert. Um zu testen, ob diese Rolle wie beabsichtigt funktioniert, erstellen Sie einen Test in Molecule mitDocker als Treiber und Testinfra, einer Python-Bibliothek zum Testen des Serverstatus. Molecule stellt Docker-Container bereit, um die Rolle zu testen, und Testinfra überprüft, ob der Server wie vorgesehen konfiguriert wurde. Wenn Sie fertig sind, können Sie mehrere Testfälle für Builds in verschiedenen Umgebungen erstellen und diese Tests mit Molecule ausführen.

Voraussetzungen

Bevor Sie mit diesem Handbuch beginnen, benötigen Sie Folgendes:

[[Schritt-1 - Vorbereitung der Umgebung]] == Schritt 1 - Vorbereitung der Umgebung

Wenn Sie die Voraussetzungen erfüllt haben, sollten Python 3,venv und Docker installiert und korrekt konfiguriert sein. Beginnen wir mit der Erstellung einer virtuellen Umgebung zum Testen von Ansible mit Molecule.

Beginnen Sie, indem Sie sich als Benutzer ohne Rootberechtigung anmelden und eine neue virtuelle Umgebung erstellen:

python3 -m venv my_env

Aktivieren Sie es, um sicherzustellen, dass Ihre Aktionen auf diese Umgebung beschränkt sind:

source my_env/bin/activate

Installieren Sie als Nächstes in Ihrer aktivierten Umgebung das Paketwheel, das die Erweiterungbdist_wheelsetuptoolsenthält, mit derpip Ansible installiert:

python3 -m pip install wheel

Sie können jetztmolecule unddocker mitpip installieren. Ansible wird automatisch als Abhängigkeit für Molecule installiert:

python3 -m pip install molecule docker

Hier ist, was jedes dieser Pakete tun wird:

  • molecule: Dies ist das Hauptpaket für Moleküle, mit dem Sie Rollen testen. Durch die Installation vonmolecule wird Ansible zusammen mit anderen Abhängigkeiten automatisch installiert und die Verwendung von Ansible-Playbooks zur Ausführung von Rollen und Tests ermöglicht.

  • docker: Diese Python-Bibliothek wird von Molecule als Schnittstelle zu Docker verwendet. Sie benötigen dies, da Sie Docker als Treiber verwenden.

Als nächstes erstellen wir eine Rolle in Molecule.

[[Schritt-2 - Erstellen einer Rolle im Molekül]] == Schritt 2 - Erstellen einer Rolle im Molekül

Wenn Ihre Umgebung eingerichtet ist, können Sie mit Molecule eine grundlegende Rolle erstellen, mit der Sie eine Apache-Installation testen können. Diese Rolle erstellt die Verzeichnisstruktur und einige erste Tests und gibt Docker als Treiber an, sodass Molecule Docker zum Ausführen seiner Tests verwendet.

Erstellen Sie eine neue Rolle mit dem Namenansible-apache:

molecule init role -r ansible-apache -d docker

Das Flag-r gibt den Namen der Rolle an, während-d den Treiber angibt, der die Hosts bereitstellt, die Molecule zum Testen verwenden kann.

Wechseln Sie in das Verzeichnis der neu angelegten Rolle:

cd ansible-apache

Testen Sie die Standardrolle, um zu überprüfen, ob Molecule ordnungsgemäß eingerichtet wurde:

molecule test

Es wird eine Ausgabe angezeigt, in der alle Standardtestaktionen aufgelistet sind. Vor dem Start des Tests überprüft Molecule die Konfigurationsdateimolecule.yml, um sicherzustellen, dass alles in Ordnung ist. Es wird auch diese Testmatrix gedruckt, die die Reihenfolge der Testaktionen angibt:

Output--> Validating schema /home/sammy/ansible-apache/molecule/default/molecule.yml.
Validation completed successfully.
--> Test matrix

└── default
    ├── lint
    ├── destroy
    ├── dependency
    ├── syntax
    ├── create
    ├── prepare
    ├── converge
    ├── idempotence
    ├── side_effect
    ├── verify
    └── destroy
...

Wir werden jede Testaktion im Detail besprechen, sobald Sie Ihre Rolle erstellt und Ihre Tests angepasst haben. Achten Sie vorerst auf diePLAY_RECAP für jeden Test und stellen Sie sicher, dass keine der Standardaktionen den Statusfailed zurückgibt. Beispiel:PLAY_RECAP für die Standardaktion'create' sollten folgendermaßen aussehen:

Output...
PLAY RECAP *********************************************************************
localhost                  : ok=5    changed=4    unreachable=0    failed=0

Lassen Sie uns nun die Rolle ändern, um Apache und Firewall zu konfigurieren.

[[Schritt 3 - Konfigurieren von Apache und Firewall]] == Schritt 3 - Konfigurieren von Apache und Firewall

Um Apache und Firewall zu konfigurieren, erstellen Sie eine Aufgabendatei für die Rolle, in der die zu installierenden Pakete und die zu aktivierenden Dienste angegeben werden. Diese Details werden aus einer Variablendatei und einer Vorlage extrahiert, die Sie zum Ersetzen der Apache-Standardindexseite verwenden.

Erstellen Sie noch im Verzeichnisansible-apache eine Aufgabendatei für die Rolle mitnano oder Ihrem bevorzugten Texteditor:

nano tasks/main.yml

Sie werden sehen, dass die Datei bereits vorhanden ist. Löschen Sie die Inhalte und ersetzen Sie sie durch den folgenden Code, um die erforderlichen Pakete zu installieren und die richtigen Dienste, HTML-Standardeinstellungen und Firewall-Einstellungen zu aktivieren:

~/ansible-apache/tasks/main.yml

---
- name: "Ensure required packages are present"
  yum:
    name: "{{ pkg_list }}"
    state: present

- name: "Ensure latest index.html is present"
  template:
    src: index.html.j2
    dest: /var/www/html/index.html

- name: "Ensure httpd service is started and enabled"
  service:
    name: "{{ item }}"
    state: started
    enabled: true
  with_items: "{{ svc_list }}"

- name: "Whitelist http in firewalld"
  firewalld:
    service: http
    state: enabled
    permanent: true
    immediate: true

Dieses Spielbuch enthält 4 Aufgaben:

  • "Ensure required packages are present": Diese Aufgabe installiert die Pakete, die in der Variablendatei unterpkg_list aufgeführt sind. Die Variablendatei befindet sich bei~/ansible-apache/vars/main.yml und wird am Ende dieses Schritts erstellt.

  • "Ensure latest index.html is present": Diese Aufgabe kopiert eine Vorlagenseiteindex.html.j2 und fügt sie über der von Apache generierten Standardindexdatei/var/www/html/index.html ein. In diesem Schritt erstellen Sie auch die neue Vorlage.

  • "Ensure httpd service is started and enabled": Diese Aufgabe startet und aktiviert die insvc_list in der Variablendatei aufgeführten Dienste.

  • "Whitelist http in firewalld": Diese Aufgabe listet den Dienst vonhttpinfirewalld auf. Firewalld ist eine vollständige Firewall-Lösung, die standardmäßig auf CentOS-Servern vorhanden ist. Damit der Diensthttpfunktioniert, müssen Sie die erforderlichen Ports verfügbar machen. Wenn Siefirewalld anweisen, einen Dienst auf die Whitelist zu setzen, wird sichergestellt, dass alle für den Dienst erforderlichen Ports auf die Whitelist gesetzt werden.

Speichern und schließen Sie die Datei, wenn Sie fertig sind.

Als Nächstes erstellen wir eintemplates-Verzeichnis für dieindex.html.j2-Vorlagenseite:

mkdir templates

Erstellen Sie die Seite selbst:

nano templates/index.html.j2

Fügen Sie den folgenden Code ein:

~/ansible-apache/templates/index.html.j2

Managed by Ansible

Speichern und schließen Sie die Datei.

Der letzte Schritt zur Vervollständigung der Rolle ist das Schreiben der Variablendatei, in der die Namen der Pakete und Services für unser Hauptrollenspielbuch angegeben sind:

nano vars/main.yml

Fügen Sie den Standardinhalt mit dem folgenden Code ein, derpkg_list undsvc_list angibt:

~/ansible-apache/vars/main.yml

---
pkg_list:
  - httpd
  - firewalld
svc_list:
  - httpd
  - firewalld

Diese Listen enthalten folgende Informationen:

  • pkg_list: Enthält die Namen der Pakete, die von der Rolle installiert werden sollen:httpd undfirewalld.

  • svc_list: Enthält die Namen der Dienste, die die Rolle starten und aktivieren wird:httpd undfirewalld.

[.note] #Note: Stellen Sie sicher, dass Ihre Variablendatei keine Leerzeilen enthält. Andernfalls schlägt Ihr Test beim Flusen fehl.
#

Nachdem Sie Ihre Rolle erstellt haben, konfigurieren wir Molecule, um zu testen, ob es wie beabsichtigt funktioniert.

[[Schritt 4 - Ändern der Rolle für das Ausführen von Tests]] == Schritt 4 - Ändern der Rolle für das Ausführen von Tests

In unserem Fall umfasst das Konfigurieren von Molecule das Ändern der Molecule-Konfigurationsdateimolecule.yml, um Plattformspezifikationen hinzuzufügen. Da Sie eine Rolle testen, die den systemd-Dienst vonhttpdkonfiguriert und startet, müssen Sie ein Image mit systemd-konfiguriertem und aktiviertem privilegiertem Modus verwenden. Für dieses Tutorial verwenden Sie das Bildmilcom/centos7-systemdavailable on Docker Hub. Im privilegierten Modus können Container mit fast allen Funktionen ihres Hostcomputers ausgeführt werden.

Bearbeiten Siemolecule.yml, um diese Änderungen widerzuspiegeln:

nano molecule/default/molecule.yml

Fügen Sie die hervorgehobenen Plattforminformationen hinzu:

~/ansible-apache/molecule/default/molecule.yml

---
dependency:
  name: galaxy
driver:
  name: docker
lint:
  name: yamllint
platforms:
  - name: centos7
    image: milcom/centos7-systemd
    privileged: true
provisioner:
  name: ansible
  lint:
    name: ansible-lint
scenario:
  name: default
verifier:
  name: testinfra
  lint:
    name: flake8

Speichern und schließen Sie die Datei, wenn Sie fertig sind.

Nachdem Sie die Testumgebung erfolgreich konfiguriert haben, können Sie nun die Testfälle schreiben, die Molecule nach Ausführung der Rolle für Ihren Container ausführt.

[[Schritt-5 - Schreiben von Testfällen]] == Schritt 5 - Schreiben von Testfällen

Im Test für diese Rolle überprüfen Sie die folgenden Bedingungen:

  • Dass die Paketehttpd undfirewalld installiert sind.

  • Dass die Dienstehttpd undfirewalldausgeführt und aktiviert werden.

  • Dass der Diensthttpin Ihren Firewall-Einstellungen aktiviert ist.

  • Dieseindex.html enthalten dieselben Daten, die in Ihrer Vorlagendatei angegeben sind.

Wenn alle diese Tests erfolgreich sind, funktioniert die Rolle wie beabsichtigt.

Um die Testfälle für diese Bedingungen zu schreiben, bearbeiten wir die Standardtests in~/ansible-apache/molecule/default/tests/test_default.py. Mit Testinfra schreiben wir die Testfälle als Python-Funktionen, die Molekülklassen verwenden.

Öffnen Sietest_default.py:

nano molecule/default/tests/test_default.py

Löschen Sie den Inhalt der Datei, damit Sie die Tests von Grund auf neu schreiben können.

[.note] #Note: Stellen Sie beim Schreiben Ihrer Tests sicher, dass sie durch zwei neue Zeilen getrennt sind. Andernfalls schlagen sie fehl.
#

Importieren Sie zunächst die erforderlichen Python-Module:

~/ansible-apache/molecule/default/tests/test_default.py

import os
import pytest

import testinfra.utils.ansible_runner

Diese Module umfassen:

  • os: Dieses integrierte Python-Modul ermöglicht betriebssystemabhängige Funktionen, sodass Python eine Schnittstelle zum zugrunde liegenden Betriebssystem herstellen kann.

  • pytest: Das Modulpytest ermöglicht das Schreiben von Tests.

  • testinfra.utils.ansible_runner: Dieses Testinfra-Modul verwendetAnsible as the backend für die Befehlsausführung.

Fügen Sie unter den Modulimporten den folgenden Code hinzu, der das Ansible-Backend verwendet, um die aktuelle Hostinstanz zurückzugeben:

~/ansible-apache/molecule/default/tests/test_default.py

...
testinfra_hosts = testinfra.utils.ansible_runner.AnsibleRunner(
    os.environ['MOLECULE_INVENTORY_FILE']).get_hosts('all')

Wenn Ihre Testdatei für die Verwendung des Ansible-Backends konfiguriert ist, schreiben wir Unit-Tests, um den Status des Hosts zu testen.

Der erste Test stellt sicher, dasshttpd undfirewalld installiert sind:

~/ansible-apache/molecule/default/tests/test_default.py

...

@pytest.mark.parametrize('pkg', [
  'httpd',
  'firewalld'
])
def test_pkg(host, pkg):
    package = host.package(pkg)

    assert package.is_installed

Der Test beginnt mitpytest.mark.parametrize decorator, wodurch wir die Argumente für den Test parametrisieren können. Bei diesem ersten Test wirdtest_pkg als Parameter verwendet, um das Vorhandensein der Paketehttpd undfirewalld zu testen.

Der nächste Test prüft, obhttpd undfirewalld ausgeführt und aktiviert werden. Es wirdtest_svc als Parameter verwendet:

~/ansible-apache/molecule/default/tests/test_default.py

...

@pytest.mark.parametrize('svc', [
  'httpd',
  'firewalld'
])
def test_svc(host, svc):
    service = host.service(svc)

    assert service.is_running
    assert service.is_enabled

Der letzte Test überprüft, ob die anparametrize() übergebenen Dateien und Inhalte vorhanden sind. Wenn die Datei nicht von Ihrer Rolle erstellt wurde und der Inhalt nicht richtig festgelegt wurde, gibtassertFalse zurück:

~/ansible-apache/molecule/default/tests/test_default.py

...

@pytest.mark.parametrize('file, content', [
  ("/etc/firewalld/zones/public.xml", ""),
  ("/var/www/html/index.html", "Managed by Ansible")
])
def test_files(host, file, content):
    file = host.file(file)

    assert file.exists
    assert file.contains(content)

In jedem Test gebenassert je nach TestergebnisTrue oderFalse zurück.

Die fertige Datei sieht folgendermaßen aus:

~/ansible-apache/molecule/default/tests/test_default.py

import os
import pytest

import testinfra.utils.ansible_runner

testinfra_hosts = testinfra.utils.ansible_runner.AnsibleRunner(
    os.environ['MOLECULE_INVENTORY_FILE']).get_hosts('all')


@pytest.mark.parametrize('pkg', [
  'httpd',
  'firewalld'
])
def test_pkg(host, pkg):
    package = host.package(pkg)

    assert package.is_installed


@pytest.mark.parametrize('svc', [
  'httpd',
  'firewalld'
])
def test_svc(host, svc):
    service = host.service(svc)

    assert service.is_running
    assert service.is_enabled


@pytest.mark.parametrize('file, content', [
  ("/etc/firewalld/zones/public.xml", ""),
  ("/var/www/html/index.html", "Managed by Ansible")
])
def test_files(host, file, content):
    file = host.file(file)

    assert file.exists
    assert file.contains(content)

Nachdem Sie Ihre Testfälle festgelegt haben, testen wir die Rolle.

[[Schritt 6 - Testen der Rolle mit dem Molekül] == Schritt 6 - Testen der Rolle mit dem Molekül

Sobald Sie den Test starten, führt Molecule die in Ihrem Szenario definierten Aktionen aus. Lassen Sie uns nun das Standardszenariomoleculeerneut ausführen und die Aktionen in der Standardtestsequenz ausführen, während Sie sich die einzelnen Aktionen genauer ansehen.

Führen Sie den Test für das Standardszenario erneut aus:

molecule test

Dadurch wird der Testlauf gestartet. Die Erstausgabe druckt die Standardtestmatrix:

Output--> Validating schema /home/sammy/ansible-apache/molecule/default/molecule.yml.
Validation completed successfully.
--> Test matrix

└── default
    ├── lint
    ├── destroy
    ├── dependency
    ├── syntax
    ├── create
    ├── prepare
    ├── converge
    ├── idempotence
    ├── side_effect
    ├── verify
    └── destroy

Lassen Sie uns jede Testaktion und den erwarteten Output durchgehen und mit dem Flusen beginnen.

Die Aktionlinting führtyamllint,flake8 undansible-lint aus:

  • yamllint: Dieser Linter wird für alle im Rollenverzeichnis vorhandenen YAML-Dateien ausgeführt.

  • flake8: Dieser Python-Code-Linter überprüft Tests, die für Testinfra erstellt wurden.

  • ansible-lint: Dieser Linter für Ansible-Playbooks wird in allen Szenarien ausgeführt.

Output...
--> Scenario: 'default'
--> Action: 'lint'
--> Executing Yamllint on files found in /home/sammy/ansible-apache/...
Lint completed successfully.
--> Executing Flake8 on files found in /home/sammy/ansible-apache/molecule/default/tests/...
Lint completed successfully.
--> Executing Ansible Lint on /home/sammy/ansible-apache/molecule/default/playbook.yml...
Lint completed successfully.

Die nächste Aktion,destroy, wird mit der Dateidestroy.yml ausgeführt. Dies wird durchgeführt, um unsere Rolle an einem neu erstellten Container zu testen.

Standardmäßig wird destroy zweimal aufgerufen: Zu Beginn des Testlaufs, um vorhandene Container zu löschen, und am Ende, um den neu erstellten Container zu löschen:

Output...
--> Scenario: 'default'
--> Action: 'destroy'

    PLAY [Destroy] *****************************************************************

    TASK [Destroy molecule instance(s)] ********************************************
    changed: [localhost] => (item=None)
    changed: [localhost]

    TASK [Wait for instance(s) deletion to complete] *******************************
    ok: [localhost] => (item=None)
    ok: [localhost]

    TASK [Delete docker network(s)] ************************************************
    skipping: [localhost]

    PLAY RECAP *********************************************************************
    localhost                  : ok=2    changed=1    unreachable=0    failed=0

Nach Abschluss der Zerstörungsaktion wird der Test aufdependency fortgesetzt. Mit dieser Aktion können Sie Abhängigkeiten vonansible-galaxy abrufen, wenn Ihre Rolle dies erfordert. In diesem Fall hat unsere Rolle nicht:

Output...
--> Scenario: 'default'
--> Action: 'dependency'
Skipping, missing the requirements file.

Die nächste Testaktion ist eine Prüfung vonsyntax, die im Standard-Playbook vonplaybook.ymlausgeführt wird. Es funktioniert ähnlich wie das Flag--syntax-check im Befehlansible-playbook --syntax-check playbook.yml:

Output...
--> Scenario: 'default'
--> Action: 'syntax'

    playbook: /home/sammy/ansible-apache/molecule/default/playbook.yml

Als nächstes fährt der Test mit der Aktioncreatefort. Dabei wird die Dateicreate.ymlim Molecule-Verzeichnis Ihrer Rolle verwendet, um einen Docker-Container mit Ihren Spezifikationen zu erstellen:

Output...

--> Scenario: 'default'
--> Action: 'create'

    PLAY [Create] ******************************************************************

    TASK [Log into a Docker registry] **********************************************
    skipping: [localhost] => (item=None)
    skipping: [localhost]

    TASK [Create Dockerfiles from image names] *************************************
    changed: [localhost] => (item=None)
    changed: [localhost]

    TASK [Discover local Docker images] ********************************************
    ok: [localhost] => (item=None)
    ok: [localhost]

    TASK [Build an Ansible compatible image] ***************************************
    changed: [localhost] => (item=None)
    changed: [localhost]

    TASK [Create docker network(s)] ************************************************
    skipping: [localhost]

    TASK [Create molecule instance(s)] *********************************************
    changed: [localhost] => (item=None)
    changed: [localhost]

    TASK [Wait for instance(s) creation to complete] *******************************
    changed: [localhost] => (item=None)
    changed: [localhost]

    PLAY RECAP *********************************************************************
    localhost                  : ok=5    changed=4    unreachable=0    failed=0

Nach dem Erstellen fährt der Test mit der Aktionpreparefort. Diese Aktion führt das Prepare-Playbook aus, das den Host in einen bestimmten Zustand versetzt, bevor Converge ausgeführt wird. Dies ist nützlich, wenn Ihre Rolle eine Vorkonfiguration des Systems erfordert, bevor die Rolle ausgeführt wird. Auch dies gilt nicht für unsere Rolle:

Output...
--> Scenario: 'default'
--> Action: 'prepare'
Skipping, prepare playbook not configured.

Nach der Vorbereitung führt die AktionconvergeIhre Rolle im Container aus, indem das Playbook vonplaybook.ymlausgeführt wird. Wenn in dermolecule.yml-Datei mehrere Plattformen konfiguriert sind, konvergiert Molecule auf allen folgenden Ebenen:

Output...
--> Scenario: 'default'
--> Action: 'converge'

    PLAY [Converge] ****************************************************************

    TASK [Gathering Facts] *********************************************************
    ok: [centos7]

    TASK [ansible-apache : Ensure required packages are present] *******************
    changed: [centos7]

    TASK [ansible-apache : Ensure latest index.html is present] ********************
    changed: [centos7]

    TASK [ansible-apache : Ensure httpd service is started and enabled] ************
    changed: [centos7] => (item=httpd)
    changed: [centos7] => (item=firewalld)

    TASK [ansible-apache : Whitelist http in firewalld] ****************************
    changed: [centos7]

    PLAY RECAP *********************************************************************
    centos7                    : ok=5    changed=4    unreachable=0    failed=0

Nach dem Überdecken geht der Test weiter zuidempotence. Mit dieser Aktion wird das Playbook auf Inaktivität getestet, um sicherzustellen, dass in mehreren Durchläufen keine unerwarteten Änderungen vorgenommen werden:

Output...
--> Scenario: 'default'
--> Action: 'idempotence'
Idempotence completed successfully.

Die nächste Testaktion ist die Aktion vonside-effect. Auf diese Weise können Sie Situationen erstellen, in denen Sie mehr Dinge testen können, z. B. HA-Failover. Standardmäßig konfiguriert Molecule kein Nebeneffekt-Playbook und die Aufgabe wird übersprungen:

Output...
--> Scenario: 'default'
--> Action: 'side_effect'
Skipping, side effect playbook not configured.

Molecule führt dann die Aktionverifiermit dem Standardprüfer Testinfra aus. Diese Aktion führt die Tests aus, die Sie zuvor intest_default.py geschrieben haben. Wenn alle Tests erfolgreich abgeschlossen wurden, wird eine Erfolgsmeldung angezeigt und Molecule fährt mit dem nächsten Schritt fort:

Output...
--> Scenario: 'default'
--> Action: 'verify'
--> Executing Testinfra tests found in /home/sammy/ansible-apache/molecule/default/tests/...
    ============================= test session starts ==============================
    platform linux -- Python 3.6.5, pytest-3.7.3, py-1.5.4, pluggy-0.7.1
    rootdir: /home/sammy/ansible-apache/molecule/default, inifile:
    plugins: testinfra-1.14.1
collected 6 items

    tests/test_default.py ......                                             [100%]

    ========================== 6 passed in 41.05 seconds ===========================
Verifier completed successfully.

Schließlich gibt Moleculedestroysdie während des Tests abgeschlossenen Instanzen an und löscht das diesen Instanzen zugewiesene Netzwerk:

Output...
--> Scenario: 'default'
--> Action: 'destroy'

    PLAY [Destroy] *****************************************************************

    TASK [Destroy molecule instance(s)] ********************************************
    changed: [localhost] => (item=None)
    changed: [localhost]

    TASK [Wait for instance(s) deletion to complete] *******************************
    changed: [localhost] => (item=None)
    changed: [localhost]

    TASK [Delete docker network(s)] ************************************************
    skipping: [localhost]

    PLAY RECAP *********************************************************************
    localhost                  : ok=2    changed=2    unreachable=0    failed=0

Die Testaktionen sind nun abgeschlossen und bestätigen, dass Ihre Rolle wie beabsichtigt funktioniert hat.

Fazit

In diesem Artikel haben Sie eine Ansible-Rolle zum Installieren und Konfigurieren von Apache und Firewall erstellt. Anschließend haben Sie mit Testinfra Komponententests geschrieben, mit denen Molecule bestätigt hat, dass die Rolle erfolgreich ausgeführt wurde.

Sie können dieselbe grundlegende Methode für hochkomplexe Rollen verwenden und das Testen auch mithilfe einer CI-Pipeline automatisieren. Molecule ist ein in hohem Maße konfigurierbares Tool, mit dem Rollen bei allen Anbietern getestet werden können, die Ansible unterstützt, nicht nur bei Docker. Sie können auch Tests für Ihre eigene Infrastruktur automatisieren, um sicherzustellen, dass Ihre Rollen immer auf dem neuesten Stand und funktionsfähig sind. Mit dem TutorialHow To Implement Continuous Testing of Ansible Roles Using Molecule and Travis CI on Ubuntu 18.04können Sie mithilfe von Molecule und Travis CI kontinuierliche Tests in Ihren Workflow integrieren.

Das offizielleMolecule documentation ist die beste Ressource, um den Umgang mit Molekülen zu erlernen.