In meinem Vagrantfile kann ich die URL einer Box angeben:
config.vm.box_url = "http://example.com/my-box.pkg"
Laut der neueren Dokumentation sollte es mir möglich sein, eine JSON-Datei zu erstellen, die die URLs für verschiedene Versionen der Box enthält. In der Dokumentation heißt es auch, dass ich beim Ausführen die URL dieser JSON-Datei verwenden kann vagrant box add
. Ich hatte gehofft, die URL dieser JSON-Datei für verwenden zu können config.vm.box_url
. Das scheint jedoch nicht zu funktionieren. Wenn ich es versuche, behandelt es es wie eine Box-Datei:
Bringing machine 'default' up with 'virtualbox' provider...
==> default: Box 'my-box' could not be found. Attempting to find and install...
default: Box Provider: virtualbox
default: Box Version: >= 0
==> default: Adding box 'my-box' (v0) for provider: virtualbox
default: Downloading: http://example.com/my-box.pkg.json
default: Progress: 100% (Rate: 876k/s, Estimated time remaining: 0:00:01)
The box failed to unpackage properly. Please verify that the box
file you're trying to add is not corrupted and try again. The
output from attempting to unpackage (if any):
bsdtar.EXE: Unrecognized archive format: Illegal byte sequence
bsdtar.EXE: Error exit delayed from previous errors.
Kann Vagrant angewiesen werden, eine JSON-Datei mit Box-Metadaten in meiner Vagrant-Datei zu verwenden? Ich möchte lieber nicht Vagrant Cloud verwenden.
Antworten:
Ab heute (12.07.2016, vagrant 1.8.4) können Sie Ihren eigenen Katalog manuell ausführen (dh die Felder manuell aktualisieren und die Datei metadata.json bearbeiten), aber das Verhalten beibehalten Beachten Sie wie bei einem tatsächlichen Katalog Folgendes:
Die Datei muss nicht "metadata.json" heißen. Es kann beliebig benannt werden, solange es die erwarteten Werte enthält. Ich verwende "metadata.json" hier, um die Schritte weiter unten zu verdeutlichen.
Jede Datei metadata.json kann nur ein einziges Feld enthalten. Es kann mehrere Versionen haben und jede Version kann mehrere Anbieter haben (virtualbox, vmware, libvirt). Wenn Sie mehr als ein Feld benötigen (z. B. "fedora" und "ubuntu"), benötigen Sie zwei verschiedene Metadatendateien.
Vagrant erwartet, dass die Datei metadata.json eine Art "application / json" hat (wie Nicholas Hinds oben erwähnt hat. Wenn Ihr Webserver sie nicht zurückgibt (oder "text / plain" zurückgibt), geht Vagrant davon aus, dass es sich um eine tatsächliche Boxdatei handelt , und versuchen Sie es zu analysieren (und kläglich scheitern).
Eine Ausnahme bildet der Hashicorp-Atlas (ehemals Vagrant Cloud), da die Weiterleitungen zu Inhalten führen, die als "text / html" bereitgestellt werden. Ich vermute, dass dies etwas mit den Weiterleitungen zu tun hat (mehr dazu weiter unten).
Die Box-Datei muss sich nicht an derselben Stelle befinden wie die Metadatendatei. Sie können Ihre Metadatendatei in einem lokalen Webserver haben, und die Box in Amazon S3, kein Problem damit.
So weit ich weiß, habe ich den einfachsten Weg gefunden, um dies auf einem Webserver zum Laufen zu bringen und trotzdem eine ziemlich normale Funktionalität zu haben:
Erstellen Sie auf Ihrem Webhost eine Datei- und Verzeichnisstruktur, die der folgenden ähnelt:
(Dieses Layout bedeutet, dass Ihre "metadata.json" für box1 URLs haben muss, die auf etwas wie " http: // yourhost / boxes / yourname / box1 / box1- $ version1- $ provider.box" verweisen. )
Stellen Sie auf Ihrer .htaccess-Datei sicher, dass "metadata.json" für den Verzeichnisindex festgelegt ist. Der Rest ist optional, wenn der Cache negativ ist und der eigentliche Inhalt ausgeblendet wird:
Exportieren Sie in Ihrer Umgebung die VAGRANT_SERVER_URL, die auf Ihren Webhost verweist. Beachten Sie keinen abschließenden Schrägstrich!
Mit dieser Funktion (und allen Dateien mit dem richtigen Inhalt) können Sie Ihre Box direkt hinzufügen:
Da "metadata.json" die Indexdatei für das Verzeichnis "box1" ist, sollte es den Inhalt direkt darauf umleiten. Vagrant wird ihn abrufen, die Metadaten interpretieren und die entsprechende Box herunterladen.
quelle
Nachdem Sie Ihre Frage noch einmal gelesen haben, scheint es, als würden Sie versuchen, etwas anderes zu tun als ich - aber ich denke, unser Endziel ist dasselbe.
Ich möchte den Vagrant Cloud-Dienst nicht zum Hosten meiner Basisboxen verwenden, aber ich möchte in der Lage sein, eine Entwicklungsumgebung an mein Entwicklerteam zu verteilen und die Funktionen der
metadata.json
Datei zu verwenden, um ein Versionsverwaltungssystem für die Entwicklungsumgebung zu verwalten. die dann für mein Entwicklungsteam zur Verfügung stehen, indem sie einfach die in Vagrant eingebauten Einrichtungen nutzen.Die Dokumentation zu Vagrant ist in diesem Bereich zum Zeitpunkt des Schreibens (05.08.2014) sehr spärlich, vermutlich, weil es sich um eine relativ neue Funktion handelt, aber ich bin mir sicher, dass die Tatsache, dass VagrantCloud eine kostenpflichtige Stufe hat, auch damit zu tun hat .
Um herauszufinden, wie die
metadata.json
Datei für die Versionierung und Verteilung von Boxen verwendet werden kann, habe ich mir einige der auf der VagrantCloud verfügbaren VMs angesehen. Nachdem ich diese durchgesehen und einige der bekannten Codes gelesen hatte, war es ziemlich einfach herauszufinden, wie ich mein Ziel erreichen konnte.Erstelle eine
metadata.json
Datei, um deine Basisbox zu beschreiben. Meine sieht ungefähr so aus:Nachdem ich meine
metadata.json
Datei erstellt habe , habe ich sie auf einen lokalen Server in unserem internen Netzwerk hochgeladen (vagrant.domain.local/metadata.json
). Nachdem ich das getan hatte, musste ich es nur noch mit Vagabunden testen:Voila, eine remote gehostete, gemeinsam genutzte und versionierte private Box, für die keine Verwendung der Vagrant Cloud erforderlich ist.
Wenn Sie neue Versionen Ihrer Box erstellen, packen Sie diese zusammen und bearbeiten die
metadata.json
Datei. Soweit ich weiß, können Sie jedes beliebige Versionsschema verwenden, sei es die semantische Versionierung (1.0.0, 1.0.1 usw.) oder nur einfache ganze Zahlen für Versionen (1, 2, 3 usw.). Wenn Ihre Boxbenutzervagrant up
vagrant automatisch Ihre Datei metadata.json auf eine neue Version überprüft und sie auffordertvagrant box update
, die Box zu aktualisieren.Sie können die
vagrant box add <metadata.json url>
undvagrant init
Bits auch überspringen, indem Sie eine Basis-Vagrantdatei mit dem Boxnamen und der Box-URL wie folgt definieren:Sie könnten ein Vagrantfile mit diesen Inhalten verteilen, und alle Benutzer könnten es einfach
vagrant up
. Ich bin mir jedoch nicht sicher, wie das funktioniert, wenn die Versionen aktualisiert werden.quelle
~/.vagrant.d/boxes/<your box name>
. In diesem Ordner befindet sich diemetadata_url
Datei, auf die in der Dokumentation verwiesen wird. Sie enthält die URL für Ihre JSON-Datei, die Ihre Versionen definiert. Vagrant Griffe alle , die automatisch, so alles , was Sie tun müssen, istvagrant box add <your metadata.json url>
, dann nurvagrant init <boxname> && vagrant up
, vagrant erledigt den Restvagrant box add
benötigt. Wenn ich die URL dieser JSON-Datei in der Vagrant-Datei festlegen könnte, wäre dies ein Schritt weniger für einen neuen Entwickler, der sich gerade dem Team anschließt, um den Betrieb aufzunehmen. Es funktioniert für Boxen, aber ich kann nicht herausfinden, warum es für die JSON-Datei nicht funktioniert.config.vm.box
UND definieren,config.vm.box_url
wobox
sich Ihr Boxname befindet undbox_url
die URL zu Ihrer json-Datei.Vagrant erfordert, dass Box-Metadaten-URLs mit dem
application/json
Inhaltstyp bereitgestellt werden. Der Fehler, den Sie erhalten, zeigt an, dass Vagrant Ihre URL als reguläres Feld interpretiert hat.Stellen Sie sicher, dass Ihr HTTP-Server den
Content-Type
Header richtig einstellt . Die meisten HTTP-Server setzen denContent-Type
Header automatisch auf ,application/json
wenn Ihre Datei die Erweiterung hat.json
quelle
Ich denke, Sie haben ihre Anweisungen durcheinander gebracht.
Folgendes stammt von der Vagabund-Website:
BOX-DATEI
Die eigentliche Box-Datei ist der erforderliche Teil für Vagrant. Es wird empfohlen, neben einer Box-Datei immer eine Metadatendatei zu verwenden. Aus älteren Gründen werden in Vagrant jedoch direkte Box-Dateien unterstützt.
Box files are compressed using tar, tar.gz, or zip. The contents of the archive can be anything, and is specific to each provider.
Vagrant Core selbst packt die Kartons erst zur späteren Verwendung aus.Within the archive, Vagrant does expect a single file: "metadata.json".
Dies ist eine JSON-Datei, die in keiner Beziehung zur obigen Komponente "Box-Metadaten" steht.This file must contain at least the "provider" key with the provider the box is for
. Wenn Ihre Box beispielsweise für VirtualBox war, würde die Datei metadata.json folgendermaßen aussehen:If there is no metadata.json file or the file does not contain valid JSON with at least a "provider" key, then Vagrant will error when adding the box.
Also, ich denke, dein Box-Dateiformat ist wahrscheinlich falsch. Entweder ist es nicht mit dem empfohlenen Format komprimiert, oder Sie haben keine metadata.json-Datei in das Archiv aufgenommen
quelle
Sie können https://github.com/sparkoo/boxitory versuchen . Es ist einfach ein JAR-Server. Sie verweisen auf das Verzeichnis, in dem sich Ihre Vagrant-Boxen befinden, und erstellen eine kompatible http-Schnittstelle für Vagrant. Dann zeigst du es einfach von deiner Vagabunddatei und schon bist du fertig. Sie müssen nicht manuell mit JSON-Dateien umgehen, die Ihre Boxen beschreiben, neue Versionen, Anbieter usw. hinzufügen. Dies ist alles für Sie kostenlos. Fügen Sie einfach eine neue Box-Datei hinzu und Boxitory gibt sie sofort zurück, wenn Sie dazu aufgefordert werden.
quelle