我想这个问题一般要回答,而是为了说明,这里有一个用例:
我使用放浪一个简单LMAP项目。 我使用独立木偶的供应。 现在,有可能是一些开发商谁坐在后面的代理,他们将需要一些额外的配置,以对VM进行。 我有事情在日伪方面的工作:我可以通过代理服务器IP(如果有的话)作为一个事实在对木偶Vagrantfile
,如果它被设置木偶相应地做出反应。
我唯一的问题是:如何开发人员可以指定/覆盖此设置为他们的发展环境,而无需改变Vagrantfile
(这是版本控制之下,必须保持开发环境中性)?
如果是真棒,如果人们能够在一个名为如文件来覆盖一些流浪设置Vagrantfile.local
,我会通过排除.gitignore
。
由于Vagrantfile就是红宝石,我试过如下:
# 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
......也“复位”我在主所做的所有其他木偶配置值Vagrantfile
,这让我觉得我是在错误的方向前进在这里。 我要指出,我在红宝石共小白)
谁能给我如何每-dev的定制可以在这里完成一般的暗示,甚至是可行的解决方案?
Answer 1:
我会建议使用环境变量来动态改变的行为Vagrantfile
无需编辑文件本身。
举个真实的例子,这里是你如何可以使用默认的Ubuntu的基础框,但有一个环境变量定义其他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
Answer 2:
该Vagrantfile
就是红宝石,所以YAML是另一种选择。
例如,在Vagrantfile
我这样做:
# -*- mode: ruby -*-
# vi: set ft=ruby :
require 'yaml'
settings = YAML.load_file 'vagrant.yml'
db_ip_address = settings['db']['ip_address']
api_ip_address = settings['api']['ip_address']
Vagrant.configure("2") do |config|
config.vm.box = "ffuenf/ubuntu-13.10-server-amd64"
config.vm.box_url = "https://vagrantcloud.com/ffuenf/ubuntu-13.10-server-amd64/version/4/provider/virtualbox.box"
config.vm.define "db" do |db|
db.vm.synced_folder settings['db']['artifacts_dir']['host'], settings['db']['artifacts_dir']['guest']
db.vm.network "private_network", ip: db_ip_address
... other stuff ...
end
config.vm.define "api" do |api|
api.vm.synced_folder settings['api']['artifacts_dir']['host'], settings['api']['artifacts_dir']['guest']
api.vm.network "private_network", ip: api_ip_address
api.vm.network "forwarded_port", guest: settings['api']['forwarded_port']['guest'], host: settings['api']['forwarded_port']['host']
end
end
然后,我有一个vagrant.yml
文件(我只是做了名字;你可以使用任何你喜欢的名称)的开发人员专用配置:
db:
ip_address: 192.168.4.14
artifacts_dir:
host: /Users/willie/myapp/db-scripts
guest: /opt/myapp/db
api:
ip_address: 192.168.4.15
forwarded_port:
host: 9080
guest: 8080
artifacts_dir:
host: /Users/willie/myapp/artifacts
guest: /opt/myapp/api
Answer 3:
如果你正准备定义应用到所有流浪的箱子值得注意的是,设置“流浪实际上载入了一系列Vagrantfiles的,合并的设置,因为它去。” (参考文献https://docs.vagrantup.com/v2/vagrantfile/ )
所以,我有以下定义~/.vagrant.d/Vagrantfile
增加内存的容量为我的流浪框:
Vagrant.configure(2) do |config|
config.vm.provider "virtualbox" do |vb|
vb.memory = 2048
end
end
Answer 4:
这里有一个想法。 这可能是“丑”与“错”,但是,至少,它的工作原理:)
# file2.rb, this is your per-dev configuration file
puts "included external file which uses outer var: #{foo}"
# file1.rb, this would be your Vagrantfile
puts 'first'
foo = 'bar'
external = File.read 'file2.rb'
eval external
puts 'second'
让我们运行
$ ruby file1.rb
first
included external file which uses outer var: bar
second
适应你的榜样,file2.rb将包含只使用config
没有定义它( config
将从外部范围内提供)
config.vm.provision :puppet do |puppet|
puppet.facter = { "proxy" => "proxy.host:80" }
end
而你流浪的文件可能是这样的:
Vagrant::Config.run do |config|
external = File.read 'Vagrantfile.local'
eval external
# proceed with general settings here
config.vm.provision :puppet do |puppet|
puppet.facter = { "proxy" => "proxy.host:80" }
end
end
更新(另一个“数据驱动”的办法)
# Vagranfile.local
config_values[:puppet][:facter][:proxy] = 'proxy.host:80'
# Vargantfile
Vagrant::Config.run do |config|
config_values = {
puppet: {
facter: {
proxy: nil
},
manifests_file: 'my_manifest.pp'
}
}
external = File.read 'Vagrantfile.local'
eval external # this should overwrite proxy config
# proceed with general settings here
config.vm.provision :puppet do |puppet|
if config_values[:puppet][:facter][:proxy]
puppet.facter = { "proxy" => config_values[:puppet][:facter][:proxy] }
end
puppet.manifests_file = config_values[:puppet][:manifests_file]
end
end
Answer 5:
我相信这是确切使用情况Nugrant插件是为了解决。 它允许每个开发者具有的.vagrantuser
(这是一个的.gitignore-ED文件)YAML在指定自定义配置值然后在容易引用这些值Vagrantfile
。
在你的情况下,代理的开发者有其.vagrantuser
文件看起来像这样:
proxy: 'proxy.host:80'
而你Vagrantfile
是这样的(伪代码,我真的不知道红宝石):
Vagrant::Config.run do |config|
config.vm.provision :puppet do |puppet|
if config.user.has_key?('proxy')
puppet.facter = { "proxy" => config.user.proxy }
end
end
end
你应该捆绑样品/参考vagrantuser(即vagrantuser.example
)文件,您的开发者复制并调整他们的环境。
Answer 6:
为了延长@Willie惠勒的答案。 我的设置是:
Root
|-- defaults.yml
|-- env.yml
|-- Vagrantfile
Vagrantfile
# Load local env config
require 'yaml'
dir = File.dirname(File.expand_path(__FILE__))
# defaults
settings = YAML::load_file("#{dir}/defaults.yml")
if File.exist?("#{dir}/env.yml")
env_settings = YAML::load_file("#{dir}/env.yml")
settings.merge!(env_settings)
end
...
# Customize the amount of memory on the VM:
vb.memory = settings["vb"]["memory"]
defaults.yml
vb:
memory: 1024
env.yml
vb:
memory: 204
这将合并你与你的每-dev的配置无论默认值。 还有一点很清楚,开发商什么样的价值观,他们可以真正改变
Answer 7:
您可以加载从YAML文件中的设置。 这表现在Drupal的VM如下:
# Use config.yml for basic VM configuration.
require 'yaml'
dir = File.dirname(File.expand_path(__FILE__))
if !File.exist?("#{dir}/config.yml")
raise 'Configuration file not found! Please copy example.config.yml to config.yml and try again.'
end
vconfig = YAML::load_file("#{dir}/config.yml")
所以,你可以创建config.yml
这样的:
vagrant_box: geerlingguy/ubuntu1404
vagrant_user: vagrant
vagrant_ip: 192.168.88.88
在Vagrantfile
你可以使用变量:
config.vm.box = vconfig['vagrant_box']
config.vm.network "private_network", ip: vconfig['vagrant_ip']
文章来源: Override Vagrant configuration settings locally (per-dev)