Vagrant box URL per il file di metadati JSON


18

Nel mio Vagrantfile, posso specificare l'URL di una casella:

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

Secondo la documentazione più recente , dovrei essere in grado di creare un file JSON che contiene gli URL per le diverse versioni della scatola. La documentazione dice anche che posso usare l'URL di questo file JSON durante l'esecuzione vagrant box add. Speravo di poter usare l'URL di quel file JSON per config.vm.box_url. Tuttavia, ciò non sembra funzionare. Quando lo provo, lo tratta come un file box:

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.

È possibile dire a Vagrant di utilizzare un file JSON di metadati nel mio Vagrantfile? Preferirei non dover usare Vagrant Cloud.


Hai mai trovato una soluzione per questo?
Jim Rubenstein,

@JimRubenstein Purtroppo no. Il suggerimento di Nicholas potrebbe funzionare, ma sono abbastanza sicuro che il mio server stia già inviando le intestazioni corrette del tipo di contenuto per JSON. La risposta di Chux potrebbe essere accurata, ma non sono ancora convinto poiché la documentazione implica diversamente. Sfortunatamente, la documentazione di Vagrant è abbastanza terribile dappertutto e non fornisce molto contesto tra il tutorial di base e il contributo ai livelli di progetto-e-hang-out-on-irc .... almeno per me.
Brad

sto testando qualcosa mentre parliamo sulla pubblicazione di un box + metadati per vedere se riesco a simulare il comportamento del cloud vagabondo, localmente. ti farò sapere come andrà a finire.
Jim Rubenstein,

Risposte:


8

A partire da oggi (12/07/2016, vagrant 1.8.4), se si desidera eseguire il proprio catalogo in modo manuale (ovvero, aggiornare manualmente le caselle e modificare il file metadata.json), ma farlo funzionare ancora come un vero catalogo, tieni presente quanto segue:

  • Non è necessario che il file sia denominato "metadata.json". Può essere chiamato con qualsiasi nome, purché contenga i valori previsti. Sto usando "metadata.json" qui per chiarire i passaggi più avanti.

  • ogni file metadata.json può contenere solo una singola casella. Può avere più versioni e ogni versione può avere più provider (virtualbox, vmware, libvirt). Se devi avere più di una casella (ad esempio "fedora" e "ubuntu") hai bisogno di due diversi file di metadati.

  • Vagrant prevede che il file metadata.json abbia un tipo di "application / json" (come indicato sopra da Nicholas Hinds. Se il tuo server web non lo restituisce (o, restituisce "text / plain"), Vagrant supporrà che sia un file box effettivo e prova ad analizzarlo (e fallisci miseramente).

  • L'atlante di Hashicorp (quello che era Vagrant Cloud) è l'eccezione a questo, poiché i reindirizzamenti ti portano a contenuti serviti come "text / html". La mia ipotesi migliore per questo è che ha qualcosa a che fare con i reindirizzamenti (più su questo sotto).

  • Il file box non deve trovarsi nella stessa posizione del file metadata. Puoi avere il tuo file di metadati in un server web locale e la scatola in Amazon S3, nessun problema.

Quindi, per quanto ho ottenuto, ho trovato il modo più semplice per farlo funzionare su un server web e avere ancora funzionalità abbastanza normale è quello di fare questo:

Sul tuo host web, crea una struttura di file e directory simile a questa:

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)

(questo layout significa che il tuo "metadata.json" per box1 dovrà avere i suoi URL che puntano a qualcosa come " http: // tuohost / box / tuonome / box1 / box1- $ version1- $ provider.box")

Sul tuo .htaccess, assicurati che "metadata.json" sia impostato per l'indice di directory. Il resto è facoltativo, per cache negativa e nascondere i contenuti effettivi:

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"

Nel tuo ambiente, esporta VAGRANT_SERVER_URL che punta al tuo host web. Nota nessuna barra finale!

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

Con questo in atto (e tutti i file con il contenuto corretto), puoi andare e aggiungere direttamente la tua scatola:

vagrant box add yourname/box1

Poiché "metadata.json" è il file indice per la directory box1, dovrebbe reindirizzare i contenuti direttamente ad esso, Vagrant lo raccoglierà, interpreterà i metadati e scaricherà la casella appropriata.


19

Dopo aver letto di nuovo la tua domanda, sembra che tu stia cercando di fare qualcosa di leggermente diverso da me, ma penso che il nostro obiettivo finale sia lo stesso.

Non voglio utilizzare il servizio Vagrant Cloud per ospitare i miei box di base, ma voglio essere in grado di distribuire un ambiente di sviluppo al mio team di sviluppo e utilizzare le funzionalità del metadata.jsonfile per mantenere un sistema di versioning per l'ambiente di sviluppo, che sarà quindi disponibile per il mio team di sviluppo semplicemente usando le strutture integrate nel vagabondo.

La documentazione del vagabondo è davvero scarsa in questo settore al momento della stesura di questo (8/5/2014), presumibilmente perché è una funzionalità relativamente nuova ma sono sicuro che il fatto che VagrantCloud abbia un livello a pagamento ha qualcosa a che fare con esso .

Per capire come utilizzare il metadata.jsonfile nella versione e distribuire le scatole, ho dato un'occhiata ad alcune delle VM disponibili su VagrantCloud. Dopo aver esaminato quelli e letto alcuni dei codici vagabondi, è diventato abbastanza facile capire come raggiungere il mio obiettivo.

  • Imballa la scatola come faresti normalmente. Nel mio caso, sto impacchettando solo per la scatola virtuale, perché è quello che i nostri sviluppatori useranno per eseguire il Vm. Pacco anche un Vagrantfile con la mia basebox che esegue il provisioning per l'ambiente di sviluppo (impostazione delle condivisioni su cartelle appropriate, alcune configurazioni di base di Apache, registrazione degli errori, ecc.)
  • Crea un metadata.jsonfile per descrivere la tua casella di base, la mia è simile a questa:

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

Una volta creato il mio metadata.jsonfile, l'ho caricato su un server locale in esecuzione sulla nostra rete interna ( vagrant.domain.local/metadata.json). Una volta che l'ho fatto, tutto ciò che mi restava era di provarlo con il vagabondo:

# 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, un box privato ospitato in remoto, condiviso e con versione, che non richiede l'utilizzo di Vagrant Cloud.

Mentre crei nuove versioni della tua scatola, la impacchetterai e modificherai il metadata.jsonfile. Da quello che posso dire, puoi usare qualsiasi schema di versioning tu voglia sia che si tratti di versioning semantico (1.0.0, 1.0.1, ecc.) O solo numeri interi semplici per le versioni (1, 2, 3, ecc.). Quando gli utenti del tuo box vagrant upvagrant controlla automaticamente il tuo file metadata.json per una nuova versione, e chiederà loro di fare vagrant box updateper aggiornare il box.

Puoi anche saltare i bit vagrant box add <metadata.json url>e vagrant initdefinendo un Vagrantfile di base con il nome della casella e l'URL della casella, in questo modo:

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

È possibile distribuire un file Vagrant con tali contenuti e tutti gli utenti sarebbero in grado di farlo vagrant up. Tuttavia, non sono sicuro di come funzioni quando le versioni vengono aggiornate.


Perfetto, grazie! Tuttavia ... come posso aggiungere l'URL JSON al file Vagrant?
Brad

Non è necessario. Quando aggiungi la casella, Vagrant scarica l'immagine della casella corrente e archivia le informazioni ~/.vagrant.d/boxes/<your box name>. All'interno di quella cartella c'è il metadata_urlfile a cui fa riferimento la documentazione, che contiene l'URL per il tuo file JSON che definisce le tue versioni. Vagrant gestisce tutto ciò automaticamente, quindi tutto quello che devi fare è vagrant box add <your metadata.json url>, quindi vagrant init <boxname> && vagrant up, solo Vagrant fa il resto
Jim Rubenstein,

Lo capisco, ma sto cercando di rendere il più semplice possibile per gli sviluppatori iniziare a funzionare. Aggiungendo un URL casella nel file Vagrant, non vagrant box addè necessario. Se potessi impostare l'URL di quel file JSON nel Vagrantfile, questo è un passo in meno per un nuovo sviluppatore che si unisce al team per mettersi in moto. Funziona con i box, ma non riesco a capire perché non funziona per il file JSON.
Brad

1
ah, gotcha - in realtà ho appena trovato una soluzione semplicemente scorrazzando. devi definire config.vm.boxAND config.vm.box_urldove si boxtrova il nome della tua casella ed box_urlè l'URL del tuo file json.
Jim Rubenstein,

1
@JimRubenstein Risposta fantastica - proprio come i riccioli d'oro, non troppo corti, non troppo lunghi :)
Steve Jansen,

9

Vagrant richiede che gli URL dei metadati della casella vengano pubblicati con il application/jsontipo di contenuto. L'errore che stai ricevendo indica che Vagrant ha interpretato il tuo URL come una normale casella.

Assicurarsi che il server HTTP stia impostando l' Content-Typeintestazione in modo appropriato. La maggior parte dei server HTTP imposterà automaticamente l' Content-Type intestazione su application/jsonse il tuo file ha l'estensione.json


1
Non so perché la tua risposta non sia la risposta perché è esattamente quello che dovevo fare per far funzionare il provisioning locale con Vagrant.
Gaurav,

4

Penso che tu abbia confuso le loro direttive ..

Quanto segue è tratto dal sito web del vagabondo:


SCATOLA DI DOCUMENTI

Il file box effettivo è la parte richiesta per Vagrant. Si consiglia di utilizzare sempre un file di metadati insieme a un file box, ma i file box diretti sono supportati per motivi legacy in 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. Il nucleo Vagrant stesso disimballa le scatole per un uso successivo.

Within the archive, Vagrant does expect a single file: "metadata.json".Questo è un file JSON completamente estraneo al componente "box metadata" sopra riportato. This file must contain at least the "provider" key with the provider the box is for. Ad esempio, se la casella fosse per VirtualBox, metadata.json sarebbe simile al seguente:

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


Quindi, penso che il formato del tuo file box sia probabilmente sbagliato. Non è compresso con il formato consigliato o non è stato incluso un file metadata.json nell'archivio


Per altri con lo stesso problema, il percorso metadata.json (in Windows) è ..Users \ username \ vagrant.d \ boxes \ boxname \ 0 \ virtualbox \ metadata.json
Nebojsac

1

Puoi provare https://github.com/sparkoo/boxitory . È semplice un server jar. Lo punti nella directory in cui hai le tue caselle Vagrant e crea un'interfaccia http compatibile per Vagrant. Quindi lo punti semplicemente dal tuo file vagabondo e il gioco è fatto. Non devi gestire manualmente i file json che descrivono le tue caselle, aggiungendo nuove versioni, provider, ecc. È tutto fatto per te gratuitamente. Basta aggiungere un nuovo file box e Boxitory lo restituisce immediatamente quando richiesto.

Utilizzando il nostro sito, riconosci di aver letto e compreso le nostre Informativa sui cookie e Informativa sulla privacy.
Licensed under cc by-sa 3.0 with attribution required.