【问题标题】:How to organize a Bento - Veewee - Vagrant project如何组织 Bento - Veewee - Vagrant 项目
【发布时间】:2013-11-01 23:13:00
【问题描述】:

我正在尝试使用 Bento、Veewee 和 Vagrant 来自动化配置 VM 的过程。这种方法在简化开发、开发测试和 QA 流程方面大有希望。

(对于那些没有遇到过这些的人——Vagrant 可以轻松地在 Virtual Box、VMWare、EC2 等中快速设置/拆除虚拟机;Veewee 简化了为 Veewee 构建基础盒的过程;Bento 简化了定义基本盒子然后自动化 Veewee 操作的过程。

问题是,Bento、Veewee 和 Vagrant 的相互关系令人困惑。许多定义文件和一些操作在层之间重复,并且不清楚哪个层应该获得特定于我的项目的更新。 Ruby 环境也使这变得相当复杂——似乎 Bento 命令都需要从 Bento 目录运行,所以盒子和其他文件最终会出现在不合逻辑的地方。

谁能建议使用这种工具组合的文件布局和工作流程?

【问题讨论】:

    标签: vagrant veewee bento


    【解决方案1】:

    我正在回答我自己的问题以记录我的发现。


    有一种方法可以让 Bento、Veewee、Vagrant 和 Ruby 以一种半明智的方式协同工作,但它很复杂。最好使用最新版本的 Bento,用 Packer 工具替换 Veewee。

    Packer 或多或少与 Veewee 一样,但做出了一些重大改进,包括:

    1. 每个 Packer 框定义都在单个 JSON 文件中,该文件引用脚本文件的平面列表——不再是带有符号链接的三层文件;更容易理解,更好地控制源代码。

    2. Packer 二进制文件是操作系统原生的可执行文件(不再使用 Ruby)。您可以通过将它们放在路径上的某个位置来部署它们(例如 Linux 上的 /usr/local/bin)。 Packer 避免了 Ruby 的疯狂。


    这是一个简单的工作流程:

    1. 安装 VirtualBox。安装便当。 Bento 还将安装 Vagrant 作为 Ruby gem;但我们不会使用 Vagrant 的那个实例。使用适用于您的操作系统的本地安装程序单独安装 Vagrant。

    2. 为您的项目选择一个名称以在目录和文件名中使用。 (对于这个例子,我使用“CUSTOM”)。在bento/packer/scripts 目录中创建一个空的子目录。我做了mkdir CUSTOM

    3. 查看 .../bento/packer 中的 .JSON 文件。您可以就地更改一个,或者复制一个并更改它可能更明智。我做了cp centos-6.4-x86_64.json centos-6.4-x86_64-CUSTOM.json

    4. 编辑该文件的“builders”部分以更改 VM 的磁盘大小、RAM 大小、ssh 端口等。

    5. 编辑“provisioners”部分的“output”行,为要创建的 box 文件提供一个有意义的名称。 (对于这个例子,我使用的是“BOXFILE”)。请注意,您可以嵌入 {{timestamp}} 以将 Unix 时间戳添加到文件名 - 有助于使文件名唯一。

    6. 编辑该文件的“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"
    }
    

    请注意,我的自定义脚本都出现在清理和最小化步骤之前——这很重要。

    1. 从bento/packer 目录,运行packer build -only=virtualbox centos-6.4-x86_64-CUSTOM.json。如果之前没有下载 VirtualBox 来宾插件和基本操作系统的磁盘映像 (ISO),那么现在可以下载;这些文件很大,所以这一步可能需要一段时间。

    2. Packer 使用 VirtualBox 创建一个临时 VM,并在其上运行您指定的所有脚本。完成此过程后,使用您在上面指定的 BOXFILE 名称在bento /builds/visualbox 目录中捕获VM 的副本,并且Packer 丢弃VirtualBox VM。

    3. 注册你刚刚用 Vagrant 构建的盒子。使用单独安装的 Vagrant 版本(例如,您可能必须指定 /usr/local/bin/vagrant 或任何适合您的操作系统的内容),执行vagrant box add CUSTOM path/to/BOXFILE。这会在 ~/.vagrant.d/boxs/CUSTOM/VirtualBox 中创建一个新的子目录,其中包含 Vagrant 从该框定义创建虚拟机所需的文件。

    4. 创建一个 Vagrant 项目目录并 cd 进入它。我做了mkdir ~/test; cd ~/test

    5. 使用此框初始化 Vagrant 项目:vagrant init CUSTOM

    6. 启动虚拟机:vagrant up

    7. 连接到虚拟机:vagrant ssh

    此时,您正在正常使用 Vagrant,Bento / Packer 不再参与 - 他们的联合工作只是创建 basebox,一旦向 Vagrant 注册,Vagrant 就独立了。


    还有很多其他有趣的事情要看 re:Vagrant,比如特殊的 vagrant-aws 插件,以及如何将它与 Chef、Puppet 或 Ansible 一起使用......但我会在这里停下来,因为我最初的问题得到了回答.

    【讨论】:

      【解决方案2】:

      听起来您想要应用 Bento、Vagrant 和/或 Veewee 来对盒子进行配置和执行 QA 测试。感谢Chef 背后的人们和社区,已经有一个工具可以完全按照您的意愿去做!

      它叫做test-kitchen。您可以将它与 OpsCode/Chef 维护并使用 Packer 构建的预构建 Chef Bento Boxes 一起使用。如果您只想进行配置/测试,则无需使用 VeeWee 或 Packer 从头构建 Vagrant 盒或 VM 映像。

      Test Kitchen 是一种测试工具,用于在一个或多个平台上执行配置代码(ChefAnsiblePuppetSaltStackBash / Powershell,通过 bootstrap.shbootstrap.ps1)隔离中。它使用驱动插件架构,可让您将其插入各种云提供商和虚拟化技术,例如Amazon EC2Blue BoxCloudStackDigital OceanRackspaceOpenStackVagrant、@987654336 @、LXC containersVMWare VSphereGoogle Compute EngineAzure 等等。还有“busser”测试插件允许对多个测试框架的可插拔支持,包括BatsshUnit2RSpecServerspecShpecToxNose2MiniTest、@ 987654349@、AnsibleSpec,正在创建其他人。

      对于 Chef、Puppet 和 Ansible 工作流程,cookbook 依赖解析器工具(例如 BerkshelfLibrarian-ChefLibrarian-PuppetAnsible GalaxyLibrarian-Ansible)受支持,或者您可以简单地拥有一个 cookbooks/ 目录和测试厨房会知道该怎么做。如果您已经在使用 Chef 社区说明书,Test Kitchen 集成测试已经包含在 MySQL、nginx、Chef Server 和 runit 说明书中。

      它非常灵活,对于您的用例,您可以通过选择正确的 gem 插件集来使其做您想做的事情。因为它来自 Chef 社区,所以您可能会在使用 Chef 食谱、Vagrant 驱动程序以及 ServerSpec 或 Bats 测试插件时获得最佳体验。然而,它本身作为 CI 和 QA 测试工具正在获得牵引力,并带有许多可用的社区插件。

      如果您有兴趣了解其中的内容,只需在 RubyGems 中搜索 kitchen-busser- 以获取更多选项。

      如果您是 Ruby、Chef 或所有这些方面的新手... 一个简单的入门方法是安装 ChefDK,其中包括 test-kitchenknifeBerkshelf 和基本 / Chef.io 支持的测试工具。

      一旦你有了它,如果你喜欢冒险或想要尝试替代的可插入配置器、驱动程序和 busser 插件,你可以将这些中的任何一个安装到 ChefDK Ruby 环境(例如对于 Mac OS X / Unix)使用这些命令:

      $(/opt/chefdk/bin/chef shell-init $(basename $SHELL))
      sudo /opt/chefdk/embedded/bin/gem install $kitchen_plugin_gem_name_here
      

      如果您想试用我为测试 Ansible 剧本/角色而创建的演示存储库,请查看 Ansible TDD

      【讨论】:

      • 我个人讨厌厨师和红宝石,但这是一个很好的答案,尽管如此 +1
      • 每个人都有自己的观点/偏好等...使用哪个工具的偏好没有什么不同。只需将其视为工具箱中的一个选项;-)
      猜你喜欢
      • 2013-05-04
      • 2011-07-06
      • 2021-05-09
      • 1970-01-01
      • 1970-01-01
      • 2012-06-02
      • 2016-04-19
      • 2016-12-20
      • 2012-04-07
      相关资源
      最近更新 更多