【问题标题】:Shared Vagrant configuration across multiple projects跨多个项目共享 Vagrant 配置
【发布时间】:2016-04-01 19:44:41
【问题描述】:

我有一些服务,每一个都存在于自己的 Git 存储库中。

每个服务都是独立的,彼此独立运行。

我希望它们在同一个 VM 中运行。

你如何使用 Vagrant 建立一个包含这些服务的共享开发环境?

(请注意,我想避免为每个 repo 创建一个 Vagrantfile。)

【问题讨论】:

  • 你可以在 docker 中运行部署服务,然后虚拟机将提供 docker 吗?或者您创建一个虚拟机并从不同的存储库中提取每个服务
  • 感谢您的快速回答!您的方法的问题是我需要使 vm 与本地机器(在 vm 之外)中的存储库保持同步。为了增加复杂性,我不想编译和部署我的服务(然后从 vm 中提取它们)。原因是我使用了一种不需要编译-部署周期的解释性语言(例如 Java)来调试/测试代码。

标签: vagrant puppet vagrantfile


【解决方案1】:

创建一个自定义的说明书/木偶清单或 shell 配置程序,它将检查单个 git 存储库并运行服务。

可以找到 Vagrant 中配置器的更多详细信息/配置选项 这里

https://www.vagrantup.com/docs/provisioning/basic_usage.html

【讨论】:

  • 这可行,但我有一个额外的限制。每个 repo 在 .gitignore 文件中排除的文件中都有自己的自定义配置。由于我想自动化开发环境设置,因此有必要使这些存储库(及其各自的配置)与 /vagrant 保持同步。
【解决方案2】:

最简单的方法就是设置 Beaker。在 Puppet Forge 上查找成熟的模块以获得指导。您将需要spec/spec_helper_acceptance.rbspec/acceptance/nodesets/default.yml,并且您需要系统测试从Gemfile 中选择的宝石。

现在创建一个文件spec/acceptance/yourclass_spec.rb,让它应用你的类以你想要的方式配置虚拟机。

为了解决多个 git repos 中的多个项目的需求,您可以在 spec/spec_helper_acceptance.rb 中安装它们。

或者,您可以设置 .fixtures.ymlpuppetlabs_spec_helper,并在您的规范助手中运行 bundle exec rake spec_prep

要搞清楚它,请克隆一些 Forge 模块,例如 puppetlabs/apache

bundle install
export BEAKER_destroy=no
bundle exec rspec spec/acceptance/some_spec.rb

测试完成后,您可以登录到您的虚拟机。

这是一个学习曲线,但这种方式意味着您有一种快速配置虚拟机的方法,并且您也可以正确地测试它们。

Beaker 甚至可以启动多个虚拟机,这样您就可以在需要时让所有服务一起运行。

【讨论】:

  • 如果我需要在 VM 上运行时手动检查和调试服务,而不仅仅是运行测试?
  • 这就是导出 BEAKER_destroy=no 所达到的效果。测试完成后,虚拟机仍然存在,您可以使用 vagrant global-status 访问它们,然后使用 vagrant ssh。
  • 如果您使用的是 Ruby,那非常酷。我会在未来的项目中考虑到它。谢谢!
【解决方案3】:

也许我错过了一些东西,但听起来您可以运行虚拟机,只需将共享文件夹与您正在处理的服务的不同文件夹一起使用。

共享文件夹可以采用绝对路径(不仅仅是在您定义 Vagrantfile 的当前项目中的相对路径),因此您可以混合使用类似的文件夹

Vagrant.configure(2) do |config|

  config.vm.box = xxx
  blablabla

  config.vm.synced_folder "/Users/fhenri/project/service1", "/project/service1"
  config.vm.synced_folder "/Users/fhenri/project/examples/service2", "/project/service2", type: "nfs"
  config.vm.synced_folder "/Users/fhenri/project/ruby/service3", "/opt/rubyservice"

因此,当您配置此 VM 时,您可以配置您的每项服务。由于文件夹与项目源共享,因此您在原始文件夹中所做的任何更改都将在 VM 上同步

您还可以在这个 Vagrantfile 中定义多台机器,并在每台机器中拥有一个共享文件夹

缺点:你不能真正分享这个 Vagrantfile,因为绝对路径主要是和你自己的设置对齐的(你可以使用 user_variable 等等,但并不理想)

【讨论】:

  • 这可以解决。您提到的缺点可以通过创建一个引导脚本来克服,开发人员必须在第一次运行 vagrant 之前运行该脚本(也许脚本可以自己运行 vagrant)。不过,如果您想与团队共享此配置,我同意这不是最佳方法。
  • 是的,可以根据您的需求提供解决方案,但我想这很简单,可以满足您的一般情况
【解决方案4】:

一种方法是使用 Vagrant 和 Git 子树从单个存储库中引用和签出外部组件。

假设我们有三个不同的 repos,service-auth、service-notifier 和 core,每个都包含我们要配置的组件。

我们将创建一个 repo,例如dev-env,包含 Vagrantfile 和每个外部 repo 的一个子树。 Vagrantfile 将如下所示:

VAGRANTFILE_API_VERSION = "2"

Vagrant.configure(2) do |config|
config.vm.box = “ubuntu/trusty64”
config.vm.network :forwarded_port, host: 8080, guest: 8080 # core
config.vm.network :forwarded_port, host: 8081, guest: 8081 # service-auth
config.vm.network :forwarded_port, host: 8181, guest: 8181 # service-notifier
end

(我们假设我们的组件将监听不同的 TCP 端口。)

然后,我们将使用git subtree 来添加、更新和推送我们的组件。

根据您项目的特点和团队的组织,此解决方案可能合适或不合适。

我已经写了an article 提供了有关如何为此目的配置和使用子树的更多详细信息。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2017-06-15
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2012-11-20
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多