Chr*_*son 4 vagrant veewee bento
我正在尝试使用 Bento、Veewee 和 Vagrant 来自动化配置虚拟机的过程。这种方法对于简化开发、开发测试和质量保证流程有很大的希望。
(对于那些没有遇到过这些的人来说——Vagrant 可以轻松地在 Virtual Box、VMWare、EC2 等中快速设置/拆除虚拟机;Veewee 简化了为 Veewee 构建基础盒子的过程;Bento 简化了定义基本框,然后自动化 Veewee 的操作)。
问题是,Bento、Veewee 和 Vagrant 的相互关系令人困惑。许多定义文件和一些操作在各层之间重复,并且不清楚哪一层应该获得特定于我的项目的更新。Ruby 环境也使这个问题变得相当复杂——看起来 Bento 命令都需要从 Bento 目录运行,所以框和其他文件最终会出现在不合逻辑的地方。
谁能建议使用这种工具组合的文件布局和工作流程?
我正在回答我自己的问题以捕捉我的发现。
有一种方法可以让 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”部分以更改虚拟机的磁盘大小、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"
}
Run Code Online (Sandbox Code Playgroud)
请注意,我的自定义脚本全部出现在清理和最小化步骤之前 - 这很重要。
从 Bento/packer 目录中,运行packer build -only=virtualbox centos-6.4-x86_64-CUSTOM.json
. 如果之前尚未下载 VirtualBox 来宾附加组件和基本操作系统的磁盘映像 (ISO),那么现在就可以下载;这些文件很大,因此此步骤可能需要一段时间。
Packer 使用 VirtualBox 创建临时虚拟机,并在其上运行所有指定的脚本。完成此过程后,将使用您在上面指定的 BOXFILE 名称在 Bento/builds/visualbox 目录中捕获 VM 的副本,并且 Packer 会丢弃 VirtualBox VM。
注册您刚刚使用 Vagrant 构建的盒子。使用单独安装的 Vagrant 版本(例如,您可能必须指定 /usr/local/bin/vagrant 或任何适合您操作系统的内容),执行vagrant box add CUSTOM path/to/BOXFILE
. 这会在 ~/ .vagrant.d/boxes/CUSTOM/VirtualBox 中创建一个新的子目录,其中包含 Vagrant 需要从此框定义创建虚拟机的文件。
创建 Vagrant 项目目录并 cd 进入其中。我做到了mkdir ~/test; cd ~/test
。
使用此框初始化 Vagrant 项目:vagrant init CUSTOM
启动虚拟机:vagrant up
连接到虚拟机:vagrant ssh
此时,您正常使用 Vagrant,Bento / Packer 不再参与 - 他们的组合工作只是创建 Basebox,一旦向 Vagrant 注册,Vagrant 就独立了。
还有很多其他有趣的东西值得关注:Vagrant,比如特殊的 vagrant-aws 插件,以及如何将它与 Chef、Puppet 或 Ansible 一起使用......但我将在这里停下来,因为我最初的问题得到了解答。