URL da caixa do Vagrant para o arquivo de metadados JSON

16

No meu Vagrantfile, posso especificar o URL de uma caixa:

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

De acordo com a documentação mais recente , eu deveria ser capaz de criar um arquivo JSON que contenha URLs para diferentes versões da caixa. A documentação também diz que posso usar o URL desse arquivo JSON ao executar vagrant box add . Eu esperava poder usar o URL desse arquivo JSON para config.vm.box_url . No entanto, isso não parece funcionar. Quando eu tento, ele trata como um arquivo de caixa:

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.

É possível dizer ao Vagrant para usar um arquivo JSON de metadados de caixa no meu Vagrantfile? Eu prefiro não ter que usar o Vagrant Cloud.

    
por Brad 29.04.2014 / 22:08

5 respostas

7

A partir de hoje (2016-07-12, vagrant 1.8.4), se você deseja executar seu próprio catálogo de maneira manual (ou seja, atualizar manualmente as caixas e editar o arquivo metadata.json), mas ainda assim se comportar como um catálogo real, lembre-se das seguintes coisas:

  • Não há necessidade de o arquivo ser chamado de "metadata.json". Pode ser nomeado qualquer coisa, contanto que contenha os valores esperados. Estou usando "metadata.json" aqui para esclarecer as etapas abaixo.

  • cada arquivo metadata.json pode conter apenas uma única caixa. Pode ter várias versões e cada versão pode ter vários provedores (virtualbox, vmware, libvirt). Se você precisa ter mais de uma caixa (digamos, "fedora" e "ubuntu"), você precisa de dois arquivos de metadados diferentes.

  • O Vagrant espera que o arquivo metadata.json tenha um tipo de "application / json" (como Nicholas Hinds mencionou acima. Se o seu servidor web não o retorna (ou retorna "text / plain"), vagrant suponha que é um arquivo de caixa real e tente analisá-lo (e falhar miseravelmente).

  • O Atlas do Hashicorp (que costumava ser o Vagrant Cloud) é a exceção, já que os redirecionamentos levam ao conteúdo servido como "text / html". Meu melhor palpite para isso é que tem algo a ver com os redirecionamentos (mais sobre isso abaixo).

  • O arquivo de caixa não precisa estar no mesmo lugar do arquivo de metadados. Você pode ter seu arquivo de metadados em um servidor da Web local e a caixa no Amazon S3, sem problemas com isso.

Então, até onde eu consegui, achei que a maneira mais fácil de fazer isso funcionar em um servidor da web e ainda ter uma funcionalidade normal é fazer isso:

Em seu host da Web, crie uma estrutura de arquivos e diretórios semelhante a esta:

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)

(esse layout significa que o seu "metadata.json" para box1 precisará ter seus URLs apontando para algo como " link < /a>$version1-$provider.box ")

No seu .htaccess, certifique-se de que "metadata.json" esteja definido para o índice do diretório. O resto é opcional, para cache negativo e ocultando o conteúdo real:

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"

Em seu ambiente, exporte o VAGRANT_SERVER_URL apontando para seu host da web. Note sem barra final!

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

Com isso em vigor (e todos os arquivos com o conteúdo correto), você pode adicionar sua caixa diretamente:

vagrant box add yourname/box1

Como "metadata.json" é o arquivo de índice para o diretório box1, ele deve redirecionar o conteúdo diretamente para ele, o vagrant o pegará, interpretará os metadados e baixará a caixa apropriada.

    
por 12.07.2016 / 18:32
19

Depois de ler sua pergunta novamente, parece que você está tentando fazer algo um pouco diferente do que eu - mas acho que nosso objetivo final é o mesmo.

Eu não quero utilizar o serviço Vagrant Cloud para hospedar minhas caixas base, mas quero poder distribuir um ambiente de desenvolvimento para minha equipe de desenvolvimento e utilizar os recursos do arquivo metadata.json para manter um controle de versão sistema para o ambiente de desenvolvimento, que estará então disponível para minha equipe de desenvolvimento simplesmente usando as facilidades embutidas no vagrant.

A documentação do vagrant é realmente escassa nesta área no momento em que escrevo este artigo (8/5/2014), presumivelmente porque é uma característica relativamente nova, mas tenho certeza que o fato de o VagrantCloud ter um nível pago tem algo a ver com isso também.

Para descobrir como utilizar o arquivo metadata.json na versão e distribuir as caixas, dei uma olhada em algumas das VMs disponíveis no VagrantCloud. Depois de examinar e ler alguns dos códigos vagabundos, ficou muito fácil descobrir como realizar meu objetivo.

  • Empacote sua caixa como faria normalmente. No meu caso, estou empacotando apenas para caixa virtual, porque é isso que nossos desenvolvedores estarão usando para executar o Vm. Eu também empacotei um Vagrantfile com meu basebox que faz alguns provisioning para o ambiente de desenvolvimento (configurando compartilhamentos para pastas apropriadas, algumas configurações básicas do apache, registro de erros, etc)
  • Crie um arquivo metadata.json para descrever sua caixa de base. O meu é semelhante a este:

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

Depois que criei meu arquivo metadata.json , fiz o upload dele em um servidor local em execução em nossa rede interna ( vagrant.domain.local/metadata.json ). Depois que fiz isso, tudo o que restou foi testá-lo com o vagrant:

# 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, uma caixa privada hospedada, compartilhada e com versões remotas, que não requer o uso da Nuvem Vagrant.

Ao criar novas versões da sua caixa, você irá empacotá-la e editar o arquivo metadata.json . Pelo que eu posso dizer, você pode usar qualquer esquema de versionamento que você queira, seja versão semântica (1.0.0, 1.0.1, etc) ou apenas números inteiros simples para versões (1, 2, 3, etc). Quando os usuários da sua caixa vagrant up vagrant verificarem automaticamente o seu arquivo metadata.json para uma nova versão, e solicitarão que eles façam vagrant box update para atualizar a caixa.

Você também pode pular os vagrant box add <metadata.json url> e vagrant init bits definindo uma base Vagrantfile com o nome da caixa e o URL da caixa, assim:

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

Você poderia distribuir um Vagrantfile com esses conteúdos, e todos os usuários seriam capazes apenas de vagrant up . No entanto, não tenho certeza de como isso funciona quando as versões são atualizadas.

    
por 05.08.2014 / 19:25
9

O Vagrant exige que os URLs de metadados da caixa sejam exibidos com o tipo de conteúdo application/json . O erro que você está recebendo indica que o vagrant interpretou sua URL como uma caixa normal.

Verifique se o seu servidor HTTP está configurando o cabeçalho Content-Type adequadamente. A maioria dos servidores HTTP configurará automaticamente o Content-Type header para application/json se o arquivo tiver a extensão .json

    
por 28.07.2014 / 08:06
4

Eu acho que você tem suas diretivas misturadas ...

O seguinte é retirado do site da vagabunda:

FICHEIRO DE CAIXA

O arquivo de caixa atual é a parte necessária para o Vagrant. É recomendável que você sempre use um arquivo de metadados ao lado de um arquivo de caixa, mas os arquivos de caixa diretos são suportados por motivos herdados no 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. O próprio núcleo do Vagrant apenas descompacta as caixas para uso posterior.

Within the archive, Vagrant does expect a single file: "metadata.json". Este é um arquivo JSON que não é relacionado ao componente de "metadados de caixa" acima. %código%. Por exemplo, se a sua caixa fosse para o VirtualBox, o metadata.json ficaria assim:

{
  "provider": "virtualbox"
}

This file must contain at least the "provider" key with the provider the box is for

Então, acho que seu formato de arquivo de caixa provavelmente está errado. Ele não é compactado com o formato recomendado ou você não incluiu um arquivo metadata.json no archive

    
por 30.04.2014 / 01:03
1

Você pode tentar o link . É um servidor jar simples. Você aponta para o diretório onde você tem suas caixas de vagabundo e cria interface http compatível para vagrant. Então você simplesmente aponta para o seu arquivo vagante e pronto. Você não precisa manipular manualmente arquivos json descrevendo suas caixas, adicionando novas versões, provedores, etc. Tudo é feito para você de graça. Basta adicionar um novo arquivo de caixa e o Boxitory o devolve instantaneamente quando solicitado.

    
por 24.07.2017 / 12:32

Tags