# Vagrant (Software)

Vagrant ist eine Ruby-Anwendung zum Erstellen und Verwalten virtueller Maschinen. Vagrant ermöglicht einfache Softwareverteilung (englisch Deployment) insbesondere in der Software- und Webentwicklung und dient als Wrapper zwischen Virtualisierungssoftware wie VirtualBox, KVM/QEMU, VMware und Hyper-V und Software-Configuration-Management-Anwendungen beziehungsweise Systemkonfigurationswerkzeugen wie Chef, Saltstack und Puppet.

## Funktionsweise und Konzepte

Vagrant wird über eine Shell gesteuert. Nachfolgend findet sich eine Auflistung der wichtigsten Befehle und Konzepte von Vagrant.

### Projektinitialisierung

Um einen Ordner zu initialisieren, muss man den Ordner anwählen und den Befehl vagrant init ausführen, daraufhin wird ein sogenanntes „Vagrantfile“ mit Beispielen und Erklärungen erzeugt und in dem Ordner platziert. Durch den Zusatz vagrant init --minimal wird eine minimale Version des Vagrantfiles ohne Beispiele und Erklärungen erzeugt.
Der Befehl vagrant init nimmt zwei Parameter an vagrant init [box-name] [box-url]: durch die Angabe eines „box-name“ kann das Vagrantfile direkt mit einer entsprechenden Vorlage („Box“) generiert werden und durch die Angabe „box-url“ wird die URL (Internetadresse) angegeben, an der sich diese Box befindet und heruntergeladen werden kann. Diese Angaben lassen sich auch im Vagrantfile konfigurieren.
Diese Datei kann nun mit einem beliebigen Texteditor konfiguriert werden.

### Boxen

Boxen sind bei Vagrant vorkonfigurierte (Vorlagen) Virtuelle Maschinen. Dies soll den Prozess der Softwareverteilung und der Entwicklung beschleunigen. Jede Box, die von dem Nutzer benutzt wurde, wird auf dem Computer gespeichert und muss so nicht wieder aus dem Internet geladen werden. Boxen können explizit durch den Befehl vagrant box add [box-name] oder vagrant box add [box-url] heruntergeladen und durch vagrant box remove [box-name] entfernt werden. Ein „box-name“ ist dabei durch Konvention wie folgt aufgebaut: „Entwickler/Box“, zum Beispiel „hashicorp/precise32“. Vagrant Cloud dient dabei als Austauschplattform für die Suche nach Boxen und das Einstellen von eigenen Boxen. Wird nur ein box-name angegeben, wird davon ausgegangen, dass die Box lokal vorhanden ist. Ansonsten wird in der Vagrant Cloud nach der Box gesucht.

### Konfiguration

Die gesamte Konfiguration erfolgt im Vagrantfile, das ein spezielles Ruby-Programm enthält.
Ein Beispiel:
Dies sagt Vagrant, es soll die Konfigurationsversion 2 benutzt werden. Dies ist für die Rückwärtskompatibilität nötig. Daraufhin wird mit der „config“-Funktion festgelegt, dass Vagrant die Box „hashicorp/precise32“ benutzen soll.

### Provisioning

Beim Provisioning ruft Vagrant andere Programme auf, zumeist SCM-Software wie Ansible oder die Shell. Dies automatisiert die Konfiguration.
In Vagrant stehen folgende Provisioner zur Verfügung: File, Shell, Ansible, CFEngine, Chef Solo, Chef Client, Docker, Puppet Apply, Puppet Agent und Salt.
Beispiel:
Dies führt das Shellskript „script.sh“ aus.
Es können verschiedenste Provisioner in einer Datei ausgeführt werden. Beispiel für mehrere parallele Provisioner:
Dies führt den Shellprovisioner aus, der die Datei script.sh ausführt. Anschließend wird die Datei unter der Adresse „~/.gitconfig“ nach „.gitconfig“ in die virtuelle Maschine verschoben. Als letztes wird der Ansible-Provisioner ausgeführt, der die „playbook.yml“ ausführt.

### Softwareverteilung

Ab Version 1.7 vom Dezember 2014 ist Softwareverteilung mithilfe des Befehls vagrant push durch Heroku, SFTP und FTP, durch selbstgeschriebene Kommandozeilenskripte sowie durch das hauseigene „Atlas“ möglich.
Beispiel für einen FTP-push
Dieser Abschnitt führt einen Softwareverteilungsvorgang mithilfe des FTP-Protokolls auf den Server mit der Adresse „ftp.test.com“ mit dem Benutzer „benutzer1“ und dem Passwort „Passwort1“ aus. push.secure sagt aus ob das SFTP-Protokoll benutzt werden soll, standardmäßig auf false gesetzt. push.destination enthält den Zielpfad (auf dem Server), an den die Dateien geschickt werden sollen, dahingegen enthält push.dir den lokalen Pfad zu den Dateien die hochgeladen werden sollen. Alle Pfade sind relativ zum Vagrantfile. Darüber hinaus können Dateien und Ordner mithilfe von exclude ausgeschlossen oder mit include eingeschlossen werden.

### Sitzung beginnen

Um die virtuelle Maschine zu starten, führt man den Befehl vagrant up aus. Anschließend kann, falls nötig, mit vagrant ssh eine SSH-Sitzung gestartet werden.

### Sitzung beenden

Die virtuelle Maschine kann auf verschiedene Art und Weise beendet werden. Die Maschine kann mit dem Befehl vagrant destroy mit allen Abhängigkeiten komplett „zerstört“ werden, daneben kann die virtuelle Maschine mit vagrant halt angehalten und mit vagrant suspend in einen Ruhezustand gebracht werden. Ansonsten kann die Maschine auch mit vagrant reload neugestartet werden.

### Sonstiges

Mit Vagrant können viele virtuelle Maschinen gleichzeitig betrieben werden, deren Status mit dem Befehl vagrant global-status abgefragt werden kann.

## Versionen

Ab Version 1.1 werden auch andere Virtualisierungsanwendungen wie der VMware Player und Serverumgebungen wie Amazon EC2 unterstützt.
Mit Version 1.5 wurden Ordnersynchronisierung mit Rsync und SMB sowie eine Unterstützung von Hyper-V zur Visualisierung hinzugefügt.
Mit Version 1.6 wird Docker auch zur Laufzeit nativ unterstützt, was Overhead reduzieren soll, da Docker mit LXC arbeitet.
Mit der am 9. Dezember 2014 veröffentlichten Version 1.7 wird einfache Softwareverteilung mithilfe des Befehls vagrant push durch Heroku, SFTP und FTP, durch selbstgeschriebene Kommandozeilenskripte sowie durch das hauseigene „Atlas“ ermöglicht.
Am 21. Dezember 2015 wurde Version 1.8 veröffentlicht. Diese Version benutzt nun nach Möglichkeit "verlinkte Abbildungen" (englisch linked images), wodurch keine Systemabbildungen mehr dupliziert werden müssen, sondern als Referenz angegeben werden können. Außerdem können nun Schnappschüsse (englisch snapshots) von Systemen erstellt werden.

## Ergänzendes

Um die weitere Entwicklung des Projekts zu begleiten, gründeten Mitchell Hashimoto und Armon Dadgar 2012 Hashicorp, Inc.
Es gibt ein Plugin namens vagrant-libvirt, welches Unterstützung für Libvirt in Vagrant ermöglicht.
Zeitgleich mit Version 1.5 wurde auch Vagrant Cloud vorgestellt. Diese Cloud macht es möglich, im Team zeitgleich an einer Virtuellen Maschine zu arbeiten und diese über HTTPS in einem Browser darzustellen und bietet vordefinierte Pakete (sogenannte Boxes) an.