我希望这个问题得到一般性的回答,但为了说明这一点,这里有一个用例:

我在用Vagrant做一个简单的LMAP项目.我使用独立的Puppet进行资源调配.现在,可能有一些开发人员坐在代理后面,他们需要对VM进行一些额外的配置.我在Puppet方面做了一些工作:我可以将代理IP(如果有)作为事实传递给Vagrantfile中的Puppet,如果设置了代理IP,Puppet会做出相应的react .

我唯一的问题是:开发人员如何为他们的开发环境指定/覆盖此设置,而不必更改Vagrantfile(它受版本控制,必须保持与开发环境无关)?

如果人们可以覆盖一个名为Vagrantfile.local的文件中的一些流浪设置,那就太棒了,我会通过.gitignore排除这个文件.

由于Vagrantfile只是Ruby,我try 了以下方法:

# Also load per-dev custom vagrant config
custom_vagrantfile = 'Vagrantfile.local'
load custom_vagrantfile if File.exist?(custom_vagrantfile)

文件包含基本上是有效的,但看起来在包含的文件中,我不再处于相同的流浪环境中了...

Vagrant::Config.run do |config|
  config.vm.provision :puppet do |puppet|
    puppet.facter = { "proxy" => "proxy.host:80" }
  end
end

... 还"重置"了我在main Vagrantfile中创建的所有其他puppet配置值,这让我觉得我走错了方向.我应该注意到我在Ruby是个彻头彻尾的笨蛋;)

有谁能给我一个提示,或者甚至是一个有效的解决方案,来说明如何在这里进行每开发人员定制?

推荐答案

我建议使用环境变量动态更改Vagrantfile的行为,而无需编辑文件本身.

举一个现实世界的例子,下面是如何在默认情况下使用Ubuntu base box,但让一个环境变量定义另一个Linux发行版:

if ENV['OPERATINGSYSTEM']
  if ENV['OPERATINGSYSTEM'].downcase == 'redhat'
    os_name = 'centos'
    config.vm.box     = 'centos'
    config.vm.box_url = 'https://dl.dropbox.com/u/7225008/Vagrant/CentOS-6.3-x86_64-minimal.box'
  else
    raise(Exception, "undefined operatingsystem: #{ENV['OPERATINGSYSTEM']}")
  end
else
  os_name = 'precise64'
  config.vm.box     = 'precise64'
  config.vm.box_url = 'http://files.vagrantup.com/precise64.box'
end

这个例子来自https://github.com/puppetlabs/puppetlabs-openstack_dev_env

Ruby相关问答推荐

关键字if是什么对象类型/类?

如何根据数组键对散列键进行排序?

有没有办法向用户返回 nil 消息但不中断 ruby​​ 中的应用程序?

配置 SubLime Linter 插件以使用 Ruby 1.9 语法

为什么 Range 在下降时不起作用?

Scala 的扩展性是否优于其他 JVM 语言?

Ruby 连接字符串并添加空格

判断 Ruby Gem 的可用性

将方法应用于数组/可枚举中的每个元素

安装 RVM:需求安装失败,状态为:1

是否有等效于 `Array::sample` 的哈希值?

如何在Ruby中返回两个字符串之间的字符串的子字符串?

如何在 Ruby 中使用gets和gets.chomp

发现 Ruby 对象成员?

Ruby全局匹配正则表达式?

Ruby Koans 的 test_sharing_hashes 中的附加问题的答案是什么?

错误数量的参数(1 代表 0)在 Ruby 中是什么意思?

如何在器上下文中运行 ruby​​ 脚本?

如何使用 Ruby-Rails 删除文件夹的所有内容?

严格将字符串转换为整数(或 nil)