Vagrant 简化版
我承认,有些工具让我感到困惑。我知道它们一定很棒,因为程序不会因为愚蠢而流行(好吧,真人秀电视节目除外,那是另一回事)。我对 Vagrant 的困惑程度与我对 Wine、Docker、Chef 和无数其他令人惊叹的工具的困惑程度相同,人们 постоянно 对这些工具赞不绝口。因此,在本文中,我将把 Vagrant 分解成最简单的形式。
不要误会我的意思,我可以按照教程进行操作,并通过输入神奇的 vagrant up
命令来运行虚拟机。但问题是,当涉及到计算机时,我真的不喜欢魔法。我想知道正在发生什么,为什么会发生,以及在出现问题时在哪里查找。最终,我的目标是能够在它崩溃时修复它。如果不了解事情的真正运作方式,当魔法按钮停止工作时,就会变得非常可怕。
简单来说,Vagrant 是底层虚拟化程序的前端。默认情况下,后端程序是 VirtualBox,尽管 Vagrant 可以与其他底层虚拟化系统一起工作。这个认识对我来说很重要,因为 VirtualBox 内部必须有什么以及 Vagrant 实际上独立完成什么之间的界限是模糊的。如果您使用 Vagrant,您永远不需要启动 VirtualBox——真的。如果您启动它,也不会有任何坏处,但 Vagrant 将 VirtualBox 更多地用作工具而不是系统。
另一个重要的原因是,这意味着 Vagrant 和 VirtualBox 之间没有相互依赖的关系。我的意思是,您可以将您的 Vagrantfiles 带到另一台计算机,它仍然可以正常工作。它只是会使用您在新计算机上安装的 VirtualBox 副本,并且工作方式完全相同。
何时使用 Vagrant 才合理?就像用发刷刷牙没什么意义一样,使用 Vagrant 来设置您的永久数据中心可能不是最好的主意。当然,您可以使用它,但 Vagrant 真正擅长的是非常快速地构建虚拟机,并在您完成时销毁它们。事实上,大多数人使用 Vagrant 是为了以下两种目的之一:创建开发环境来测试他们的代码,以及在工作负载需要时按需创建临时服务器。
使用 Vagrant 的一个好的副作用是,它迫使您将持久数据视为与服务器分离。我发现,即使在我不使用 Vagrant 的情况下,我现在也更聪明地确保我的数据不依赖于单点故障。我的 /usr/local/bin 文件夹就是一个例子。我的大多数机器都有大量我编写的小脚本,这些脚本都位于 /usr/local/bin 文件夹中。自从我开始使用 Vagrant 以来,我将我的脚本视为应该可以被我的机器访问的东西,但可能不存储在服务器上的本地文件空间中。当然,我有备份,但是如果我可以将我的数据与我的服务器文件系统分开,那么迁移到新服务器就容易得多。
它实际上做了什么我已经提到 Vagrant 是 VirtualBox 的前端。当然,VirtualBox 已经有一个命令行界面,但 Vagrant 功能更强大。Vagrant 不是安装操作系统,而是采用完全安装的机器的“模板”并创建克隆。这意味着您可以在几秒钟内拥有一个完全运行的系统,而不是经历安装过程。“模板”在 Vagrant 世界中被称为“boxes”,并且没有必要自己制作。您可以下载大多数 Linux 发行版的通用 boxes,这意味着零设置时间。
Vagrant 难题主要有三个部分。图 1 显示了这些部分及其相互连接的图表。

图 1. 实际上只有两个位置需要注意:您主目录中的 .vagrant.d 文件夹和您创建的项目文件夹。
1) 虚拟化系统
默认情况下,这是 VirtualBox。它是使 Vagrant boxes 工作的引擎,但它不跟踪任何 VM 文件或配置。这有点像使用 Python。需要安装 Python 可执行文件,但它只是一个执行 Python 代码的解释器。对于 Vagrant 来说,情况也是如此。VirtualBox 只是 Vagrant 用来运行其自身代码的程序。如果安装了 VirtualBox,您的工作就完成了。
2) .vagrant.d 文件夹
我实际上花了一段时间才弄清楚这一点。我之前提到的那些“boxes”被下载到这个文件夹中,这样当您创建一个新的 VM 时,它不必重新下载 box,而只是使用您的本地缓存副本。一旦我知道了文件夹的位置,当我搞砸时就更容易修复问题了。我倾向于通过实验来学习,所以我总是会弄坏东西。起初,我不知道如何摆脱我错误下载的 boxes,但是从我的主目录中的 .vagrant.d 文件夹中清除它们就解决了问题。
3) 项目文件夹
我最喜欢的 Vagrant 功能是每个 VM 都位于其自己的文件夹中。与 VM 相关的所有内容都在该文件夹中,因此您不必担心配置文件在一个文件夹中,硬盘驱动器映像在另一个文件夹中等等。该文件夹也可以在任何位置创建,并且它独立于其他项目文件夹运行。它们甚至不依赖于原始的“box”,因为 box 在您创建 Vagrant 实例时被克隆到项目文件夹中。
项目文件夹包含 Vagrantfile,它是虚拟机的单个配置文件。它包含您希望 VirtualBox 使用的硬件类型的设置(多少 RAM 等),并且它可以包含将在创建 VM 时自定义 VM 的启动脚本。事实上,Vagrantfile 的一个常见用途是启动 Chef 并从 Chef 服务器自动配置整个机器!值得庆幸的是,Vagrantfile 可以非常简单,并且 Vagrant 会在您第一次创建 VM 时默认创建一个。
逐步过程我几乎要讲到大多数 Web 教程开始的地方了,即使用 Vagrant 创建 VM。现在您已经知道 Vagrant 在做什么,这个过程变得更加有趣,也不那么神秘了。以下是逐步过程
1) 安装 VirtualBox 和 Vagrant
在像 Ubuntu 这样的基于 Debian 的发行版上,您只需键入
sudo apt-get install vagrant virtualbox
并允许安装程序。无需打开 VirtualBox,只需安装它即可。
2) 下载 Box 文件
这是您如何使用模板或 box 文件填充主目录中的 .vagrant.d 文件夹的方式。要选择您想要的 box,请访问 http://vagrantbox.es,并复制您要开始使用的任何基础的 URL。有很多贡献的 boxes 可用,因此选择一个对您有意义的 box,并将 URL 复制到您的剪贴板。然后,要将 box 获取到您的本地缓存,请键入
vagrant box add NAME http://example.com/boxurl/mybox.box
请注意,NAME
只是您选择用来命名您的 box 的任意名称。如果您使用 Ubuntu 14.04 映像,您可以将其命名为类似“trusty64”的名称,以便您以后可以轻松地引用它。该命令将下载 box 文件并使用您选择的任何名称存储它。
3) 创建项目文件夹
在您系统上的某个位置,为 VM 创建一个文件夹。它真的可以在任何地方。我通常首先在我的桌面上创建它,这样我就可以轻松地看到它——基本上
mkdir ~/Desktop/myfirstvm
然后,切换到该文件夹
cd ~/Desktop/myfirstvm
4) 初始化您的 Vagrant 映像
现在您只需键入
vagrant init NAME
vagrant 程序将创建一个具有默认配置的 Vagrantfile。基本上,它包含有关创建 VM 时要使用的 box 文件的信息。如果您想在 Vagrantfile 上进行高级配置(稍后我会介绍),您可以编辑它,但默认情况下,它将在未修改的文件下工作。
5) 启动您的 VM
VM 配置文件已在 myfirstvm 文件夹中创建,但 VM 尚未创建。为了做到这一点,请键入
vagrant up
请注意,您必须位于 myfirstvm 文件夹内才能使其工作。因为您可能拥有多个带有 VM 的文件夹(例如 mysecondvm),所以告诉 Vagrant 您要启动哪个 VM 的唯一方法是位于正确的文件夹中。Vagrant 现在将基于您之前下载的 box 文件创建一个虚拟机。虚拟硬盘驱动器和所有配置文件将存储在名为 .vagrant 的文件夹中,该文件夹位于 myfirstvm 文件夹内(有关详细信息,请参阅图 1)。在屏幕上,您将看到计算机正在启动,一旦全部设置完毕,您就拥有了一个完全运行的 VM。
6) 对您的 VM 做一些事情
这是我的另一个绊脚石。我有一个正在运行的 VM,但是如何与它交互呢?值得庆幸的是,Vagrant 提供了一个很酷的功能,即 SSH。仍然在 myfirstvm 文件夹中,键入
vagrant ssh
您将通过 SSH 登录到正在运行的 VM!即使您不知道机器上的任何密码,您始终可以通过 vagrant ssh
命令访问它,因为 Vagrant 会自动创建一个密钥对,允许您无需输入密码即可登录。登录后,您可以在系统上执行任何您想执行的操作,包括更改密码、安装软件等等。
7) 操作您的 VM
在您退出 VM 后,您将回到 myfirstvm 文件夹中的本地机器。VM 仍在运行,但您可以使用 Vagrant 执行其他操作
-
vagrant halt
— 关闭 VM。 -
vagrant suspend
— 暂停 VM。 -
vagrant resume
— 恢复暂停的 VM。 -
vagrant destroy
— 擦除 VM(不是 Vagrantfile)。
我希望这能使 Vagrant 工作流程清晰明了。如果它看起来足够简单,但不是非常有用,那么这就是所有基础知识将为您带来的。虽然能够如此快速地创建和销毁 VM 很酷,但就其本身而言,这个过程并不是很有用。值得庆幸的是,Vagrant 内置了一些其他很棒的功能。我已经提到了 vagrant ssh
命令,它允许您立即 SSH 进入 VM,但这只是冰山一角。
首先,您在 VM 中有 /vagrant 文件夹。这是一个自动挂载在正在运行的 VM 中的文件夹,它指向主系统上的项目文件夹本身。因此,您存储在与 Vagrantfile 并排的“myfirstvm”中的任何文件都可以从 VM 内的 /vagrant 文件夹访问。使其有用的是,您可以销毁 VM,创建一个新的 VM,并且您项目文件夹中的文件不会被擦除。如果您希望拥有在您执行 vagrant destroy
时不会被销毁的持久数据,这很方便,但当您将其与 Vagrantfile 本身的脚本功能结合使用时,它会更加有用。
诚然,它变得有点复杂,但可以使用基本的 Ruby 语言编辑 Vagrantfile,以自动化 VM 的创建和启动。这是一个编辑过的 Vagrantfile 的简单示例
# Sample Vagrantfile with startup script
VAGRANTFILE_API_VERSION = "2"
Vagrant.configure(VAGRANTFILE_API_VERSION) do |config|
config.vm.box = "NAME"
config.vm.provision :shell, path: "startup.sh"
end
我添加的唯一一行是 config.vm.provision 行。其他行是在我最初键入 vagrant init
时自动创建的。基本上,provision 语句的作用是告诉 Vagrant,一旦它启动 VM,就执行 startup.sh 脚本。它在哪里找到 startup.sh 文件?在共享空间中,即“myfirstvm”文件夹。因此,在您的 myfirstvm 文件夹中,在 Vagrantfile 本身旁边创建一个名为 startup.sh 的文件
# This is the startup.sh file called by Vagrantfile
apt-get update
apt-get install -y apache2
确保该文件是可执行的
chmod +x startup.sh
然后,让 Vagrant 创建一个新的 VM。如果您尚未“销毁”现有 VM,请执行此操作,然后键入 vagrant up
以创建一个新的 VM。这次,您应该看到机器被创建和启动,但您也应该看到系统下载并安装 Apache,因为它在启动时执行 startup.sh 文件!
一旦我理解了 Vagrant 如何在创建 VM 时调用脚本,我就开始意识到 Vagrant 可以多么强大和自动化。实际上,这只是 Vagrantfile 命令可以执行的操作的冰山一角。使用该文件,您可以自定义 VM 本身的设置(RAM、CPU 等);您可以创建端口转发设置,以便您可以通过连接到本地系统的端口来访问 Vagrant VM 的端口(这实际上是 vagrant ssh
的工作方式);您可以通过在创建 VM 时运行像 Chef 这样的程序来完全配置 VM。
Vagrant 并非适用于每项工作的完美工具,但如果您需要一个快速、高度可配置的虚拟机,该虚拟机可以自动化和脚本化,那么它可能是适合您的工具。一旦我理解了 Vagrant 的工作原理,它看起来就不那么像一个魔法按钮,而更像是一个很棒的工具。如果您在实验时完全搞砸了您的配置文件怎么办?只需擦除您的 /home/user/.vagrant.d/ 文件夹中的文件,然后从一个新的项目文件夹开始。所有配置都在 Vagrantfile 本身内部完成,甚至当您键入 vagrant init
时,也会自动为您创建 Vagrantfile。
如果您想了解有关 Vagrant 提供的各种高级选项的更多信息,请查看其组织良好的文档站点:https://docs.vagrantup.com/v2。至少,尝试一下我在这里展示的示例。看到 Vagrant 如何使整个虚拟化体验变得如此快速和自动化,真是太酷了。