【问题标题】:How do I set the version of Vagrant box created with VMware Fusion using a `metadata.json` file?如何使用 `metadata.json` 文件设置使用 VMware Fusion 创建的 Vagrant box 的版本?
【发布时间】:2016-06-27 14:03:38
【问题描述】:

我正在将 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,但我想在本地尝试一下。

【问题讨论】:

    标签: vagrant metadata vmware-fusion


    【解决方案1】:

    相信我现在对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 文件或者该文件不包含至少一个“provider”键的有效 JSON,那么 Vagrant 在添加框时会出错,因为它无法验证提供者。

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

    这是第 1 部分(BOX 文件),metadata.json 文件位于 .vmwarevm 目录中。第 2 部分(BOX METADATA)有另一个 metadata.json 文件,其中包含名称、版本、url、校验和和...的键来自文档:

    元数据是 box 的可选组件(但强烈推荐),它支持版本控制、更新、单个文件中的多个提供程序等。

    // 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'!
    

    也许这有助于其他希望执行相同工作流程的人。

    【讨论】:

    • 仅供参考,传递给 vagrant box add 的 json 文件可以有任何你喜欢的名称。
    • 如果可以的话,我会给你另外 10 个 +1 的答案。
    猜你喜欢
    • 2014-05-20
    • 2018-08-10
    • 2012-08-26
    • 1970-01-01
    • 1970-01-01
    • 2014-12-02
    • 2019-05-17
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多