我正在回答我自己的问题以记录我的发现。
有一种方法可以让 Bento、Veewee、Vagrant 和 Ruby 以一种半明智的方式协同工作,但它很复杂。最好使用最新版本的 Bento,用 Packer 工具替换 Veewee。
Packer 或多或少与 Veewee 一样,但做出了一些重大改进,包括:
每个 Packer 框定义都在单个 JSON 文件中,该文件引用脚本文件的平面列表——不再是带有符号链接的三层文件;更容易理解,更好地控制源代码。
Packer 二进制文件是操作系统原生的可执行文件(不再使用 Ruby)。您可以通过将它们放在路径上的某个位置来部署它们(例如 Linux 上的 /usr/local/bin)。 Packer 避免了 Ruby 的疯狂。
这是一个简单的工作流程:
安装 VirtualBox。安装便当。 Bento 还将安装 Vagrant 作为 Ruby gem;但我们不会使用 Vagrant 的那个实例。使用适用于您的操作系统的本地安装程序单独安装 Vagrant。
为您的项目选择一个名称以在目录和文件名中使用。 (对于这个例子,我使用“CUSTOM”)。在bento/packer/scripts 目录中创建一个空的子目录。我做了mkdir CUSTOM。
查看 .../bento/packer 中的 .JSON 文件。您可以就地更改一个,或者复制一个并更改它可能更明智。我做了cp centos-6.4-x86_64.json centos-6.4-x86_64-CUSTOM.json。
编辑该文件的“builders”部分以更改 VM 的磁盘大小、RAM 大小、ssh 端口等。
编辑“provisioners”部分的“output”行,为要创建的 box 文件提供一个有意义的名称。 (对于这个例子,我使用的是“BOXFILE”)。请注意,您可以嵌入 {{timestamp}} 以将 Unix 时间戳添加到文件名 - 有助于使文件名唯一。
编辑该文件的“provisioners”部分以引用您希望在 Packer 构建序列中运行的任何脚本(按顺序)。这通常是 Packer 已经提供的脚本以及您为自定义目的构建的任何其他脚本的组合。
我使用的方法是这样的:
"provisioners": [
{
"execute_command": "echo 'vagrant' | {{.Vars}} sudo -S -E bash '{{.Path}}'",
"scripts": [
"scripts/common/sshd.sh",
"scripts/common/vagrant.sh",
"scripts/common/vmtools.sh",
"scripts/CUSTOM/reso_1024x768.sh",
"scripts/CUSTOM/prompt_cwd.sh",
"scripts/CUSTOM/standard_dirs.sh",
"scripts/CUSTOM/standard_utils.sh",
"scripts/CUSTOM/python27.sh",
"scripts/CUSTOM/supervisord.sh",
"scripts/CUSTOM/ruby.sh",
"scripts/centos/cleanup.sh",
"scripts/common/minimize.sh"
],
"type": "shell"
}
请注意,我的自定义脚本都出现在清理和最小化步骤之前——这很重要。
从bento/packer 目录,运行packer build -only=virtualbox centos-6.4-x86_64-CUSTOM.json。如果之前没有下载 VirtualBox 来宾插件和基本操作系统的磁盘映像 (ISO),那么现在可以下载;这些文件很大,所以这一步可能需要一段时间。
Packer 使用 VirtualBox 创建一个临时 VM,并在其上运行您指定的所有脚本。完成此过程后,使用您在上面指定的 BOXFILE 名称在bento /builds/visualbox 目录中捕获VM 的副本,并且Packer 丢弃VirtualBox VM。
注册你刚刚用 Vagrant 构建的盒子。使用单独安装的 Vagrant 版本(例如,您可能必须指定 /usr/local/bin/vagrant 或任何适合您的操作系统的内容),执行vagrant box add CUSTOM path/to/BOXFILE。这会在 ~/.vagrant.d/boxs/CUSTOM/VirtualBox 中创建一个新的子目录,其中包含 Vagrant 从该框定义创建虚拟机所需的文件。
创建一个 Vagrant 项目目录并 cd 进入它。我做了mkdir ~/test; cd ~/test。
使用此框初始化 Vagrant 项目:vagrant init CUSTOM
启动虚拟机:vagrant up
连接到虚拟机:vagrant ssh
此时,您正在正常使用 Vagrant,Bento / Packer 不再参与 - 他们的联合工作只是创建 basebox,一旦向 Vagrant 注册,Vagrant 就独立了。
还有很多其他有趣的事情要看 re:Vagrant,比如特殊的 vagrant-aws 插件,以及如何将它与 Chef、Puppet 或 Ansible 一起使用......但我会在这里停下来,因为我最初的问题得到了回答.