使用 Salt Stack 和 Vagrant 进行 Drupal 开发
想象一下,就像电影《土拨鼠之日》中的比尔·默瑞一样,您每天醒来都能拥有一个崭新且相同的开发环境,完全摆脱昨天的实验和错误?Vagrant 让您能够做到这一点。
或者,想象一下,就像斯蒂芬·金的小说《11/22/63》中的杰克·埃平一样,您可以无所顾忌地更改和编写过去的脚本,随意尝试一些新的 Drupal 模块,然后只需离开并再次走下食品储藏室的楼梯,即可快速重置一切?
您是否希望自动化创建和安装一个纯净的 Drupal 环境,而不是手动安装 Apache、PHP 和所有需要的库?
最近,我阅读了 Treehouse Agency 发表的一篇文章,标题为“使用 Vagrant 消除 ‘在我的机器上可以工作’ 的意外”,这篇文章是关于使用 Vagrant 和 Puppet 进行 Drupal 开发的。您可能也在 Drupal Planet 上看过这篇文章,并对其中描述的好处感到好奇。
这是一个很棒的技术,它概述了如何使用各种工具快速构建一致的开发环境,这种环境是可重复的,并且可以与您团队中的每个人共享。
Linux Journal 最近也刊登了一篇介绍 Vagrant 的文章。在您阅读完本文之后,我强烈建议您也去阅读那篇文章,因为它提供了更多关于 Vagrant 本身的一般信息。
Salt Stack 是一个类似于 Puppet 的工具,但它由 Python 而不是 Ruby 驱动。如果您对独立的 Salt 安装和使用感兴趣,请查看我 2012 年 11 月在 LJ 上发表的关于该主题的文章,我在其中介绍了 Salt Stack,并展示了如何安装它来控制一台或数千台其他机器。我不会在这里深入探讨 Salt 的安装,因为 Salty-Vagrant 会为您处理所有这些。
最近,我一直在大量使用 Salt、Vagrant 和一个名为 Salty-Vagrant 的 Vagrant gem 进行 Drupal 开发。我发现,拥有一个标准的配置,能够镜像我的开发、测试、暂存和生产环境,这简化了我的工作流程,并帮助预防了 Drupal 开发生命周期不同阶段之间的大量未知情况。我能够最大限度地减少集成多个软件堆栈带来的许多错误和麻烦,并加快我的工作流程。
我也很喜欢能够快速轻松地尝试新事物,而无需花费数小时重新配置和重新安装 Drupal 开发所需的整个软件堆栈。
然后,我可以快速轻松地与团队中的其他开发人员共享这些配置,并且知道我们每个人都在使用相同的软件版本,这些软件已经安装完毕。在本文中,我将描述您也可以如何做到这一点。
使用 Salt Stack,您可以将配置存储在文本文件中,类似于 Puppet。不同之处在于,配置依赖于 YAML 模板,而不是 Ruby 代码。这使得它们易于人类阅读,即使他们不是 Python 程序员。
这些配置可以用于启动开发机器,以及测试、暂存和生产机器——所有这些机器都是相同的且易于传输的。我使用 Git 来管理团队的配置。这也为我的服务器配置带来了版本控制的所有优点。
使用 Vagrant,您可以轻松删除开发环境,然后在服务器启动并安装您指定的软件包和软件所需的时间内重新创建它——有点像快速撤消或重置按钮。
开始入门您需要下载并安装一些东西才能使所有这些组件协同工作。每个组件都有非常好的在线文档,用于安装和使用,因此我不会在此处重复这些说明。相反,请按照每个软件的链接,并查看项目站点以获取最新信息。
本文重点介绍使用基于 Ubuntu 的 64 位 VirtualBox,但 Salty-Vagrant 与 Salt Stack 也支持 BSD、Red Hat、OS X 和 Windows 虚拟机。
使用 Vagrant 与 Salty-Vagrant 的美妙之处在于,配置文件(也称为 SLS 文件)可以完全传输到生产服务器,以及您可能使用的任何其他地方。创建一个模板然后一遍又一遍地重复使用它的好处是可以帮助您将更多的精力投入到 Drupal 开发中,而不是解决服务器软件安装的故障。
您只需要执行一次此安装和配置。之后,它就像 vagrant up
一样简单!
VirtualBox 允许您在自己的主机操作系统内部运行客户操作系统。它类似于双启动,但您仍然可以使用您的主操作系统,并且还可以访问其他正在运行的操作系统。例如,您可以在您的 Windows、Mac 或 Linux 主机操作系统中运行 Ubuntu 服务器,并且仍然可以从您的本地主机操作系统访问您的电子邮件和文本编辑器。
按照 http://virtualbox.org 上的说明安装 VirtualBox。版本适用于大多数主要操作系统。流行的 Linux 发行版的大部分也通过各自的软件包管理器提供了软件包。这是安装我在此处描述的大多数工具的最有效和高效的方式。
安装 VagrantVagrant 是一个 Ruby gem,允许您快速创建和销毁虚拟机,然后几乎立即重置它们。
Gem 就像 Drupal 模块,但用于 Ruby 编程语言。这些插件允许您扩展 Ruby 的功能并添加其他功能。您应该确保您安装了最新版本的 Ruby。如果您没有安装 Ruby,我建议您使用软件包管理器,但是许多发行版已经包含 Ruby,因此您可能不需要安装它。您可以通过在终端中键入 ruby --version
轻松找出是否安装了 Ruby。
Salty-Vagrant 是另一个 Ruby gem,它将 Salt Stack 的功能和自动化配置工具带入 Vagrant。Salty-Vagrant 充当 Salt Stack 配置管理系统和 Vagrant/VirtualBox 之间的桥梁。该项目的页面上有定期更新的安装说明。最好参考这些说明,以防在本文发布后发生任何更改。如果您了解一些 Ruby 或 shell 脚本,请随时加入这个开源项目并帮助做出贡献。您会发现开发社区是友好和欢迎的。
获取基础 Box从 http://vagrantbox.es 获取基础 box。您需要一个box来创建和运行您的环境。Box 是 Vagrant 用于您的虚拟机的,它们只是专门配置了 Vagrant 支持的虚拟机。您可以从头开始创建自己的 box,但是下载一个预制的 box 会更快更轻松,该 box 已经设置了所有必要的 Vagrant 配置。我使用了 precise64 box。这是一个 Ubuntu 12.04 64 位 Linux 服务器,其中已经安装了必要的 Vagrant 工具和客户机增强功能。您正在下载整个操作系统,所以请耐心等待,因为它可能需要一段时间。通常最好下载您的 box,然后将其保存在本地的某个位置,以便您可以再次使用它。
如果您使用的是 32 位主机操作系统,则应改为下载 32 位版本。
导入 Box希望到目前为止,您已经拥有了所需的一切。让我们使用命令行与 Vagrant 交互并导入您的新 box。
要导入您的 box,请使用
vagrant box add precise64 /path/to/your/downloaded/box
相对路径名在这里不太好用,因此如果您将 box 下载到您的主目录,您需要输入完整路径——例如,~/bhosmer/precise64.box
应输入如下:/home/bhosmer/precise64.box
。
vagrant box add
命令会创建您的 box 的副本并存储它,以便 Vagrant 可以访问它。此 box 用于创建您碰巧正在使用的特定 box 的实例化。好处是您始终可以使用 vagrant destroy
按下“重置”按钮来删除您所做的任何操作,并将其设置回您开始之前的原始状态。稍后我将更详细地介绍这一点。
现在,启动您的 box,以确保 VirtualBox 客户机增强功能是最新的。如果它们不是最新的,Salty-Vagrant 可能无法正常工作。
您将 Vagrant 配置存储在哪里完全取决于您。我喜欢将我的配置保存在我的主目录下的一个 vagrant 文件夹中,这样我就可以跟踪我拥有的不同环境。
创建一个名为 salty-vagrant 的新目录,然后 cd
进入该目录。
现在使用 vagrant init
在那里初始化一个 Vagrantfile。这是一个标准的 Vagrant 配置文件,文档齐全。您无需更改任何配置,除了第 10 行
config.vm.box = "base"
如果您按照 http://www.vagrantup.com 中的快速入门说明进行操作,Vagrant 会将您的默认 box 指定为 base。将此更改为您导入的 box 的名称,precise64
config.vm.box = "precise64"
请注意,我省略了 .box 扩展名。
现在您的 Vagrantfile 指向正确的 box,使用 vagrant up
启动您的虚拟机。
如果您收到警告,提示您的客户机增强功能已过期,如果您刚刚安装了 VirtualBox,很可能会收到此警告,请继续下一步。如果您没有收到警告,您可以跳到“添加 Salty-Vagrant Vagrantfile”部分。
更新客户机增强功能如果您确实需要更新安装在您的 box 上的客户机增强功能,在本节中,我将解释如何在您刚刚下载的基于 Ubuntu 的 box 上执行此操作。这将是您的更改在 box 内永久生效的少数几次之一。而这一次,您希望它们是永久生效的。客户机增强功能允许您的主机操作系统与客户操作系统进行交互。这包括在它们之间共享文件和网络资源。您将配置文件存储在您的主机操作系统上,然后在每次启动时将它们复制到客户操作系统,因此共享文件夹功能正常工作非常重要。
在 Vagrant 完成启动客户操作系统后,您需要使用 SSH 连接到此 box。使用 Vagrant 提供的命令:vagrant ssh
。
然后您将以“vagrant”用户身份登录到客户操作系统。
更新客户机增强功能可能是最棘手和最复杂的任务。如果您遇到任何问题,可以在网上找到大量资源。大多数发行版在其各自的论坛中都提到了许多解决方案,VirtualBox 手册 (https://www.virtualbox.org/manual/ch04.html) 也提供了一些详细信息。我将向您展示如何从 virtualbox.org 下载和更新 virtualbox 客户机增强功能,并在您刚刚下载的 precise64 box 上更新它们作为示例。
首先,您需要一些软件包来构建和编译 Linux 内核。使用 Ubuntu 的软件包管理器 apt 来安装它们
sudo apt-get install dkms linux-headers-3.2.0-23-generic
如果您使用的是非 Debian 机器,请在您的特定软件包管理器中搜索正确的名称,并使用与您的特定内核匹配的标头版本。
现在内核支持已经就位,浏览到 http://download.virtualbox.org/virtualbox 并找到与您安装的 VirtualBox 版本匹配的文件夹。通常,您可以通过 VirtualBox 图形界面或 Vagrant 在启动虚拟机时生成的警告消息找到您拥有的版本。现在,找到也与您安装的 Virtualbox 版本匹配的 VBoxGuestAdditions_x.x.x.iso。将文件名中的 x 替换为您 VirtualBox 版本的特定版本。
您可以复制此文件的 URL,并将其粘贴到您之前 SSH 连接到的客户 Ubuntu 系统的终端窗口中。使用 wget 下载 ISO
wget http://download.virtualbox.org/virtualbox/x.x.x/
↪VBoxGuestAdditions_x.x.x.iso
再次,将文件名中的 x 替换为与您的 VirtualBox 安装匹配的版本。
现在您应该在您的主目录中有一个 .iso 文件。
下载完成后,挂载它,以便您可以通过首先创建一个临时目录来访问其中包含的文件,您可以在其中挂载此 .iso。在您的主目录中,使用此命令
mkdir -p tmp/vbox
现在,将 .iso 挂载到该文件夹中
sudo mount -o loop VBoxGuestAdditions_x.x.x.iso tmp/vbox/
在 .iso 中,您会找到一个 VBoxLinuxAdditions.run 脚本。将其复制到您的主目录
cp VBoxLinuxAdditions.run ~
现在,通过添加执行标志使其可执行
chmod +x VBoxLinuxAdditions.run
最后,运行安装脚本
sudo ./VBoxLinuxAdditions.run
如果您收到关于未能安装窗口系统驱动程序的警告,您可以安全地忽略它。您正在安装这些客户机增强功能的 box 是一个服务器,并且没有安装窗口管理器。您也可以在安装更新的客户机增强功能时使用 --nox11
标志,如下所示
sudo ./VBoxLinuxAdditions.run --nox11
此安装的最后一步是重新启动机器,以确保客户机增强功能是最新的
sudo reboot
在 box 重新启动后,使用以下命令重新登录
vagrant ssh
现在您可以使用 sudo umount /mnt
卸载 .iso(如果尚未卸载),并删除 VBoxLinuxAdditions.run 和 .iso 文件以节省空间。您也可以选择通过删除 .bash_history 文件来进行一些清理工作。
现在客户机增强功能已更新,您应该重新打包一个新的 box,以便每次打开此 Vagrant box 时,客户机增强功能都匹配。这使您不必每次都更新它们。只要您不更改您正在使用的 VirtualBox 版本,您就不需要更新您的客户机增强功能。如果您更改了版本,您将需要再次更新它们。
使用 vagrant package
命令,导出您的新 box。这将关闭您的机器,并在当前目录中导出一个 package.box 文件。
将其重命名为更具描述性的名称,例如 myprecise64.box。
现在将这个新的 box 添加到 Vagrant
vagrant box add myprecise64 myprecise64.box
您给您的 box 起的名字是任意的,完全取决于您。随意使用对您有意义的描述。
您现在已经完成了原始 box 的操作,因此使用 vagrant destroy
销毁它。您可以使用 vagrant box remove precise64
从 Vagrant 中完全删除它。
添加您的新 myprecise64 box,或者您碰巧称呼它的任何名称,就像您之前使用您下载的基础 box 使用 vagrant box add
一样。
确保更改您的 Vagrantfile 中的名称以匹配新的 box,并使用 vagrant up
测试它。
恭喜!您现在拥有了一个更新的 Ubuntu 12.04 VirtualBox,适用于 Salt Stack 和 Salty-Vagrant 自动化。
安装 Vagrant Salty-Vagrant Gem您需要安装的最后一个软件是 Salty-Vagrant gem。它允许在您的客户虚拟机上自动安装 Salt Stack,并使用 Salt Stack 来启动您的配置和软件安装。
返回到您的主机机器(即,不是您的虚拟机的那台机器),使用 Vagrant gem 命令 vagrant gem install vagrant-salt
安装 Salty-Vagrant gem。
现在您需要添加一个稍微自定义的 Vagrantfile,以配置一些 Salt 特定的参数,共享您的状态树,并在您的 VirtualBox 启动后自动安装 Drupal 和 Linux Apache MySQL 堆栈。如果您之前添加了 Vagrantfile,您现在可以删除它。您将添加一个更小、更自定义的 Vagrantfile,该文件可从 Salty-Vagrant 项目页面 https://github.com/saltstack/salty-vagrant 获得。您可以简单地将其复制并粘贴到一个新的 Vagrantfile 中。
找到 config.vm.box = "precise64"
行,并将 "precise64"
更改为您的 box 的名称。如果您一直在按照本教程进行操作,则在本教程的前面,我将我的 box 导出为 "myprecise64"
。
我也喜欢将客户机/主机网络通信添加到我的 Vagrantfile 中,使用这一行
config.vm.network :hostonly, "192.168.33.19"
您可以为您的内部 VirtualBox 网络使用任何可用的 IP 地址。请记住,这与您自己的网络是分开的,并且由 VirtualBox 创建。这允许您使用您指定的 IP 地址从您自己的操作系统的 Web 浏览器访问您的 Drupal 站点。如果您愿意,可以选择另一个 IP 地址。
创建您的 Minion 配置文件在与您的 Vagrantfile 相同的目录中,创建 salt 目录、srv 目录和 lamp-drupal 目录,如下所示
mkdir -p salt/srv/lamp-drupal
在您的 salt 目录中创建一个新的 minion.conf 文件,其中包含以下行
file_client: local
这指示 Salt 不要搜索主服务器,而是使用本地文件结构来获取其配置信息。这就是您将在 Salt Stack 文档中看到的被称为无主配置的内容。
找到您的 Vagrantfile 中标记为 salt.minion_conf 的行,并通过删除 # 取消注释它。这告诉 Vagrant 您的 minion 配置文件的位置。路径是相对于您的 Vagrantfile 的。
获取状态文件我的 Drupal SLS 文件在 salt-states 存储库中可用。您可以使用它在 Ubuntu 中安装 Drupal 开发所需的所有软件包。现在下载该文件,并将其放在您的 /srv/salt/lamp-drupal 目录中。您还需要创建一个 /srv/salt/top.sls 文件,如下所示
base:
'*':
- lamp-drupal
有关 top 文件的更多详细信息,请参阅我之前提到的关于安装 Salt Stack 的文章。
将状态文件添加到您的共享文件夹在 salt/srv/lamp-drupal 目录中,从 salt-states 存储库复制 init.sls 文件。
此文件指示 Salt 在机器启动时安装运行 Drupal Web 服务器所需的所有软件包。我甚至包括了 Drush 安装。如果您检查该文件,您会发现它已经相当容易理解了。我不会在这里深入探讨更多细节,但请随时查看 init.sls 文件,以了解实际安装了什么。
现在编辑您的 Vagrantfile 以反映此状态文件的位置,方法是编辑行
config.vm.share_folder "salt_file_root", "/srv",
↪"/path/to/salt_file_root"
改为
config.vm.share_folder "salt_file_root", "/srv/salt", "salt/srv"
Vagrant 启动!
在您的 minion 配置文件到位并且您的状态文件准备就绪后,最后一步将自动启动您的机器,安装 Salt 并安装 Drupal 开发服务器所需的所有必要组件。
准备好了吗?使用 vagrant up
启动您的机器。
您可以观看输出和响应,因为 Vagrant、Salty-Vagrant 和 Salt Stack 会自动下载您指定的所有软件并为您配置它们。
服务器启动后,只需再次使用 vagrant ssh
SSH 连接到您的虚拟服务器。您会发现一个 /var/www 文件夹已准备好接收您的 Drupal 安装。
此 SLS 文件可在多个环境中重复使用,并且我没有将其配置为更改 /var/www 文件夹的权限。您会注意到此文件夹由 root 拥有,就像 Ubuntu 软件包管理器设置的那样。
位于 vagrant 用户主目录中的 Drush 目录也由 root 拥有。如果您不将该文件夹的所有权更改为启动 Drush 命令的用户,您将收到 Drush 错误。
结论通过结合四个非常强大的工具:Vagrant、Salty-Vagrant、VirtualBox 和 Salt,您可以大大加快您的 Drupal 开发速度。维护小型开发环境,然后编写脚本来配置它们,通过在所有开发人员的平台上增加一致性,有助于为参与其中的每个人创造双赢。维护小型、基于文本的配置文件也可以节省存储成本。您和您的开发人员还可以节省将新配置传输到远程服务器的时间。
您可以尝试新的配置并安装其他库(如果您需要或想要这样做),而无需担心破坏您的本地或生产系统。
我概述的每个工具都是免费提供的,并且都是开源项目。您会发现 Salt 开发社区是开源世界中最友好和最受欢迎的社区之一。
每个项目都会定期更新,如果您遇到任何问题,最好查看文档以及软件的更改。