Cloudogu Logo

Hallo, wir sind Cloudogu!

Experten für Software-Lifecycle-Management und Prozess­auto­mati­sierung, Förderer von Open-Source-Soft­ware und Entwickler des Cloudogu EcoSystem.

featured image Testen der Docker©-Infrastruktur mit Serverspec
05.12.2023 in Quality

Testen der Docker©-Infrastruktur mit Serverspec


Daniel Huchthausen
Daniel Huchthausen

IT Consultant


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
  • file
  • Docker_container
  • Docker_image
  • cron
  • mysql_config
  • host
  • ...
  • it
  • its(:md5sum)
  • its(:size)
  • its(:content_as_json)
  • its(:ipaddress)
  • its(:speed)
  • ...
  • exist
  • have_entry
  • match
  • be_readable.by
  • contain
  • include
  • ...

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.