Die Infrastruktur als Code fordert uns auf, Tools zu verwenden, die Ihre Builds automatisieren. Groß. Tools wie Ansible , Koch , Marionette , Salzstapel und andere bringen uns dazu, zu schreiben, wie die Infrastruktur aussieht, und gleichzeitig die Unterschiede zu beseitigen .
In Salt Stack werden diese Bits als Zustände bezeichnet . Wenn der Zustand nicht mit der Realität übereinstimmt, wird das Tool ihn für uns lösen. Mit anderen Worten: Wir schreiben einen Test für unsere Infrastruktur. Wenn der Test fehlschlägt, wird er vom Tool selbst behoben. Zumindest ist das die Idee.
XP lehrt uns, TDD zu verwenden, und die Frage ist, ob es auf die Infrastruktur anwendbar ist. Das Werkzeug legt nahe, dass dies der Fall ist.
Ich kann mir einige Arten von Tests vorstellen, die sehr nützlich sein können.
Wir schreiben Rauchtests, die mit dem bereitgestellten Dienst gebündelt sind, um sicherzustellen, dass der bereitgestellte Dienst durchgängig funktioniert und wie erwartet ausgeführt wird. Dies wäre ein API-Aufruf oder / und eine systemctl-Überprüfung, um sicherzustellen, dass das, was wir gerade bereitgestellt haben, funktioniert. Ein Großteil dieser Funktionen kann in denselben Zuständen behandelt werden, da Tools wie ansible Zustände haben, um sicherzustellen, dass ein Dienst ausgeführt wird.
Es gibt das Projekt Molecule , mit dem einzelne Rollen (wie ansible seine Zustände nennt) gegen Docker oder eine andere temporäre Virtualisierungs-Engine ausgeführt werden können. Dies zwingt dazu, Rollen zu entkoppeln und ermöglicht es, sie während der Arbeit isoliert vom Spielbuch auszuführen. Tests ermöglichen meistens das Verspotten der Variablen, mit denen die Rolle arbeiten soll. Andere Beispiele scheinen jedoch eine Verdoppelung der Ansible-Engine zu sein (behaupten, eine Datei gehört einem Benutzer ...).
Das Tech-Radar von ThoughtWorks lobt derzeit Tools wie inspec , serverspec oder goss für die Überprüfung, ob der Server die Spezifikation erfüllt. Aber wir schreiben eine Spezifikation, nicht wahr?
Gibt es also einen Grund, die Infrastruktur weiter zu testen, wenn wir die Infrastruktur in Zuständen / Rollen beschreiben? Ich könnte vermuten, dass dies in größeren Organisationen, in denen ein Team die Spezifikation bereitstellt und das andere folgt, notwendiger wird, oder wenn es eine große Anzahl von Rollen gibt, möchten Sie vielleicht eine Teilmenge davon ausführen und einen Geschwindigkeitsvorteil aus Tests ziehen? Ich habe Mühe zu verstehen, warum Sie einen Test schreiben würden, wenn Sie eine Rolle / einen Status für dieselbe Frage im Auge haben könnten.
goss
. So wird beispielsweise RPM installiert (ansible) und dann getestet, ob die erwartete Standarddatei eingerichtet ist oder der Dienst ausgeführt wird und auf einen bestimmten Port wartet. Ich möchte ein solches Problem nicht automatisch beheben, sondern benachrichtigt werden und den Fortschritt stoppen. Sicher, Ansible kann das System auch für Sie testen. Sie müssen nur explizit daraufgoss
IMHO ist es ziemlich redundant, TDD-Tests für Elemente zu schreiben, die vollständig von der IaaC-Statusspezifikation abgedeckt sind. Dies impliziert, dass die Wirksamkeit des IaaC fraglich ist - warum sollten Sie es verwenden, wenn ja?
Wenn Sie es von einem anderen potenziellen IaaC aus betrachten (wenn / wenn es richtig gemacht wird), sind bereits getestete Funktionen enthalten, die als zuverlässig funktionieren. Was es attraktiv macht und was das Schreiben von TDD-Matching-Tests überflüssig macht.
Beispielsweise beinhaltet eine IaaC-Konfiguration, die ein System mit installiertem SSH angibt, bereits eine zuverlässige Überprüfung der korrekten Installation von SSH und, falls nicht, Mechanismen für die ordnungsgemäße Installation. Dies macht einen TDD-Test zur Überprüfung, ob SSH redundant installiert ist. Wenn Ihre IaaC-Konfiguration auch angibt, dass sshd gestartet und an einem bestimmten Port abgehört werden soll, sind TDD-Tests für sshd, die ausgeführt werden und den jeweiligen Port abhören, ebenfalls redundant.
Beachten Sie, dass meine Antwort nicht auf TDD oder andere Testarten abzielt, die prüfen, ob Ihre IaaC-Konfiguration insgesamt einem bestimmten Zweck entspricht. Dies bleibt gültig und kann bei TDD-, CI- oder ähnlichen Überprüfungen während der Entwicklung dieser IaaC-Spezifikation verwendet werden. Ich glaube, dass die Antwort von @ AnoE in diesem Fall anwendbar ist.
quelle
Es sieht so aus, als ob jeder hier davon ausgeht, dass ein IAC-Tool immer wie erwartet ausgeführt wird, aber ich kann (aus eigener Erfahrung) feststellen, dass dies nicht immer der Fall ist, da sonst ein Komponententest tatsächlich nutzlos wäre.
Ich erinnere mich an ein Bild mit der Aufschrift "Ansible Playbook lief, alles ist in Ordnung" mit einem brennenden Gebäude im Hintergrund ...
Das Ausführen eines deklarativen Status und das Befinden des Servers in diesem tatsächlich deklarierten Status unterscheiden sich zumindest aus meiner Sicht und Erfahrung.
Eine breite und heterogene Umgebung, die über mehrere DC verteilt ist und über ein öffentliches Netzwerk usw. erreichbar ist. Es gibt mehrere Gründe, aus denen ein Status weder ganz noch teilweise angewendet werden kann.
Aus all diesen Gründen gibt es Raum für Unit-Tests, die es ermöglichen, einen Snapshot des tatsächlichen Serverstatus zu erhalten, der wiederum vom Zielstatus abweichen kann.
Ich würde also sagen, dass Unit-Tests auch in einer von IAC verwalteten Umgebung nützlich sind.
BEARBEITEN
Was ist mit der Nicht-Regressionsseite des Entwicklungszweigs der IaC-Codebasis? Sie würden also Änderungen an Ihrem Code im Dev-Zweig vornehmen und ihn mit dem Prod-Zweig zusammenführen, in der Hoffnung, nicht alles zu beschädigen? Unit-Tests sind so wertvoll und normalerweise einfach zu implementieren. Ich verstehe nicht, warum man ohne diese Funktion codieren würde.
Referenz (auf Französisch Entschuldigung): https://fr.slideshare.net/logilab/testinfra-pyconfr-2017
quelle
Nach meiner Erfahrung sind "Hauptlaufzeitabhängigkeiten" einer der Hauptunterschiede zwischen Dev und Ops. Die Installation von Paketen hängt stark von Repositorys, Netzwerken oder gültigen Schlüsseln ab oder beispielsweise von der Instanziierung eines neuen Cloud-Servers - dies hängt von den Ressourcen Ihres Anbieters ab.
In Bezug auf die Serverbereitstellung ist Ihr Image die meiste Zeit gültig, manchmal jedoch nicht, selbst wenn Sie Ihren Bereitstellungscode nicht geändert haben. Daher denke ich, dass das Testen für die Bereitstellung von Arbeitsbildern wirklich wichtig ist.
Wenn Sie über einzelne Server hinausgehen, wird es noch schlimmer ... wie werden Sie die Erreichbarkeit in ganzen Netzwerkeinstellungen testen? Einschließlich DNS-Auflösung, Routing und Firewall? Selbst wenn die API Ihres IaaC-Anbieters wie erwartet funktioniert (ich habe in diesem Bereich Probleme mit dem Kabel festgestellt), gefällt mir TDD in diesem Fall sehr gut.
Da ich in diesem Bereich keine Testtools gefunden habe, haben wir in unserer Freizeit eines geschrieben: https://github.com/DomainDrivenArchitecture/dda-serverspec-crate
Ich denke, TDD ist wirklich wichtig in der DevOps-Welt!
quelle