URL de la boîte vagabonde pour le fichier de métadonnées JSON

17

Dans mon Vagrantfile, je peux spécifier l'URL d'une boîte:

config.vm.box_url = "http://example.com/my-box.pkg"

Selon la documentation la plus récente , je devrais pouvoir créer un fichier JSON contenant les URL des différentes versions de la boîte. La documentation indique également que je peux utiliser l'URL de ce fichier JSON lors de l'exécution vagrant box add. J'espérais pouvoir utiliser l'URL de ce fichier JSON pour config.vm.box_url. Cependant, cela ne semble pas fonctionner. Lorsque je l'essaie, il le traite comme un fichier boîte:

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.

Est-il possible de dire à Vagrant d'utiliser un fichier JSON de métadonnées de boîte dans mon fichier Vagrant? Je préférerais ne pas avoir à utiliser Vagrant Cloud.

Brad
la source
Avez-vous déjà trouvé une solution pour cela?
Jim Rubenstein
@ JimRubenstein Malheureusement, non. La suggestion de Nicholas pourrait fonctionner, mais je suis presque sûr que mon serveur envoie déjà les en-têtes de type de contenu corrects pour JSON. La réponse de Chux est peut-être exacte, mais je ne suis pas encore convaincu, car la documentation indique le contraire. Malheureusement, la documentation de Vagrant est assez terrible et ne donne pas beaucoup de contexte entre le tutoriel de base et les niveaux contribuant au projet et à la guinguette ... du moins pour moi de toute façon.
Brad
Je teste quelque chose alors que nous parlons de la publication d'une boîte + métadonnées pour voir si je peux mimer le comportement du nuage vagabond, localement. Je vous ferai savoir comment cela se passera.
Jim Rubenstein

Réponses:

7

À partir d'aujourd'hui (12-07-2016, vagrant 1.8.4), si vous souhaitez exécuter votre propre catalogue manuellement (c'est-à-dire mettre à jour manuellement les zones et modifier le fichier metadata.json), sans le laisser se comporter comme un catalogue réel, gardez à l'esprit les points suivants:

  • Il n'est pas nécessaire que le fichier s'appelle "metadata.json". Il peut être nommé n'importe quoi, tant qu'il contient les valeurs attendues. J'utilise "metadata.json" ici pour clarifier les étapes suivantes.

  • chaque fichier metadata.json ne peut contenir qu'une seule boîte. Il peut avoir plusieurs versions, et chaque version peut avoir plusieurs fournisseurs (virtualbox, vmware, libvirt). Si vous avez besoin de plusieurs boîtes (par exemple, "fedora" et "ubuntu"), vous avez besoin de deux fichiers de métadonnées différents.

  • Vagrant s'attend à ce que le fichier metadata.json ait un type "application / json" (comme mentionné par Nicholas Hinds ci-dessus. Si votre serveur Web ne le renvoie pas (ou renvoie "text / plain"), vagrant supposera qu'il s'agit d'un fichier box réel. et essayez de l’analyser (et échouez misérablement).

  • L'Atlas de Hashicorp (ce qui s'appelait autrefois le Nuage Vagrant) est une exception à cela, car les redirections vous mènent au contenu servi en tant que "text / html". Ma meilleure hypothèse est que cela a quelque chose à voir avec les redirections (plus de détails ci-dessous).

  • Le fichier de boîte n'a pas besoin d'être au même endroit que le fichier de métadonnées. Vous pouvez avoir votre fichier de métadonnées dans un serveur Web local et la boîte dans Amazon S3, ce qui ne pose aucun problème.

Donc, autant que je sache, j'ai trouvé le moyen le plus simple de faire fonctionner cela sur un serveur web et j'ai toujours une fonctionnalité assez normale, c'est de faire ceci:

Sur votre hébergeur, créez une structure de fichiers et de répertoires similaire à celle-ci:

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)

(cette disposition signifie que votre "metadata.json" pour box1 devra avoir ses URL pointant vers quelque chose comme " http: // yourhost / boxes / yourname / box1 / box1- $ version1- $ provider.box")

Sur votre .htaccess, assurez-vous que "metadata.json" est défini pour Index de répertoire. Le reste est optionnel, pour le cache négatif et le masquage du contenu réel:

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"

Sur votre environnement, exportez l'URL VAGRANT_SERVER_URL pointant vers votre hébergeur Web. Notez pas de slash final!

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

Avec cela en place (et tous les fichiers avec le contenu correct), vous pouvez aller et ajouter directement votre boîte:

vagrant box add yourname/box1

Puisque "metadata.json" est le fichier d'index du répertoire box1, il doit rediriger le contenu directement vers ce répertoire, vagrant le récupérera, interprétera les métadonnées et téléchargera la boîte appropriée.

Guto Andreollo
la source
19

Après avoir relu votre question, il semble que vous essayez de faire quelque chose d'un peu différent de ce que je suis - mais je pense que notre objectif final est le même.

Je ne souhaite pas utiliser le service Vagrant Cloud pour héberger mes bases, mais je souhaite pouvoir distribuer un environnement de développement à mon équipe de développement et utiliser les fonctionnalités du metadata.jsonfichier pour gérer un système de gestion des versions pour l'environnement de développement. qui sera ensuite disponible pour mon équipe de développement simplement en utilisant les installations intégrées à vagabond.

La documentation vagabonde est vraiment rare dans ce domaine au moment de la rédaction de cet article (le 8/5/2014), sans doute parce que c'est une fonctionnalité relativement nouvelle, mais je suis sûr que le fait que VagrantCloud ait un niveau payant y est aussi pour quelque chose. .

Pour comprendre comment utiliser le metadata.jsonfichier en version et distribuer des boîtes, j'ai jeté un coup d'œil à certaines des machines virtuelles disponibles sur VagrantCloud. Après avoir parcouru ceux-ci et lu une partie du code vagabond, il devint assez facile de comprendre comment atteindre mon objectif.

  • Emballez votre boîte comme vous le feriez normalement. Dans mon cas, je n'emballe que pour une boîte virtuelle, car c'est ce que nos développeurs utiliseront pour exécuter Vm. J'emballe également un Vagrantfile avec ma basebox qui effectue un provisionnement pour l'environnement de développement (configuration des partages dans les dossiers appropriés, configuration de base d'Apache, consignation des erreurs, etc.).
  • Créez un metadata.jsonfichier pour décrire votre boîte de base, le mien ressemble à ceci:

    {
        "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"
            }]
        }]
    }
    

Une fois que j'ai créé mon metadata.jsonfichier, je l'ai téléchargé sur un serveur local s'exécutant sur notre réseau interne ( vagrant.domain.local/metadata.json). Une fois que j'ai fait cela, tout ce qui restait à faire était de le tester avec vagabond:

# 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, une boîte privée hébergée à distance, partagée et versionnée, qui ne nécessite pas l'utilisation du nuage vagabond.

Au fur et à mesure que vous créez de nouvelles versions de votre boîte, vous la conditionnerez et modifierez le metadata.jsonfichier. D'après ce que je peux dire, vous pouvez utiliser le schéma de gestion de version de votre choix, qu'il s'agisse du versioning sémantique (1.0.0, 1.0.1, etc.) ou simplement de simples nombres entiers pour les versions (1, 2, 3, etc.). Lorsque votre utilisateur de la boîte de dialogue vagrant upvagrant vérifie automatiquement la nouvelle version de votre fichier metadata.json, il est invité à le faire vagrant box updatepour mettre à jour la boîte.

Vous pouvez également ignorer les bits vagrant box add <metadata.json url>et vagrant initen définissant un Vagrantfile de base avec le nom et l'URL de la boîte, comme suit:

# -*- 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

Vous pouvez distribuer un fichier Vagrant avec ce contenu et tous les utilisateurs pourront le faire vagrant up. Cependant, je ne sais pas comment cela fonctionne lorsque les versions sont mises à jour.

Jim Rubenstein
la source
C'est parfait, merci! Cependant ... comment puis-je ajouter cette URL JSON au fichier Vagrant?
Brad
Tu n'as pas besoin. Lorsque vous ajoutez la boîte, Vagrant télécharge l'image de la boîte en cours et enregistre les informations ~/.vagrant.d/boxes/<your box name>. Dans ce dossier, vous metadata_urltrouverez le fichier référencé dans la documentation, qui contient l'URL de votre fichier JSON qui définit vos versions. Vagrant gère tout cela automatiquement, donc tout ce que vous avez à faire est vagrant box add <your metadata.json url>, alors vagrant init <boxname> && vagrant up, vagabond fait le reste
Jim Rubenstein
Je comprends cela, mais j'essaie de rendre les développeurs aussi faciles que possible à se mettre au travail. En ajoutant une URL de boîte dans le fichier Vagrant, aucune information vagrant box addn'est nécessaire. Si je pouvais définir l’URL de ce fichier JSON dans Vagrantfile, c’est une étape de moins pour un nouveau développeur qui vient de rejoindre l’équipe pour devenir opérationnel. Cela fonctionne pour les boîtes, mais je ne comprends pas pourquoi cela ne fonctionne pas pour le fichier JSON.
Brad
1
ah, gotcha - en fait, je viens de trouver une solution à cela en pétant. vous devez définir config.vm.boxAND config.vm.box_urlboxest le nom de votre boîte et box_urll'URL de votre fichier JSON.
Jim Rubenstein
1
@JimRubenstein Réponse fantastique - à l'image de Goldilocks, ni trop courte, ni trop longue :)
Steve Jansen
9

Vagrant exige que les URL de métadonnées de boîte soient fournies avec le application/jsontype de contenu. L'erreur que vous obtenez indique que vagrant a interprété votre URL comme une boîte standard.

Assurez-vous que votre serveur HTTP définit l'en- Content-Typetête de manière appropriée. La plupart des serveurs HTTP définiront automatiquement l'en- Content-Type tête sur application/jsonsi votre fichier a l'extension..json

Nicholas Hinds
la source
1
Je ne sais pas pourquoi votre réponse n’est pas la solution car c’est exactement ce que je devais faire pour que le provisioning local fonctionne avec Vagrant.
Gaurav
4

Je pense que vous avez mélangé leurs directives ..

Ce qui suit est tiré du site Web vagrant:


FICHIER DE BOITE

Le fichier de boîte actuel est la partie requise pour Vagrant. Il est recommandé de toujours utiliser un fichier de métadonnées à côté d'un fichier boîte, mais les fichiers boîte directe sont pris en charge pour des raisons héritées de Vagrant.

Box files are compressed using tar, tar.gz, or zip. The contents of the archive can be anything, and is specific to each provider. Le noyau vagabond lui-même ne déballe les boîtes que pour une utilisation ultérieure.

Within the archive, Vagrant does expect a single file: "metadata.json".Il s'agit d'un fichier JSON qui n'a aucun lien avec le composant "métadonnées de boîte" ci-dessus. This file must contain at least the "provider" key with the provider the box is for. Par exemple, si votre boîte était destinée à VirtualBox, le fichier metadata.json ressemblerait à ceci:

{
  "fournisseur": "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.


Donc, je pense que votre format de fichier de boîte est probablement faux. Soit il n’est pas compressé avec le format recommandé, soit vous n’avez pas inclus de fichier metadata.json dans l’archive.

Chux Uzoeto
la source
Pour les autres personnes ayant le même problème, le chemin d'accès à metadata.json (sous Windows) est ..Utilisateurs \ nom d'utilisateur \ vagrant.d \ boxes \ nom de boîte \ 0 \ virtualbox \ metadata.json
Nebojsac
1

Vous pouvez essayer https://github.com/sparkoo/boxitory . C'est simple, un serveur de jar. Vous le dirigez vers le répertoire où vous avez vos boîtes de vagabond et crée une interface http compatible pour vagabond. Ensuite, il vous suffit de le pointer depuis votre fichier vagrant et vous avez terminé. Vous n'avez pas à gérer manuellement les fichiers JSON décrivant vos boîtes, ajoutant de nouvelles versions, fournisseurs, etc. Tout est fait pour vous gratuitement. Il suffit d’ajouter un nouveau fichier boîte et Boxitory le renvoie instantanément sur demande.

Michal Vala
la source