Vagrant-Box-URL für JSON-Metadatendatei

18

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.

Brad
quelle
Haben Sie jemals eine Lösung dafür gefunden?
Jim Rubenstein
@JimRubenstein Leider nein. Der Vorschlag von Nicholas könnte funktionieren, aber ich bin mir ziemlich sicher, dass mein Server bereits die richtigen Content-Typ-Header für JSON sendet. Die Antwort von Chux mag richtig sein, aber ich bin noch nicht überzeugt, da die Dokumentation etwas anderes impliziert. Leider ist die Dokumentation von Vagrant insgesamt ziemlich schrecklich und gibt nicht viel Kontext zwischen dem grundlegenden Lernprogramm und dem Beitrag zum Projekt und dem Hangout-on-irc-Level. Zumindest für mich nicht.
Brad
Ich teste gerade etwas, während wir über die Veröffentlichung einer Box + Metadaten sprechen, um zu sehen, ob ich das Verhalten der Vagabundwolke lokal nachahmen kann. Ich werde Sie wissen lassen, wie es ausgeht.
Jim Rubenstein

Antworten:

8

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:

d wwwroot/
d wwwroot/boxes
d wwwroot/boxes/yourname
f wwwroot/boxes/yourname/.htaccess
d wwwroot/boxes/yourname/box1
f wwwroot/boxes/yourname/box1/metadata.json
f wwwroot/boxes/yourname/box1/box1-$version1-$provider.box
f wwwroot/boxes/yourname/box1/box1-$version2-$provider.box
f wwwroot/boxes/yourname/box1/box1-$version2-$otherprovider.box
d wwwroot/boxes/yourname/box2
f wwwroot/boxes/yourname/box2/metadata.json
f wwwroot/boxes/yourname/box2/box2-$version1-$provider.box
(... etc)

(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:

Header unset Pragma
FileETag None
Header unset ETag
DirectoryIndex metadata.json
IndexIgnore *
Header set Cache-Control "max-age=0, no-cache, no-store, must-revalidate, private"
Header set Pragma "no-cache"
Header set Expires "Wed, 11 Jan 1984 05:00:00 GMT"

Exportieren Sie in Ihrer Umgebung die VAGRANT_SERVER_URL, die auf Ihren Webhost verweist. Beachten Sie keinen abschließenden Schrägstrich!

export VAGRANT_SERVER_URL="http://yourhost/boxes"

Mit dieser Funktion (und allen Dateien mit dem richtigen Inhalt) können Sie Ihre Box direkt hinzufügen:

vagrant box add yourname/box1

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.

Guto Andreollo
quelle
19

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.jsonDatei 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.jsonDatei 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.

  • Verpacken Sie Ihre Box wie gewohnt. In meinem Fall verpacke ich nur für eine virtuelle Box, da dies von unseren Entwicklern zum Ausführen des VMs verwendet wird. Ich packe auch eine Vagrant-Datei in meine Basebox, die eine Provisionierung für die Entwicklungsumgebung vornimmt (Einrichten von Freigaben für entsprechende Ordner, einige grundlegende Apache-Konfigurationen, Fehlerprotokollierung usw.).
  • Erstelle eine metadata.jsonDatei, um deine Basisbox zu beschreiben. Meine sieht ungefähr so ​​aus:

    {
        "description": "long box description",
        "short_description": "short box description",
        "name": "company/developer-environment",
        "versions": [{
            "version": "1",
            "status": "active",
            "description_html": "<p>Dev Environment</p>",
            "description_markdown": "Dev Environment",
            "providers": [{
                "name": "virtualbox",
                "url": "http:\/\/vagrant.domain.local/dev/company-developer-environment-1.box"
            }]
        }]
    }
    

Nachdem ich meine metadata.jsonDatei 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:

# add the box to vagrant using the definition from metadata.json
# (the box is actually downloaded here, so it can take a minute...or 10)
$ vagrant box add http://vagrant.domain.local/dev/metadata.json

# init the box (this creates a .vagrant folder and a Vagrantfile in the cwd with the appropriate box name)
$ vagrant init company/developer-environment

# boot the box
$ vagrant up

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.jsonDatei. 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 Boxbenutzer vagrant upvagrant automatisch Ihre Datei metadata.json auf eine neue Version überprüft und sie auffordert vagrant box update, die Box zu aktualisieren.

Sie können die vagrant box add <metadata.json url>und vagrant initBits auch überspringen, indem Sie eine Basis-Vagrantdatei mit dem Boxnamen und der Box-URL wie folgt definieren:

# -*- mode: ruby -*-
# vi: set ft=ruby :

# Vagrantfile API/syntax version. Don't touch unless you know what you're doing!
VAGRANTFILE_API_VERSION = "2"

Vagrant.configure(VAGRANTFILE_API_VERSION) do |config|
  config.vm.box = "company/developer-environment"
  config.vm.box_url = "https://vagrant.domain.local/dev/metadata.json"
end

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.

Jim Rubenstein
quelle
Das ist perfekt, danke! Wie füge ich diese JSON-URL der Vagrant-Datei hinzu?
Brad
Das musst du nicht. Wenn Sie die Box hinzufügen, lädt Vagrant das aktuelle Box-Bild herunter und speichert die Informationen in ~/.vagrant.d/boxes/<your box name>. In diesem Ordner befindet sich die metadata_urlDatei, 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, ist vagrant box add <your metadata.json url>, dann nur vagrant init <boxname> && vagrant up, vagrant erledigt den Rest
Jim Rubenstein
Ich verstehe das, aber ich versuche Entwicklern den Einstieg so einfach wie möglich zu machen. Durch Hinzufügen einer Box-URL in der Vagrant-Datei wird keine vagrant box addbenö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.
Brad
1
ah, gotcha - ich habe tatsächlich gerade eine Lösung dafür gefunden, indem ich nur herumgefurzt habe. Sie müssen config.vm.boxUND definieren, config.vm.box_urlwo boxsich Ihr Boxname befindet und box_urldie URL zu Ihrer json-Datei.
Jim Rubenstein
1
@ Jim Rubenstein Fantastische Antwort - genau wie Goldlöckchen, nicht zu kurz, nicht zu lang :)
Steve Jansen
9

Vagrant erfordert, dass Box-Metadaten-URLs mit dem application/jsonInhaltstyp 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-TypeHeader richtig einstellt . Die meisten HTTP-Server setzen den Content-Type Header automatisch auf , application/jsonwenn Ihre Datei die Erweiterung hat.json

Nicholas Hinds
quelle
1
Ich weiß nicht, warum Ihre Antwort nicht die Antwort ist, da ich genau das tun musste, damit die lokale Bereitstellung mit Vagrant funktioniert.
Gaurav
4

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:

{
  "provider": "virtualbox"
}

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

Chux Uzoeto
quelle
Für andere mit demselben Problem lautet der Pfad metadata.json (in Windows) ..Users \ Benutzername \ vagrant.d \ boxes \ Boxname \ 0 \ virtualbox \ metadata.json
Nebojsac
1

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.

Michal Vala
quelle