Testen der Docker©-Infrastruktur mit Serverspec
Es ist bereits weit verbreitet, Infrastrukturen in Code zu beschreiben, z.B. mit Puppet oder Chef. Heutzutage gibt es eine weitere Möglichkeit dafür: Docker©. Besonders bei Docker© ist es wichtig, die Konfiguration der Infrastruktur im Auge zu behalten, da sich die Quellen für Ihre Container geändert haben oder verschwunden sein können. Daher sollten Sie Ihre Infrastruktur testen, um sicherzustellen, dass sie den Erwartungen entspricht. Serverspec bietet Ihnen die Möglichkeit, genau das zu tun.
Warum Docker©? – Ein Überblick
Docker© ist ein Open-Source-Projekt, das die Bereitstellung von Anwendungen in Software-Containern durch Virtualisierung automatisiert. Damit können Sie mehrere verschiedene Container auf demselben Knoten ausführen. Dies ist effizienter als die Wartung verschiedener virtueller Maschinen, da die Container das Betriebssystem des Knotens (Linux) gemeinsam nutzen.
Jeder Container ist unabhängig von seiner Umgebung, da er alles enthält, was er zum Laufen braucht: Code, Laufzeit, Systemtools und Systembibliotheken. Dadurch wird sichergestellt, dass Docker©-Container immer auf ähnliche Weise ausgeführt werden, unabhängig von der Umgebung, in der sie laufen.
Da Container alles enthalten, was sie brauchen, enthalten sie auch eine Menge externer Referenzen und Bibliotheken. Dies kann zu dem Problem führen, dass sich die externen Quellen ändern oder verschwinden. Daher ist es wichtig, sicherzustellen, dass die Container den Erwartungen entsprechen, um unerwartetes Verhalten zu vermeiden. Eine mögliche Lösung dafür ist, die Docker©-Infrastruktur mit Serverspec-Tests zu überprüfen.
Serverspec
Ursprünglich wurde Serverspec entwickelt, um die Konfiguration von Servern auf ihre Korrektheit zu überprüfen. Wenn Sie heute Docker© zum Aufbau Ihrer Infrastruktur verwenden, können Sie damit auch die Spezifikationen Ihrer Docker©-Images und Container überprüfen. Mit Serverspec können Sie RSpec-Tests schreiben, um Ihre Infrastruktur zu überprüfen und sicherzustellen, dass sie wie erwartet konfiguriert ist http://serverspec.org. Es ist wie das Schreiben von Unit-Tests für Ihre Infrastruktur.
Die Syntax für RSpec-Tests ist recht einfach:
describe RESOURCE_TYPE ('RESOURCE NAME') do its(ATTRIBUTE) {should OPERATOR OPERAND} end
Anstelle von “should” können Sie auch “expect” oder das negative “should_not” verwenden, das hängt von Ihrer Präferenz ab. Für “Ressourcentyp”, “Attribut” und “Operand” haben Sie verschiedene Möglichkeiten:
Ressourcentyp | Attribut | Operand | ||
|
|
|
Liste aller möglichen Tests: http://serverspec.org/resource_types.html
Hinweis: Die angegebenen Tests werden nacheinander ausgeführt. Serverspec wartet, bis ein Test ausgeführt wurde, bevor es mit dem nächsten Test beginnt. Manchmal ist es notwendig, einen Timer oder eine Wartezeit einzubauen, wenn Sie einen Prozess testen wollen, der einige Zeit in Anspruch nimmt (z.B. wenn Sie warten müssen, bis ein Container gestartet ist).
Beispiel
Am Anfang jeder Spezifikationsdatei befindet sich der Abschnitt ‘require’. Dort können Sie angeben, welche Komponenten für die Ausführung der in der Datei angegebenen Tests erforderlich sind.
Danach kommt der große Teil, in dem Sie die Tests beschreiben.
Imagespec
Docker©-Image aus Dockerfile erstellen
require "serverspec" require "Docker" describe "image specs" do image = Docker::Image.build_from_dir('.') set :os, family: :alpine set :backend, :Docker set :Docker_image, image.id
Führen Sie Ihren Test durch
1. Prüfen Sie, ob das Paket installiert ist
describe package('mercurial') do it { should be_installed } end
2. Status der Datei prüfen
describe file('/opt/scm-server') do it { should be_directory } it { should be_owned_by 'scm' } it { should be_grouped_into 'scm' } end
Containerspec
Container starten
require "serverspec" require "Docker" equire_relative 'spec_helper' describe "container specs" do before(:all) do image = Docker::Image.build_from_dir('.') @container = image.run() set :os, family: :alpine set :backend, :Docker set :Docker_container, @container.id wait_for_open_port 8080, 30 end
Führen Sie Ihre Tests durch …
describe port(8080) do it { should be_listening } end
…
Aufräumen
after(:all) do @container.kill @container.delete(:force => true) end
Vorteile von Serverspec mit RSpec Tests
Das Überprüfen Ihrer Infrastruktur mit RSpec-Tests hat mehrere Vorteile. Sie können zum Beispiel Tests schreiben, die nach jedem Neustart eines Systems ausgeführt werden, oder Sie können Tests schreiben, die Ihr System häufig überprüfen - als Frühwarnsystem. Die Tests können leicht an neue Bedingungen angepasst werden.
Sie können auch damit beginnen, TDD (Test Driven Development) für Ihre Infrastruktur anzuwenden, indem Sie zuerst die Tests schreiben (die fehlschlagen werden) und dann mit der Entwicklung beginnen, um die Tests erfolgreich zu bestehen.
Ein Schritt in Richtung TDD
Die Entwicklung von Anwendungen, die Docker© verwenden, hat den Vorteil, dass die Infrastruktur einen minimalen Overhead hat und dass die Komponenten zwischen verschiedenen Arten von Maschinen portabel sind. Darüber hinaus ist es möglich, Docker©-Container z.B. mit Serverspec zu testen, um sicherzustellen, dass ihre Konfiguration wie definiert ist und dass sie wie erwartet laufen.
Wenn Sie bereits Docker© verwenden, sollten Sie auch darüber nachdenken, RSpec-Tests zu schreiben und vielleicht sogar TDD für Ihre Infrastruktur anzuwenden. Dies wird Ihnen helfen, Ihre Anwendungen einfacher zu entwickeln und zu warten. Wenn Sie Docker© noch gar nicht verwenden, überzeugt Sie vielleicht die Möglichkeit, RSpec-Tests anzuwenden, davon, es zu verwenden.