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:
-
Ein Ubuntu 18.04 Server. Befolgen Sie die Schritte im HandbuchInitial Server Setup with Ubuntu 18.04, um einen Nicht-Root-Sudo-Benutzer zu erstellen, und stellen Sie sicher, dass Sie ohne Kennwort eine Verbindung zum Server herstellen können.
-
Docker auf Ihrem Server installiert. Befolgen Sie die Schritte 1 und 2 inHow To Install and Use Docker on Ubuntu 18.04, einschließlich des Hinzufügens Ihres Nicht-Root-Benutzers zur Gruppe
docker
. -
Python 3 und
venv
ind auf Ihrem Server installiert und konfiguriert. Befolgen SieHow To Install Python 3 and Set Up a Programming Environment on an Ubuntu 18.04 Server als Anleitung. -
Vertrautheit mit Ansible-Spielbüchern. Zur Überprüfung sieheConfiguration Management 101: Writing Ansible Playbooks.
[[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_wheel
setuptools
enthä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 vonhttp
infirewalld
auf. Firewalld ist eine vollständige Firewall-Lösung, die standardmäßig auf CentOS-Servern vorhanden ist. Damit der Diensthttp
funktioniert, 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 vonhttpd
konfiguriert und startet, müssen Sie ein Image mit systemd-konfiguriertem und aktiviertem privilegiertem Modus verwenden. Für dieses Tutorial verwenden Sie das Bildmilcom/centos7-systemd
available 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 Pakete
httpd
undfirewalld
installiert sind. -
Dass die Dienste
httpd
undfirewalld
ausgeführt und aktiviert werden. -
Dass der Dienst
http
in Ihren Firewall-Einstellungen aktiviert ist. -
Diese
index.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, gibtassert
False
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 Standardszenariomolecule
erneut 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.yml
ausgefü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.yml
im 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.yml
ausgefü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.