我将解释我将如何实现您想要做的事情,这可能不是官方的方式,所以任何有更多 Vagrant 经验的人都应该提供有关可以改进的地方的指示。我已经和 Vagrant 一起工作了大约 6 个月。你说你是 Vagrant 的新手,所以我会尽可能完整,即使你可能已经掌握了一些部分,但可能对其他用户有用。
tl;博士; 如果您已经熟悉 Vagrantfile 的工作原理,请跳至创建 Vagrantfile 部分
让我们从Vagrantfile的示例开始。
config.vm.box = "puppetlabs/centos-6.5-64-puppet"
这告诉 Vagrant 拉开构建其他一切的盒子。你可以在Vagrant Cloud上找到很多官方和社区贡献的盒子。这个来自 puppetlabs,基于已安装 Puppet 的 CentOS 6.5 64 位。
config.vm.network "forwarded_port", guest: 8080, host: 8088
这告诉 Vagrant 将主机上的 8088 端口转发到 Vagrant 盒子上的 8080。因此,在您的主机上访问http://127.0.0.1:8088将访问来宾上的 8080 端口。
config.vm.provision :shell do |shell|
Provisioning 是第一次运行 Vagrant box 时设置它的过程。除非强制,否则配置只会为新 VM 运行一次。请参阅Basic Usage Vagrant Docs的配置部分。这个特别是在配置时执行一堆 shell 命令。
shell.inline = "command;
command;"
Shell inline 将这些以分号分隔的命令发送到盒子。这是为了自动执行命令,就像您自己在 SSH 会话中键入它们一样。Vagrant Docs on Shell Provisioning有一些更高级的用途,您可以在其中定义要执行的实际文件。注意:您的 shell 脚本不应尝试执行尚未安装的工具。(例如,在 Python 尚不可用的情况下运行 Python 脚本)。
config.vm.provision "puppet" do |puppet|
我不能对 Puppet 部分发表太多评论,因为我不是 Puppet 用户(可能还不是)。这是设置一些 Puppet 值。
shell.inline = "cd /vagrant && mvn clean package;
sudo cp target/cas.war /srv/tomcat/cas/webapps/;
sudo /sbin/service tomcat-cas restart"
这也是执行 shell 命令。基本上是更改目录,清理,将 cas.war 复制到 webapps 目录,然后重新启动服务。稍后将详细介绍/vagrant
共享文件夹。现在我们已经足够开始构建我们自己的 Vagrant 文件了。我将保持示例简单以使其通用。
创建 Vagrant 文件
您很可能希望在已经满足您的要求的 Vagrant 盒子上进行构建,但现在,我们不要这样做。但是,您可以在Vagrant Cloud上找到很多已经创建的盒子。我将向您展示如何使用 Flask 运行(非常)简单的 Python 应用程序。
- 从可用的 Vagrant 框中选择您最喜欢的发行版。我打算
ubuntu/trusty64
使用它,因为我每天都在使用它。所有命令都应该很容易翻译到其他发行版。
- 为您的项目创建一个新目录并在其中打开一个 shell / 控制台窗口。
- 使用控制台,初始化你的 Vagrant box
vagrant init ubuntu/trusty64
。这将创建一个基本的 Vagrantfile 供您使用。
- 打开你的 Vagrantfile 并取消注释
config.vm.network "forwarded_port", guest: 5000, host: 8080
。我们希望端口 8080 将我们带到客户机上的端口 5000。提示:对于您的项目,明智的做法是选择一个很可能尚未使用的端口,以避免与其他应用程序发生冲突。8080可能是不好的选择,8089会更好。
让我们添加一些脚本以在配置时执行。由于 Python 随 Ubuntu(以及我知道的大多数其他软件)一起提供,我们不需要安装 Python,但我们确实需要 pip(Python 包管理器)和 Flask。
config.vm.provision :shell do |shell|
shell.inline = "cd /vagrant;
sudo apt-get -y install python-pip;
sudo pip install Flask;"
end
这会将目录更改为 Vagrant 共享。使用 Ubuntu 的包管理器安装 pip,然后使用 pip 安装 Flask。-y 标志是自动安装 apt-get 而不提示是/否问题。您可能需要运行Vagrant up --provision
几次才能让所有命令 100% 正确。
关于 Vagrant 共享的注意事项:Vagrant 共享是在主机和来宾计算机之间同步的目录,可在/vagrant
. 它包括项目目录(Vagrantfile 所在的位置)中的所有文件和目录。
我们现在拥有运行应用程序所需的所有工具。我创建了一个非常简单的 Flask 应用程序作为示例。从此Gist将其下载到您的项目目录并命名app.py
现在我们将能够运行位于项目目录中的 Python 应用程序。我喜欢将安装部分和运行部分分开。所以添加另一个启动应用程序的部分。注意: & 使应用程序分叉到后台,以便vagrant up
可以完成。你可能想用你的应用做一些比这更花哨的事情。
config.vm.provision :shell do |shell|
shell.inline = "/vagrant/app.py &"
end
最后我们可以开始一切,让 Vagrant 发挥它的魔力。在您的控制台中,在您的项目目录中(您的 Vagrant 文件所在的位置)。运行vagrant up
。
- 关键时刻。打开浏览器(在主机上)并浏览到http://127.0.0.1:8080/。你应该看到
Hello Vagrant Provisioned World!
。
这负责您的应用程序的配置。自动,从 Vagrantfile,你可以用你的项目代码提交。
现在开始你的初始步骤,以及它是如何适应的。
集成到您的开发工作流程中
我列出了与 Vagrant 集成的步骤。
- 克隆 repo 此步骤保持不变,除了您的 repo 中包含的 Vagrantfile 以及为您的项目所需的任何所需库和工具的配置。
vagrant up
在项目目录中运行。这将自动创建和配置 box 并与 box 共享您的项目。
- 您可以在 Vagrant 配置步骤中构建项目,但如果您正在积极开发应用程序,您可能不想这样做。
- 测试正在运行的应用程序实例(在盒子内运行) - 只需 SSH 进入盒子,进入 `/vagrant' 目录并运行你的应用程序。
- 调整代码 } #4、#5 和 #6 快速/快速的开发测试调整周期利用热重新部署因为您的项目在主机和来宾之间实时共享。您可以简单地停止应用程序(如果正在运行)并在来宾上再次运行该应用程序。无需复制。
- 重新测试
这将为您提供快速的开发周期,同时保持环境不变。新开发人员可以简单地克隆并vagrant up
开始项目,而不必担心环境等等。
持续集成是一个广阔的话题。您仍然可以将这些实践应用于您的存储库等。但是我会在开发时跳过 CI 部署过程。我在 CI 部署中使用Jenkins和Capistrano,但它对于开发来说太重了。在生产中我不会使用 Vagrant,因为它已经对你的虚拟机进行了双重虚拟化(除非你运行裸机)。对于生产,我将使用Docker和Fig。
我希望这能解释如何将 Vagrant 集成到您的项目流程中,如果有任何需要澄清的地方,请发表评论。我相信样本应该用词完美,因为这是使用 Vagrant 的目标。