JSON元数据文件的流浪者URL


18

在我的Vagrantfile中,我可以指定一个框的URL:

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

根据最新文档,我应该能够创建一个JSON文件,其中包含不同版本的Box的URL。该文档还说,我可以在运行时使用此JSON文件的URL vagrant box add。我希望能够将JSON文件的URL用于config.vm.box_url。但是,这似乎不起作用。当我尝试它时,它像一个盒子文件一样对待它:

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.

是否可以告诉Vagrant在我的Vagrantfile中使用盒子元数据JSON文件?我宁愿不必使用Vagrant Cloud。


您是否找到了解决方案?
吉姆·鲁宾斯坦

@JimRubenstein不幸的是,没有。Nicholas的建议可能有用,但是我很确定服务器已经为JSON发送了正确的内容类型标头。Chux的答案可能是准确的,但是由于文档中的暗示,我还没有确信。不幸的是,Vagrant的文档到处都是很糟糕的,并且在基础教程和对项目的贡献以及在IRC上闲逛之间并没有提供太多的上下文信息……至少对我而言。
布拉德

我正在测试一些有关发布框+元数据的内容,以查看我是否可以本地模拟无业游民的云的行为。我会让你知道结果如何。
Jim Rubenstein

Answers:


8

截至今天(2016年7月12日,流浪者1.8.4),如果要手动运行自己的目录(即,手动更新框并编辑metas.json文件),但仍然可以正常运行像实际目录一样,请记住以下几点:

  • 无需将文件命名为“ metadata.json”。只要包含期望值,它就可以命名为任何东西。我在这里使用“ metadata.json”来阐明下面的步骤。

  • 每个meta.json文件只能包含一个框。它可以具有多个版本,每个版本可以具有多个提供程序(virtualbox,vmware,libvirt)。如果需要多个框(例如,“ fedora”和“ ubuntu”),则需要两个不同的元数据文件。

  • Vagrant期望metadata.json文件的类型为“ application / json”(如上面的Nicholas Hinds所述。如果您的网络服务器未返回文件(或返回“ text / plain”),vagrant会假定它是一个实际的盒子文件,并尝试对其进行解析(并失败失败)。

  • Hashicorp的Atlas(以前是Vagrant Cloud)是这种情况的例外,因为重定向会将您带到以“ text / html”形式提供的内容。我对此的最佳猜测是,它与重定向有关(请参见下文)。

  • 盒文件不必与元数据文件放在同一位置。您可以将元数据文件放置在本地Web服务器中,而将其放置在Amazon S3中,则没有问题。

因此,据我所知,我发现最简单的方法可以使它在网络服务器上运行,并且仍然具有相当正常的功能:

在您的虚拟主机上,创建类似于以下内容的文件和目录结构:

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)

(此布局意味着box1的“ metadata.json”必须具有指向诸如“ http:// yourhost / boxes / yourname / box1 / box1- $ version1- $ provider.box”之类的URL ))

在.htaccess上,确保为目录索引设置了“ metadata.json”。其余的是可选的,用于负缓存并隐藏实际内容:

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"

在您的环境中,导出指向您的虚拟主机的VAGRANT_SERVER_URL。注意没有尾部的斜杠!

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

有了它(以及所有具有正确内容的文件),您可以直接添加框:

vagrant box add yourname/box1

由于“ metadata.json”是box1目录的索引文件,因此应将内容直接重定向到该目录,vagrant会选择它,解释元数据并下载适当的box。


19

再次阅读您的问题后,您似乎正在尝试做一些与我不同的事情-但我认为我们的最终目标是相同的。

我不想利用Vagrant Cloud服务托管我的基本盒,但我希望能够向我的开发团队分发开发环境,并利用metadata.json文件的功能来维护开发环境的版本控制系统,然后,只需使用vagrant内置的功能,即可将其提供给我的开发团队。

在撰写本文时(2014年8月5日),流浪汉的文档确实很少,大概是因为这是一个相对较新的功能,但我敢肯定,VagrantCloud具有付费层的事实也与此有关。

为了弄清楚如何利用metadata.json文件进行版本控制和分发,我查看了VagrantCloud上可用的某些VM。在浏览完这些内容并阅读了一些无用的代码之后,就很容易弄清楚如何实现我的目标。

  • 像往常一样包装您的盒子。就我而言,我只包装虚拟盒子,因为这是我们的开发人员将用来运行Vm的东西。我还将一个Vagrantfile打包到我的基盒中,该基盒为开发环境做一些配置(将共享设置到适当的文件夹,一些基本的apache配置,错误记录等)。
  • 创建一个metadata.json描述您的基本框的文件,我的外观类似于以下内容:

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

创建metadata.json文件后,我将其上传到内部网络(vagrant.domain.local/metadata.json)上运行的本地服务器上。一旦我做到了,剩下的就是用流浪汉对其进行测试:

# 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,一个远程托管,共享和版本控制的专用盒,不需要使用Vagrant Cloud。

创建盒子的新版本时,将其打包并编辑metadata.json文件。据我所知,您可以使用所需的任何版本控制方案,即语义版本控制(1.0.0、1.0.1等)或仅是版本的简单整数(1、2、3等)。当您的盒子用户vagrant up流浪汉自动检查您的meta.json文件是否有新版本时,将提示他们vagrant box update进行更新盒子。

您还可以通过使用框名称和框url定义基本Vagrantfile 来跳过vagrant box add <metadata.json url>vagrant init位,如下所示:

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

您可以分发包含这些内容的Vagrantfile,所有用户都可以vagrant up。不过,我不确定这些版本更新后如何工作。


太好了,谢谢!但是...如何将JSON URL添加到Vagrantfile中?
布拉德(Brad)2014年

不用了 添加框时,Vagrant将下载当前框图像并将信息存储在中~/.vagrant.d/boxes/<your box name>。在该文件夹中,有metadata_url一个文档周围引用的文件,其中包含定义您的版本的JSON文件的URL。Vagrant会自动处理所有问题,因此您要做的就是vagrant box add <your metadata.json url>,然后由Vagrant vagrant init <boxname> && vagrant up完成其余工作
Jim Rubenstein 2014年

我理解这一点,但是我正在尝试使开发人员尽可能容易地启动并运行它。通过在Vagrantfile中添加一个框URL,vagrant box add就不需要了。如果我可以在Vagrantfile中设置该JSON文件的URL,那么对于刚加入团队并开始运行的新开发人员来说,这就少了一步。它适用于盒子,但我不知道为什么它不适用于JSON文件。
布拉德(Brad)2014年

1
啊,陷阱-我实际上只是放屁就找到了解决方案。您必须定义config.vm.boxAND,config.vm.box_url其中boxbox的名称box_url是json文件的URL。
Jim Rubenstein 2014年

1
@JimRubenstein很棒的答案-就像Goldilocks一样,不要太短,不要太长:)
Steve Jansen

9

Vagrant要求Box元数据URL随application/json内容类型一起提供。您收到的错误表明流浪者已将您的网址解释为常规框。

确保您的HTTP服务器Content-Type正确设置了标头。如果您的文件具有扩展名,大多数HTTP服务器都会自动将Content-Type 标头设置为application/json.json


1
我不知道为什么您的答复不是答案,因为这正是我要使Vagrant进行本地配置所需要的。
Gaurav 2014年

4

我想你把他们的指令搞混了..

以下内容来自无业游民的网站:


框文件

实际的盒子文件是Vagrant的必需部分。建议您始终在框文件旁边使用元数据文件,但是出于遗留原因,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. Vagrant核心本身仅打开包装盒,以备后用。

Within the archive, Vagrant does expect a single file: "metadata.json".这是一个与上述“框元数据”组件完全无关的JSON文件。This file must contain at least the "provider" key with the provider the box is for。例如,如果您的盒子用于VirtualBox,则metas.json如下所示:

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


因此,我认为您的Box文件格式可能是错误的。要么它没有以推荐的格式压缩,要么您没有在归档文件中包含metadata.json文件


对于其他存在相同问题的用户,metadata.json路径(在Windows中)为..Users \ username \ vagrant.d \ boxes \ boxname \ 0 \ virtualbox \ metadata.json
Nebojsac

1

您可以尝试https://github.com/sparkoo/boxitory。这是一个简单的jar服务器。您将其指向您具有无业游民框的目录,并为无业游民创建兼容的http界面。然后,您只需从vagrantfile中将其指向即可。您不必手动处理描述框的json文件,添加新版本,提供程序等。所有这些操作都是免费的。只需添加新的盒子文件,Boxitory会在收到请求时立即将其返回。

By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.