重写局部流浪配置设置(每个DEV)(Override Vagrant configuration s

2019-07-02 14:23发布

我想这个问题一般要回答,而是为了说明,这里有一个用例:

我使用放浪一个简单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)
标签: ruby vagrant