如何使用`metadata.json`文件设置使用VMware Fusion创建的Vagrant框的版本?

时间:2016-06-27 14:03:39

标签: vagrant metadata vmware-fusion

我将Vagrant用于虚拟机,并希望开始创建自己的基本框以尝试匹配生产环境。

我使用VMware Fusion Pro 8.1.1创建了一个普通的Debian基本框,我已经add这个框了,但是我想开始使用这个框metadata.json用于设置版本号。我在vagrant doc中读到唯一必需的密钥是"provider",这很有效,但当我vagrant box list时,我得到了v0

work-debian7-11-64              (vmware_fusion, 0)

当我删除以使用更新的metadata.json文件再次尝试时,我可以看到它。

$ vagrant box remove work-debian7-11-64
Removing box 'work-debian7-11-64' (v0) with provider 'vmware_fusion'...

如果我按照文档操作并使用"version":"0.1.0"之类的内容:

{
  "name": "hashicorp/precise64",
  "description": "This box contains Ubuntu 12.04 LTS 64-bit.",
  "versions": [
    {
      "version": "0.1.0",
      "providers": [
        {
          "name": "virtualbox",
          "url": "http://somewhere.com/precise64_010_virtualbox.box",
          "checksum_type": "sha1",
          "checksum": "foo"
        }
      ]
    }
  ]
}

当我转到add框时,我最终收到了错误消息。这是一些输出(它继续提供from

的更多细节
$ vagrant box add work-debian7-11-64 debian-7.11-64.vmware.box
==> box: Box file was not detected as metadata. Adding it directly...
==> box: Adding box 'work-debian7-11-64' (v0) for provider: 
    box: Unpacking necessary files from: file:///Users/dave/Code/code_resources/vagrant_examples/vagrant-bird-box-vmware-debian-nodesktop/debian-7.11-64.vmware.box
/opt/vagrant/embedded/gems/gems/vagrant-1.8.4/lib/vagrant/box_collection.rb:155:in `block (3 levels) in add': undefined method `to_sym' for nil:NilClass (NoMethodError)

这是我的metadata.json文件:

{
  "name": "workalicious/debian7-11-64",
  "description": "Debian 7.11.0 64-bit web server.",
  "versions": [{
    "version": "0.1.0",
    "providers": [{
        "name": "vmware_fusion"
        }]
    }]
}

我想知道我是否对metadata.json的格式做错了?当我仅使用provider密钥box add时,可以正常工作。我知道有Altas和Packer,但我想在本地试试。

1 个答案:

答案 0 :(得分:4)

我认为,在阅读Vagrant doc非常缓慢之后,我现在有了更好的理解。

我应该在.box中包含一个至少包含提供者的metadata.json文件,这是必需的。

  

在存档中,Vagrant确实需要一个文件:metadata.json。这是一个与上述框目录元数据组件完全无关的JSON文件;每个盒子文件只有一个metadata.json(在盒子文件中),而一个目录元数据JSON文档可以描述同一个盒子的多个版本,可能跨越多个提供者。

     

metadata.json必须至少包含"提供商"密钥与提供者的框用于。 Vagrant使用它来验证盒子的提供者。例如,如果您的框用于VirtualBox,则metadata.json将如下所示:

// metadata.json inside of WorkaliciousDebian7-64-nogui.vmwarevm
{
  "provider": "vmware_fusion"
}
  

如果没有metadata.json文件,或者该文件不包含至少有"提供商的有效JSON"键,然后Vagrant在添加框时会出错,因为它无法验证提供程序。

     

其他键/值可以毫无问题地添加到元数据中。元数据文件的值不透明地传递给Vagrant,插件可以使用它。此时,Vagrant核心不使用此文件中的任何其他键。

metadata.json目录中的第1部分(BOX FILE),.vmwarevm文件。第2部分(BOX METADATA)有另一个metadata.json文件,其中包含名称,版本,URL,校验和和...的密钥。来自doc:

  

元数据是一个盒子的可选组件(但强烈推荐),它允许从单个文件中进行版本控制,更新,多个提供程序等。

// get the checksum
$ md5 debian-7.11-64.vmware.box 
MD5 (debian-7.11-64.vmware.box) = f1a2b7982031a1e53c1e39011f8d5f37

// metadata.json file used with the vagrant box add
{
  "name": "workalicious/debian71164",
  "description": "Debian 7.11.0 64-bit web server.",
  "versions": [
    {
      "version": "0.1.0",
      "providers": [
        {
          "name": "vmware_fusion",
          "url": "file:///Users/dave/Code/code_resources/vagrant_examples/vagrant-bird-box-vmware-debian-nodesktop/debian-7.11-64.vmware.box",
          "checksum_type": "md5",
          "checksum": "f1a2b7982031a1e53c1e39011f8d5f37"
        }
      ]
    }
  ]
}

现在可以在metadata.json期间引用一个vagrant box add框。

$ vagrant box add metadata.json --provider vmware_fusion
==> box: Loading metadata for box 'metadata.json'
    box: URL: file:///Users/dave/Code/code_resources/vagrant_examples/vagrant-bird-box-vmware-debian-nodesktop/metadata.json
==> box: Adding box 'workalicious/debian71164' (v0.1.0) for provider: vmware_fusion
    box: Unpacking necessary files from: file:///Users/dave/Code/code_resources/vagrant_examples/vagrant-bird-box-vmware-debian-nodesktop/debian-7.11-64.vmware.box
    box: Calculating and comparing box checksum...
==> box: Successfully added box 'workalicious/debian71164' (v0.1.0) for 'vmware_fusion'!

也许这有助于其他人寻求做同样的工作流程。