Testumgebung mit Vagrant

11.Februar 2025

Wer, wie ich, ständig verschiedene Software testet, ist auf eine zuverlässige Testumgebung angewiesen. In diesem Artikel möchte ich euch zeigen, wie ich meine Testumgebung mit Vagrant aufbaue.

Als ich anfing, vor allem eigene Software zu entwickeln, habe ich meine Testumgebung zunächst mit VMware Workstation erstellt. Ich legte eine virtuelle Maschine an, erstellte einen Snapshot und nahm anschließend meine Änderungen vor. Das funktionierte gut – hatte jedoch seine Grenzen. Besonders dann, wenn ich mehrere Maschinen benötigte, etwa für eine getrennte Umgebung aus Datenbank und Anwendung oder zum Testen eines Clusters.

Irgendwann stieß ich auf Vagrant – und heute ist es für mich unverzichtbar. Doch was genau ist Vagrant?

Was ist Vagrant?

Vagrant ist ein Open-Source-Tool zur Verwaltung von virtuellen Entwicklungsumgebungen. Es ermöglicht Entwicklern, schnell reproduzierbare und konsistente Umgebungen bereitzustellen, ohne dass sie manuell virtuelle Maschinen einrichten müssen.

Das Besondere an Vagrant ist, dass die gesamte Umgebung in einer einfachen Textdatei, dem Vagrantfile, beschrieben wird. Hier legt man fest, wie die Umgebung aussehen soll, wie die VMs konfiguriert werden sollen und wie sie provisioniert werden. Die Provisionierung bezeichnet den Prozess, bei dem die VMs nach dem Start automatisch mit Software und Konfigurationen ausgestattet werden. Dafür stehen verschiedene Methoden zur Verfügung, wie einfache Shell-Skripte oder spezialisierte Tools wie Ansible, Puppet oder Chef. Dadurch kann jeder die gleiche Umgebung nutzen und jederzeit identisch neu aufsetzen. Diese Konfigurationen lassen sich nicht nur für Entwicklungs- und Testumgebungen verwenden, sondern auch in Live-Umgebungen einsetzen, um zuverlässige und automatisierte Deployments sicherzustellen.

Vagrant nutzt im Hintergrund Virtualisierungssoftware wie VirtualBox, VMware, Hyper-V, KVM als Provider. Vagrant setzt dabei auf sogenannte Boxen.

Was sind Vagrant-Boxen?

Eine Vagrant-Box ist ein vorkonfiguriertes Abbild eines Betriebssystems, das als Grundlage für eine virtuelle Maschine dient. Anstatt jedes Mal ein Betriebssystem von Grund auf zu installieren, lädt Vagrant eine Box herunter und startet daraus eine VM. Boxen können aus dem Internet heruntergeladen oder selbst erstellt und weitergegeben werden. Dies erleichtert die Bereitstellung einheitlicher Umgebungen enorm.
Bild

Die Vorteile von Vagrant auf einen Blick:

  • Automatisierte VM-Erstellung: Kein manuelles Setup mehr notwendig.

  • Vagrant-Boxen: Vorkonfigurierte Images sorgen für schnelles Deployment.

  • Reproduzierbare Umgebungen: Ideal für Teams, da jeder dieselbe Umgebung nutzen kann.

  • Multi-VM-Setups: Einfaches Erstellen und Verwalten von mehreren vernetzten VMs.

  • Plattformunabhängig: Funktioniert unter Windows, macOS und Linux.

Im nächsten Abschnitt zeige ich, wie man mit Vagrant praktisch eine Testumgebung aufbaut. Dazu werde ich ein Vagrantfile mit einer Debian-Box aus dem Internet erstellen und erklären. Ich verwende Vagrant auf einem Linux-System wie Mint Linux. Als Provider setze ich hier VirtualBox ein. Vagrant kann aus dem Repository bezogen werden oder man bezieht die Pakete direkt von der Homepage. Wie man Vagrant installiert, beschreibe ich später in einem eigenen Artikel.

Ein erstes Vagrantfile

Hier ist ein Vagrantfile, das eine Debian-Box verwendet:

 1Vagrant.configure("2") do |config|
 2  config.vm.define "debian-vm" do |debian|
 3    debian.vm.box = "debian/bookworm64"
 4    debian.vm.hostname = "debian-vm"
 5    debian.vm.network "private_network", ip: "192.168.33.10"
 6    debian.vm.network "forwarded_port", guest: 80, host: 8080
 7    
 8    debian.vm.provision "shell", inline: <<-SHELL
 9      echo "Hello, Vagrant!" > /home/vagrant/welcome.txt
10    SHELL
11  end
12end

Erklärung der Konfiguration:

  • Vagrant.configure("2") do |config| ... end: Dies ist der Einstiegspunkt für die Konfiguration. Die 2 steht für die aktuelle Vagrant-Konfigurationsversion. Innerhalb dieses Blocks wird die gesamte Vagrant-Umgebung definiert.

  • config.vm.define "debian-vm" do |debian| ... end: Damit definieren wir eine einzelne VM mit dem Namen debian-vm. Diese Struktur erlaubt es uns, später weitere VMs hinzuzufügen, um beispielsweise Cluster-Setups zu testen oder mehrere Server-Instanzen zu betreiben.

  • Box: Lädt eine vorkonfigurierte Debian-Box herunter und stellt sicher, dass eine definierte Ausgangsumgebung für alle Nutzer verfügbar ist.

  • Hostname: Setzt den Hostnamen der VM, was für eine eindeutige Identifikation innerhalb eines Netzwerks nützlich ist.

  • Private Network: Vergibt eine feste IP-Adresse (192.168.33.10), sodass die VM innerhalb eines privaten Netzwerks erreichbar ist.

  • Port-Weiterleitung: Leitet den Port 80 der VM auf Port 8080 des Hosts weiter, um z. B. einen Webserver auf der VM zugänglich zu machen.

  • Provisionierung: Führt ein einfaches Shell-Skript aus, das eine Datei erstellt. Diese Methode kann genutzt werden, um Software zu installieren oder Konfigurationsänderungen vorzunehmen.

Wichtige Vagrant-Befehle

Nachdem das Vagrantfile erstellt wurde, kann die Testumgebung gestartet werden:

  • vagrant up – Startet die VM(s) entsprechend der Konfiguration im Vagrantfile. Dabei wird überprüft, ob die Box vorhanden ist, und falls nicht, wird sie heruntergeladen. Anschließend wird die Netzwerkkonfiguration angewendet und die Provisionierung durchgeführt.

    • Netzwerkschnittstellen: Standardmäßig richtet Vagrant zwei Netzwerkschnittstellen ein – eine für die interne Kommunikation mit VirtualBox und eine für das private Netzwerk, falls konfiguriert.
    • SSH-Schlüssel: Vagrant generiert automatisch einen SSH-Schlüssel und legt ihn ab, sodass man sich per vagrant ssh einfach einloggen kann.
    • Gemeinsames Verzeichnis: Der Ordner /vagrant in der VM wird automatisch mit dem Verzeichnis synchronisiert, in dem sich das Vagrantfile befindet. So können Dateien zwischen Host und VM einfach ausgetauscht werden.
  • vagrant ssh debian-vm – Ermöglicht den Zugriff auf die VM per SSH über den von Vagrant verwalteten Zugang. Alternativ kann man sich auch direkt über ssh vagrant@192.168.33.10 anmelden, wobei vagrant als Benutzername und der von Vagrant bereitgestellte SSH-Key genutzt wird.

  • vagrant halt – Stoppt die laufende VM sauber.

  • vagrant destroy – Löscht die VM vollständig.

Weitere nützliche Befehle:

  • vagrant reload – Startet die VM neu und lädt das Vagrantfile erneut ein.
  • vagrant provision – Führt die im Vagrantfile definierte Provisionierung erneut aus.
  • vagrant status – Zeigt den aktuellen Status der VMs an.

Fazit

Vagrant ist ein leistungsfähiges Werkzeug zur Verwaltung von Test- und Entwicklungsumgebungen. Durch die Nutzung von vorkonfigurierten Boxen, Netzwerkoptionen und Provisionierungstools lässt sich eine Umgebung schnell und konsistent aufbauen. Besonders in Teams oder bei der Entwicklung von verteilten Anwendungen bietet Vagrant enorme Vorteile.

In weiteren Artikeln werde ich auf Möglichkeiten eingehen, wie man das Setup erweitern kann, wie man Ansible einbindet und auch darauf, wie man sich eine eigene Vagrant-Box erstellt.