Vagrant 入门

使用 Vagrant(一种用于管理虚拟机和容器的工具)清理您的开发环境和依赖项。
314 位读者喜欢这篇文章。
Performance made easy with Linux containers

CC0 协议公共领域

如果您像我一样,您可能在某个地方有一个“沙箱”,您可以在其中修改您正在处理的任何项目。 随着时间的推移,沙箱会变得粗糙,并充满了各种想法、工具链元素、您不使用的代码模块和其他您不需要的东西。 当您完成某些事情时,这会使您的部署变得复杂,因为您可能不确定项目的实际依赖项——您在沙箱中使用某种工具已经很长时间了,以至于您忘记必须安装它。 您需要一个干净的环境,所有依赖项都集中在一个地方,以便以后更容易。

或者您可能在 DevOps 中,您服务的开发人员向您提供带有混乱依赖项的代码,这使得测试变得更加困难。 您需要一种干净的环境来引入代码并运行它。 您希望这些环境是可抛弃且可重复的。

进入 Vagrant。 Vagrant 由 HashiCorp 在 MIT 许可证下创建,充当 VirtualBox、Microsoft Hyper-V 或 Docker 容器的包装器和前端,并且可以通过插件进行扩展,以支持许多其他提供商。 您可以配置 Vagrant 以提供具有所需基础设施的、可重复的干净环境。 配置脚本是可移植的,因此如果您的存储库和 Vagrant 配置文件位于基于云的存储上,则您只需进行一些限制即可启动并在多台机器上工作。 让我们来看看。

安装

对于此安装,我正在我的 Linux Mint 桌面(版本 18.3 Cinnamon 64 位)上工作。 在大多数其他基于 Debian 的系统上安装非常相似,并且大多数发行版上都有类似的基于 RPM 的系统的安装程序。 Vagrant 的 安装页面 提供了 Debian、Windows、CentOS、MacOS 和 Arch Linux 的下载,但我可以在我的软件包管理器中找到它,所以我将安装它。

最简单的安装使用 VirtualBox 作为虚拟化提供程序,因此我还需要安装它。

sudo apt-get install virtualbox vagrant

安装程序将获取依赖项(主要是 Ruby 相关的东西)并安装它们。

设置项目

在设置项目之前,您需要了解一些关于您要运行它的环境的信息。 您可以在 Vagrant Boxes 存储库中找到许多虚拟化提供程序的大量预配置盒子。 许多盒子都预先配置了一些您可能需要的核心基础设施,例如 PHP、MySQL 和 Apache,但对于此测试,我将安装一个裸机的 Debian 8 64 位“Jessie”盒子并手动安装一些东西,以便您可以看到它是如何工作的。

mkdir ~/myproject
cd ~/myproject
vagrant init debian/contrib-jessie64
vagrant up

最后一个命令将根据需要从库中获取或更新 VirtualBox 镜像,然后拉取启动器,您将在系统上拥有一个正在运行的盒子! 下次启动盒子时,除非镜像已在存储库中更新,否则不会花费很长时间。

要访问该盒子,只需输入 vagrant ssh。 您将被放入虚拟机上一个功能齐全的 SSH 会话中。 您将成为用户 vagrant,但您是 sudo 组的成员,因此您可以更改为 root 并从此处执行任何操作。

您将在盒子上看到一个名为 /vagrant 的目录。 请小心使用此目录,因为它将与主机上的 ~/myproject 文件夹同步。 在虚拟机上的 /vagrant 中触摸一个文件,它会立即复制到主机,反之亦然。 请注意,某些盒子没有安装 VirtualBox Guest Additions,因此复制仅单向工作,并且仅在启动时有效! 有一些用于手动同步的命令行工具,这在测试环境中可能是一个非常有用的功能。 我倾向于坚持使用安装了添加功能的盒子,因此此目录同步只需工作即可,而无需我考虑它。

此方案的优势很快就会显现出来:如果您在主机上有一个代码编辑工具链,并且由于任何原因不想在虚拟机上使用它,那也没问题——在主机上编辑,VM 会立即看到更改。 在 VM 上进行快速更改,它也会同步到主机上的“官方”副本。

让我们关闭盒子,以便我们可以在此盒子上配置一些我们需要的东西:vagrant halt

在 VM 上持续安装其他软件

在此示例中,我将使用 ApachePostgreSQL 和 Perl 的 Dancer Web 框架来处理一个项目。 我将修改 Vagrant 配置文件,以便已经安装了我需要的东西。 为了更容易地保持以后更新,我将在 ~/myproject/Vagrantfile 的顶部创建一个脚本

$provision_script = <<SCRIPT
export DEBIAN_FRONTEND=noninteractive
apt-get update
apt-get -y install \
  apache2 \
  postgresql-client-9.4 \
  postgresql-9.4 \
  libdbd-pg-perl \
  libapache2-mod-fastcgi \
  libdata-validate-email-perl  \
  libexception-class-perl \
  libexception-class-trycatch-perl \
  libtemplate-perl \
  libtemplate-plugin-json-escape-perl \
  libdbix-class-perl \
  libyaml-tiny-perl \
  libcrypt-saltedhash-perl \
  libdancer2-perl \
  libtemplate-plugin-gravatar-perl  \
  libtext-csv-perl \
  libstring-tokenizer-perl \
  cpanminus
cpanm -f -n \
  Dancer2::Session::Cookie \
  Dancer2::Plugin::DBIC \
  Dancer2::Plugin::Auth::Extensible::Provider::DBIC \
  Dancer2::Plugin::Locale \
  Dancer2::Plugin::Growler
sudo a2enmod rewrite fastcgi
sudo apache2ctl restart
SCRIPT

在 Vagrantfile 的末尾附近,您会找到 config.vm.provision 变量的行。 您可以像在示例中看到的那样在此处内联执行此操作,只需取消注释这些行即可

  # config.vm.provision "shell", inline: <<-SHELL
  #   sudo apt-get update
  #   sudo apt-get install -y apache2
  # SHELL

但是,请替换这四行以使用您在文件顶部定义为变量的配置脚本

config.vm.provision "shell", inline: $provision_script

您可能还需要设置转发端口,以便从主机访问 VM 上的 Apache。 查找包含 forwarded_port 的行并取消注释。 如果您愿意,也可以将端口从 8080 更改为其他端口。 我通常使用端口 5000,并且在我的浏览器中访问 https://127.0.0.1:5000 可以让我访问虚拟机上的 Apache 服务器。

这是一个设置技巧:如果您的存储库位于云存储上,为了在多台机器上使用 Vagrant,您可能需要在不同的机器上将 VAGRANT_HOME 环境变量设置为不同的值。 考虑到 VirtualBox 的工作方式,您需要为这些系统单独存储状态信息。 确保您的版本控制忽略了用于此目的的目录——我将 .vagrant.d* 添加到存储库的 .gitignore 文件中。 但是,我*确实*让 Vagrantfile 成为存储库的一部分!

全部完成!

我输入 vagrant up,我准备开始编写代码了。 一旦您完成了一两次,您可能会想出一些您会经常回收的 Vagrantfile 样板文件(就像我刚刚使用的那个),这就是 Vagrant 的优势之一。 您可以更快地开始实际的编码工作,并减少在基础设施上花费的时间!

您可以使用 Vagrant 做更多的事情。 许多工具链都存在配置工具,因此无论您需要复制什么环境,它都快速而简单。

标签
User profile image.
Ruth Holloway 长期以来一直担任系统管理员和软件开发人员,早在 VAX 11/780 上就开始了她的职业生涯。 她职业生涯的大部分时间(到目前为止)都在为图书馆提供技术需求,自 2008 年以来一直是 Koha 开源图书馆自动化套件的贡献者。 Ruth 目前是 Clearbuilt 的 Perl 开发人员和项目负责人。

评论已关闭。

Creative Commons License 本作品根据 Creative Commons Attribution-Share Alike 4.0 International License 获得许可。
© . All rights reserved.