我将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,但我想在本地试试。
答案 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'!
也许这有助于其他人寻求做同样的工作流程。