# Vagrant — Reproduzierbare Entwicklungsumgebungen als VM

> Praxis-Guide zu Vagrant — VM-basierte Entwicklungsumgebungen mit Vagrantfile, Boxen, Providern, Provisioning und Snapshots auf der Kommandozeile.

Source: https://www.jpkc.com/db/cheatsheets/containers/vagrant/

<!-- PROSE:intro -->
Vagrant von HashiCorp baut reproduzierbare Entwicklungsumgebungen als vollwertige virtuelle Maschinen – nicht als Container. Die gesamte Konfiguration liegt in einer einzigen Datei, dem `Vagrantfile`, das du zusammen mit deinem Projekt versionierst. Als Basis dienen vorgefertigte Boxen, die Vagrant über einen Provider wie VirtualBox, VMware, Hyper-V oder libvirt startet. So bekommt jedes Teammitglied mit einem einzigen `vagrant up` exakt dieselbe Umgebung. Dieser Guide führt dich durch die wichtigsten Kommandos – vom Initialisieren über das Provisioning bis zu Snapshots.
<!-- PROSE:intro:end -->

## Initialisieren & Starten

`vagrant init <box>` — Erstellt ein Vagrantfile für eine bestimmte Box.

```bash
vagrant init ubuntu/jammy64
```

`vagrant up` — Startet die VM und führt das Provisioning aus.

```bash
vagrant up
```

`vagrant up --provider=<name>` — Startet mit einem bestimmten Provider.

```bash
vagrant up --provider=vmware_desktop
```

`vagrant up --no-provision` — Startet, ohne die Provisioner auszuführen.

```bash
vagrant up --no-provision
```

`vagrant reload` — Startet die VM neu (übernimmt Änderungen am Vagrantfile).

```bash
vagrant reload
```

`vagrant reload --provision` — Startet neu und führt die Provisioner erneut aus.

```bash
vagrant reload --provision
```

## Stoppen & Löschen

`vagrant halt` — Fährt die VM kontrolliert herunter.

```bash
vagrant halt
```

`vagrant halt -f` — Erzwingt das Herunterfahren der VM.

```bash
vagrant halt -f
```

`vagrant suspend` — Pausiert die VM (Zustand wird auf die Festplatte gesichert).

```bash
vagrant suspend
```

`vagrant resume` — Setzt eine pausierte VM fort.

```bash
vagrant resume
```

`vagrant destroy` — Stoppt und löscht die VM vollständig.

```bash
vagrant destroy
```

`vagrant destroy -f` — Erzwingt das Löschen ohne Rückfrage.

```bash
vagrant destroy -f
```

## SSH & Status

`vagrant ssh` — Verbindet sich per SSH mit der VM.

```bash
vagrant ssh
```

`vagrant ssh -c '<command>'` — Führt einen Befehl per SSH in der VM aus.

```bash
vagrant ssh -c 'cat /etc/os-release'
```

`vagrant ssh-config` — Zeigt die SSH-Konfiguration (zur Nutzung mit dem ssh-Befehl).

```bash
vagrant ssh-config >> ~/.ssh/config
```

`vagrant status` — Zeigt den Status der aktuellen VM.

```bash
vagrant status
```

`vagrant global-status` — Zeigt den Status aller Vagrant-VMs systemweit.

```bash
vagrant global-status
```

`vagrant port` — Zeigt die Port-Weiterleitungen der VM.

```bash
vagrant port
```

## Provisioning

`vagrant provision` — Führt die Provisioner auf einer laufenden VM aus.

```bash
vagrant provision
```

`vagrant provision --provision-with <name>` — Führt nur einen bestimmten Provisioner aus.

```bash
vagrant provision --provision-with shell
```

`vagrant upload <src> <dest>` — Lädt eine Datei in die VM hoch.

```bash
vagrant upload config.yaml /home/vagrant/config.yaml
```

## Box-Verwaltung

`vagrant box list` — Listet alle installierten Boxen auf.

```bash
vagrant box list
```

`vagrant box add <name>` — Lädt eine Box herunter und fügt sie hinzu.

```bash
vagrant box add ubuntu/jammy64
```

`vagrant box update` — Aktualisiert die Box der aktuellen Umgebung.

```bash
vagrant box update
```

`vagrant box remove <name>` — Entfernt eine Box aus dem lokalen Speicher.

```bash
vagrant box remove ubuntu/focal64
```

`vagrant box outdated` — Prüft, ob die Box veraltet ist.

```bash
vagrant box outdated
```

`vagrant package --output <file>` — Verpackt die aktuelle VM in eine wiederverwendbare Box.

```bash
vagrant package --output mybox.box
```

## Snapshots

`vagrant snapshot save <name>` — Erstellt einen benannten Snapshot der VM.

```bash
vagrant snapshot save before-update
```

`vagrant snapshot restore <name>` — Stellt einen Snapshot wieder her.

```bash
vagrant snapshot restore before-update
```

`vagrant snapshot list` — Listet alle Snapshots auf.

```bash
vagrant snapshot list
```

`vagrant snapshot delete <name>` — Löscht einen Snapshot.

```bash
vagrant snapshot delete before-update
```

`vagrant snapshot push` — Erstellt schnell einen Snapshot (Stack-basiert).

```bash
vagrant snapshot push
```

`vagrant snapshot pop` — Stellt den zuletzt abgelegten Snapshot wieder her und löscht ihn.

```bash
vagrant snapshot pop
```

<!-- PROSE:outro -->
## Fazit

Vagrant glänzt überall dort, wo du eine vollständige, isolierte Umgebung brauchst – ein anderes Betriebssystem, ein Kernel-Modul oder ein Setup, das sich mit Containern nur umständlich nachbilden lässt. Sobald dein `Vagrantfile` einmal steht, ist der Einstieg für neue Teammitglieder ein einziges Kommando. Für leichtgewichtige, rein Linux-basierte Dienste sind Container oft die schlankere Wahl; für reproduzierbare VM-Umgebungen bleibt Vagrant das Werkzeug der Wahl.

## Weiterführende Links

- [Vagrant – offizielle Dokumentation](https://developer.hashicorp.com/vagrant/docs) – Referenz und Handbuch von HashiCorp (englisch)
- [Vagrant Cloud – Box-Katalog](https://portal.cloud.hashicorp.com/vagrant/discover) – fertige Boxen zum Einbinden (englisch)
- [Vagrant (Software) – Wikipedia](https://de.wikipedia.org/wiki/Vagrant_(Software)) – Hintergrund und Geschichte
<!-- PROSE:outro:end -->

## Verwandte Kommandos

- [ddev](https://www.jpkc.com/db/cheatsheets/containers/ddev/) – containerbasierte lokale Entwicklungsumgebungen für PHP-Projekte
- [docker](https://www.jpkc.com/db/cheatsheets/containers/docker/) – Container statt vollwertiger VMs bauen und betreiben
- [docker-compose](https://www.jpkc.com/db/cheatsheets/containers/docker-compose/) – mehrere Container deklarativ orchestrieren

