Blog

Los, Vagrant auf! Speichern von Vagrant-Images, die keine NAT-Adresse erhalten

Andrew Phillips

Aktualisiert Oktober 22, 2025
4 Minuten

Im Rahmen des Testens und der Demonstration unserer fortschrittlichen Deployit-Plattform für die Bereitstellungsautomatisierung1 verwenden wir bei XebiaLabs viele Cloud- und Devops-Tools, um all die verschiedenen Arten von Middleware, die wir unterstützen, sowie die Build-, CI- und Ops-Tools, mit denen wir integriert sind, handhaben zu können2. Vor kurzem habe ich eine Vagrant3-Umgebung eingerichtet, um das Puppet-Modul von Deployit zu demonstrieren, mit dem neue Middleware, die von Puppet bereitgestellt wird, automatisch bei Ihrer Plattform für die Bereitstellungsautomatisierung registriert wird, um die Bereitstellung von Anwendungsschichten auf dieser Plattform zu ermöglichen.

Das Problem besteht nun schon seit mehr als zwei Jahren und bezieht sich darauf, dass der DHCP-Server von VirtualBox manchmal unter noch nicht geklärten Umständen der NAT-Schnittstelle keine IP-Adresse zuweist. Da alle von Vagrant verwalteten Images standardmäßig eine NAT-Schnittstelle erhalten4, ist dies mehr als nur ein wenig lästig: Vagrant bleibt während der VM-Konfigurationsphase einfach hängen.

Da das Problem nicht deterministisch auftritt, besteht eine Möglichkeit, dieses Problem zu umgehen, darin, einen Neustart des Images zu vermeiden: Spielen Sie die "NAT-Lotterie", bis Sie Glück haben, indem Sie den VBoxManage-Prozess beenden, wenn das Image hängt, und vagrant erneut versuchen. Dann führen Sie vagrant suspend statt vagrant halt aus und Sie können die Images wieder aufnehmen, wenn Sie sie brauchen. Das wird funktionieren, aber ich war mit diesem Ansatz nicht besonders glücklich, denn abgesehen davon, dass mir der Gedanke nicht gefällt, Hypervisor-Prozesse immer wieder zu beenden (ich bin in dieser Hinsicht eher ein Pazifist ;-)), wird Vagrant dadurch effektiv "verkrüppelt": Die Leichtigkeit, mit der Sie Images starten, stoppen und neu konfigurieren können, ist genau eines der Dinge, die Vagrant so nützlich machen! Eines der Dinge, die ich schnell entdeckt habe, ist, dass, wenn Sie ein mit Vagrant erstelltes Image über die VirtualBox-Benutzeroberfläche starten und das Problem5 auftritt, der NAT-Adapter mit ifdown eth0 && ifup eth0 ausgeschaltet wird: Beim zweiten Mal ist er in der Lage, eine IP-Adresse vom DHCP-Server zu erhalten. Leider kommen Sie damit bei einem Image, das Vagrant selbst zu starten versucht, nicht weit: Vagrant erstellt Headless-Sitzungen, so dass Sie erst dann über die VirtualBox-Benutzeroberfläche darauf zugreifen können, wenn Sie Vagrant und den von ihm gestarteten VBoxHeadless-Prozess beendet haben. Geändert am 24. April, um hinzuzufügen: siehe den Kommentar von Richard Pot für eine Anleitung, wie man Boxen im GUI-Modus startet.

Glücklicherweise können Sie mit VirtualBox über den Befehl guestcontrol von VBoxManage Befehle auf dem Gastbetriebssystem ausführen , ohne die Benutzeroberfläche verwenden zu müssen. Als sich Vagrant also wieder einmal aufhängte, während es darauf wartete, sich mit dem Image zu verbinden, versuchte ich als erstes /path/to/vboxmanage guestcontrol my-vagrant-image exec "/usr/bin/sudo" --username vagrant --password vagrant --verbose --wait-stdout ifdown eth0 /path/to/vboxmanage guestcontrol my-vagrant-image exec "/usr/bin/sudo" --username vagrant --password vagrant --verbose --wait-stdout ifup eth0 Das ermöglichte es dem NAT-Adapter, wie erhofft, eine IP-Adresse anzufordern. Leider verwirrte dies auch Vagrant, das (vermutlich in dem Glauben, das Image sei offline gegangen) beendet wurde. Glücklicherweise müssen Sie den Adapter nicht herunterfahren, um eine neue IP-Adresse anzufordern: dhclient tut es genauso gut. Und tatsächlich /path/to/vboxmanage guestcontrol my-vagrant-image exec "/usr/bin/sudo" --username vagrant --password vagrant --verbose --wait-stdout dhclient funktioniert: der NAT-Adapter nimmt eine IP-Adresse auf und nach ein paar Sekunden fährt Vagrant mit der Konfiguration des Images fort. Etwas, das hoffentlich hilft, auch wenn es tatsächlich noch ein paar Jahre dauert, dem eigentlichen Problem auf den Grund zu gehen ;-)

Fußnoten
  1. Oder Application Release Automation (ARA), wenn Sie Gartner folgen
  2. Einzelheiten finden Sie auf der Support-Seite der Plattform
  3. Für diejenigen, die mit Vagrant nicht vertraut sind: Es handelt sich um ein leistungsstarkes Tool (geschrieben in Ruby), mit dem Sie deklarativ mehrere zusammenhängende virtuelle Images auf der Grundlage von Vorlagen, den so genannten 'Boxen', definieren können. Vagrant orchestriert die Interaktion mit VirtualBox, um Ihnen eine sehr einfache Möglichkeit zu bieten, einen Cluster von Images zu stoppen, zu starten und zu konfigurieren. In diesem Sinne ist es ein wenig wie eine VirtualBox-basierte CloudFormation.
  4. So kommuniziert Vagrant mit dem Image, während es konfiguriert wird
  5. Das erkennen Sie daran, dass ifconfig anzeigt, dass der eth0-Adapter keine IPv4-Adresse hat

Verfasst von

Andrew Phillips

Contact

Let’s discuss how we can support your journey.