为什么我应该使用 Vagrant 而不是 VirtualBox?

Joh*_*unt 254 virtualbox vagrant

我多年来一直在使用 VirtualBox 来创建开发环境。

我的很多同事都在谈论 Vagrant,很多人似乎对它非常兴奋,但我似乎无法掌握它的好处..在我看来,这是一系列新命令需要学习才能做到这一点我用 Virtualbox 做的事情。

使用VirtualBox,我完美地安装和配置了一个环境,然后我可以将其打包为OVA或其他任何内容并与其他办公用户共享。如果出现问题,您可以在 VirtualBox 中拍摄快照。

Puppet 和 Chef 并不是 Vagrant 的一部分,他们是自己的东西,对吧?

所以是的,Vagrant 比 VirtualBox 本身有什么好处?

Ada*_*ns 169

这是一个很大的问题,所以我将把它分成三个部分。

流浪汉

Vagrant 用于通过以下方式设置一台或多台虚拟机:

  • 导入预制图像(称为“框”)
  • 设置 VM 特定的设置(IP 地址、主机名、端口转发、内存等)
  • 运行 Puppet 或 Chef 等配置软件

请注意,它不会在加载 VM 和设置 VirtualBox 设置之后安装软件或设置机器。将其视为 VirtualBox 的脚本引擎。

以下是我所看到的使用 Vagrant 而不是 VirtualBox 的一些原因。

1. 轻松设置多虚拟机网络

我读过的大多数 Vagrant 高级用户内容都是关于同时设置多个 VM。Vagrant 为您提供了一个单独的配置文件来设置这些,使您能够使用一个命令启动所有这些。

假设您已将三个 VM 配置为使用 192.168.1.* 子网上的静态 IP 彼此联网。您发现自己所在的位置已经在使用该子网来分发 IP 地址,并且您的 VM 现在发生冲突。使用 Vagrant,您可以简单地编辑 Vagrantfile 并重新加载 VM,而使用 VirtualBox,如果不启动每个 VM 并在内部更改它们,则必须打开每个 VM 的设置。

2. 源代码控制

通过将设置放在文本文件中,可以将配置置于源代码控制之下。上周做了一些改动,不小心弄坏了图片?只需还原更改并重新加载 VM。您可以使用 VirtualBox 快照来完成此操作,但它会占用比 Vagrantfile 多得多的空间。

3. 各种平台

在诸如http://vagrantbox.es 之类的站点上有大量可用的框。这使您可以尝试各种操作系统或发行版,应用相同的配置来设置类似的环境。这有助于测试或添加对新平台的支持,并且仅使用 VirtualBox 会很耗时。

使用配置软件以及使用映像快照有很多争论。如需更多讨论,我将向您推荐 Stephen Nelson-Smith 的优秀文章How to Build 100 Web Servers in a Day

  • 尽管如此,我还是不明白为什么我应该在开发环境中使用 vagrant!因为,它很昂贵(如果你想使用 VMWare!)我们可以准备一个虚拟机,比如 vagrant 使用的基本盒子,然后由 VMware 克隆以设置另一个虚拟机。首先,我们可以通过 VMware 提供的 `vmrun` 命令控制所有虚拟机设置,甚至 IP 地址更改或在来宾机器内运行脚本! (8认同)
  • @OğuzÇelikdemir 这是一个公平的观点。Vagrant 只是为 VMWare 提供了一个更简单的前端,用于启动新机器。在幕后,它使用 `vmrun` 来控制它。我一直使用 VirtualBox,因此对 VMWare 后端没有任何经验。 (3认同)
  • @AdamLucens,感谢您的详细评论。你提到的听起来很有趣..但我想知道你是否知道“VboxManage”命令? https://www.virtualbox.org/manual/ch08.html 几乎您提到的所有内容都可以通过将特定的 ip/参数传递给 `vboxmanage controlvm` 或 shell 脚本中的类似命令来创建为脚本,然后进行版本控制那么……那么“vagrant”是如何比“virtualbox”改进的呢? (2认同)

ico*_*ast 30

除了 Adam 给出的出色答案之外,Vagrant 还将所有内容联系在一起。尽管 Chef 和 Puppet(以及 Salt 和 shell 脚本以及您想使用的任何其他配置程序)是独立的东西,但 Vagrant 将它们联系在一起并使其仅使用vagrant up.

那个命令会

  1. 如果只需要启动虚拟机就可以了,但它也会
  2. 如果还没有完成,请从您指定的基础框创建盒子,但如果您的机器上甚至没有基础框,它将首先
  3. 从它的 URL 中获取它并将其下载到您的机器上。

你不必考虑所有这些。假设您要切换到一个由同事发起的不同项目。您只需从您的存储库中检出代码,然后运行vagrant up,无需担心下载 ISO 或安装任何东西,或者想知道您需要为该特定客户端使用哪个发行版的哪个版本,或者您是否拥有已经拥有一切的 VM 副本你需要。

您甚至无需担心他们是使用 Chef 或 Puppet 还是仅使用 shell 脚本进行设置。(好吧,所以你可能需要做一个bundle install或以其他方式确保你已经安装了所有东西,但仍然没什么大不了的。)

通过将所有内容联系在一起,并为其提供统一的界面,它可以使除最简单的用例之外的所有用例变得更加容易。一开始你可能会觉得你只是在重新学习一种新的方法来做你已经在做的事情,但是一旦你深入了解 Vagrant 的使用,你会发现你可以用更少的努力做更多的事情。这将是非常值得的初始时间投资。

  • 但是,对于我来说,向开发人员发送一个预置的 VM 映像要比安装 vagrant、学习如何使用它并处理出现的任何无数问题要容易和快捷得多,尤其是在支持窗框。我也真的不明白。似乎只是粉丝。 (11认同)
  • 如今,安装 Vagrant 非常容易。任何无法安装它的人都不可能被信任编写代码。在开发人员检查的源代码中包含 Vagrantfile 实际上比发送 VM 容易得多。Vagrantfile 定义了设置,包括从中下载基本 VM(然后配置)的 URL。如果您最初不需要进行配置更改,那么您已准备就绪。但是在您处理项目时,您可能需要进行更改。在你的 Vagrantfile 中这样做。 (7认同)
  • 由于您将 Vagrantfile 与代码一起保存,因此所有加入该项目的开发人员都会自动获得您对 VM 所做的更改,因为您是在 Vagrantfile 中进行更改的。配置你的 Vagrantfile 并不困难。如果您发现 Chef 和 Puppet 太过分了(它们通常如此),则可以使用 shell 配置。如果您可以在 VM 中输入 shell 命令,那么在 Vagrantfile 中设置 shell 配置命令是一个小障碍。从长远来看,这将需要一些小的前期工作,并为您省去很多麻烦。 (6认同)
  • 这里的讨论实际上是关于过早优化。**如果你不需要它,不要使用 vagrant。当您发现创建 VM 变得乏味时,请使用 vagrant。** (6认同)
  • 当您需要更改所有 50 台计算机上的某些内容时? (5认同)
  • 我又花了 4 个小时试图通过 Vagrant 启动并运行 android-dev VM,但没有成功(它不会安装 Android SDK)。然后我找到了一个 virtualbox 图像,瞧!10 分钟内启动并运行,计算下载 2 GB 所需的 8 分钟。我坚持我差不多两年前的话! (4认同)
  • @hopeseekr 我也在想这个。我一直在阅读,试图看到好处。我想我终于明白了。我一直在阅读一本关于 Python 网络的书。测试是一个复杂的设置,模仿您可以用来学习的机器。你可以用 Linux 构建一个虚拟机,手工完成,我是一个人,所以没关系。我在 Windows 上安装了 Vagrant 并输入了三个 Vagrant 命令来调用他的图像以在 VirtualBox 上使用。如果我有 50 台 PC 会怎样?使用快照进行设置的时间很长。如果有变化怎么办?50个更新?对我来说,我无需设置一切即可立即开始工作。 (3认同)
  • 因此,如果我在 A 上失败,但在 B 上成功,我可以得出结论 B 更好吗?那里根本没有逻辑。如果你不需要 Vagrant 提供的好处,或者没有耐心或能力让它工作,那么不要使用它。但这并不意味着_不_使用它对每个人来说都是更好的方法。此外,您可以使用 VirtualBox 镜像作为 Vagrant 的基础镜像。它们是***不相互排斥的***。 (2认同)

小智 10

这里还有两个开发人员用例,它们简化了 vagrant(在“普通”VirtualBox 上)。我没有看到在之前的答案中专门提到了这些用例。

  1. Vagrant 有助于使开发和生产平台尽可能彼此靠近。在理想情况下,您将使用用于配置 Vagrant VM 的相同脚本来配置生产环境,从而最大限度地减少部署时的意外情况。

  2. 集成测试和持续集成:Vagrant 很容易从测试中控制,因此在进行测试运行时,可以通过 Jenkins 等工具轻松控制整个多机堆栈。

是的,“普通”VirtualBox 也可以在这里使用——但是 vagrant 使用的约定使得设置这些场景变得更加简单。

  • 更确切地说,Vagrant 可以被认为是一种虚拟定义语言,它可以描述虚拟机的特征——无论它是托管在 VirtualBox、VMware、Parallels 还是你所拥有的下。看看 Vagrant 如何不是与 VirtualBox“竞争”,而是与它一起工作,或者超越它。 (6认同)

小智 9

将 Chef 或 Puppet 与 VM 配置集成的能力是关键。大多数 Vagrant 用户会告诉你,他们运行 'vagrant provision' 并且偶尔运行 'vagrant reload' 比 'vagrant up' 或 'vagrant destroy' 更频繁。这些任务表明真正的工作不是启动/关闭虚拟机,而是事后“管理”它们。

提出一个更好的问题(无论如何由熟练的 Chef 用户提出)可能是为什么使用 Vagrant 而不是 Knife 与适当的插件(稍后将使用 virtualbox 插件)?例如,将存储在数据包中的参数值传递给刀插件比处理一个巨大的 Vagrantfile 更智能、更灵活和更易于管理。我通常在厨师数据包中定义我的“动态”资源,例如 CPU 数量、内存量、要部署的操作系统、主机名、IP、路由等,这样我就不需要不断更改我的食谱;- )。通过 Chef Web 界面编辑数据包是一项非常简单的数据输入任务,我可以交给最初级的操作员。使用 Vagrantfile,你永远修改代码,不管你信不信 - 代码中断 - 这几乎可以保证你不会将简单的更改交给操作人员,

除了knife还没有virtualbox插件(尽管我设想在不久的将来会有一个插件),大多数“企业”虚拟化产品已经有了插件,包括vmware、xenserver和几乎所有主要的“云”供应商,以及。这意味着如果/当您准备好超越 virtualbox 时,knife 远优于 Vagrant 提供的产品。目前,Chef 社区似乎很乐意让 virtualbox 用户与 Vagrant 一起跛行,因为没有为 Knife 插件集成 virtualbox api。有一个 Knife-vagrant 插件允许使用数据包来传递参数。但是,它仍然需要 vagrant 软件并且它是一个整体的 Vagrantfile 才能运行。

所以,我会毫不犹豫地说 Vagrant 绝对不比带刀的厨师“更好”;但如果您坚持使用 virtualbox 并且可能比使用数据包管理厨师“更容易”,则有必要(目前),前提是您有一个相当简单的环境来管理。