58

一般的に質問に答えてほしいのですが、それを説明するために、ここにユースケースがあります:

単純なLMAPプロジェクトにVagrantを使用しています。プロビジョニングにはスタンドアロンのPuppetを使用しています。ここで、プロキシの背後に座っている開発者がいる可能性があり、VMに対して追加の構成を行う必要があります。Puppet側で作業していることがあります。プロキシIP(存在する場合)をファクトとしてPuppetに渡すことができ、VagrantfilePuppetが設定されている場合はそれに応じて反応します。

Vagrantfile私が抱えている唯一の問題は、開発者が(バージョン管理下にあり、dev-environment-neutralのままでなければならない)を変更せずに、開発環境のこの設定をどのように指定/オーバーライドできるかということです。

人々が例えば、と呼ばれるファイルのいくつかのVagrant設定をオーバーライドできれば素晴らしいVagrantfile.localと思いますが、これはを介して除外し.gitignoreます。

Vagrantfileは単なるRubyなので、次のことを試しました。

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

ファイルインクルードは基本的に機能しますが、インクルードされたファイルのように見えます。私はもう同じVagrantコンテキストにいません...

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

...また、メインで作成した他のすべてのpuppet構成値を「リセット」します。Vagrantfileこれにより、ここで間違った方向に向かっていると思います。私はRubyの完全な初心者であることに注意する必要があります;)

ここで開発者ごとのカスタマイズを一般的に行う方法について、ヒントや実用的なソリューションを教えてもらえますか?

4

8 に答える 8

91

これVagrantfileは単なるRubyなので、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
于 2014-05-11T05:53:09.407 に答える
28

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からのものです

于 2012-11-08T10:19:32.343 に答える
12

すべてのVagrantボックスに適用される設定を定義する準備ができている場合は、「Vagrantは実際に一連のVagrantfileをロードし、設定をマージしていく」ことに注意してください。(https://docs.vagrantup.com/v2/vagrantfile/を参照)

したがって~/.vagrant.d/Vagrantfile、VagrantボックスのRAMの量を増やすために、次のように定義しています。

Vagrant.configure(2) do |config|
    config.vm.provider "virtualbox" do |vb|
      vb.memory = 2048
    end
end
于 2014-07-30T01:36:10.110 に答える
6

ここにアイデアがあります。それは「醜い」と「間違っている」かもしれませんが、少なくとも、それは機能します:)

# 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ファイルは次のようになります。

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
于 2012-10-25T09:37:09.343 に答える
5

これが、 Nugrantプラグインが解決するために作成された正確なユースケースだと思います。これにより、各.vagrantuser開発者はYAMLにカスタム構成値を指定する(.gitignore-edファイル)を設定し、でこれらの値を簡単に参照できます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.example開発者が環境にコピーして調整できるように、サンプル/参照vagrantuser(つまり)ファイルをバンドルする必要があります。

于 2014-11-02T15:44:00.297 に答える
5

@WillieWheelerの答えを拡張します。私の設定は次のとおりです。

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

これにより、デフォルトの設定が開発ごとの構成にマージされます。また、開発者にとって、実際に変更できる値は明らかです。

于 2017-03-22T09:20:40.340 に答える
0

vagrant-proxyconfプラグインの使用を検討してください。これにより、すべてのVagrantVMのプロキシをグローバルに設定できます。

もう1つの解決策は、プロビジョニング中に外部シェルスクリプトを実行することです。私はそれを行うために最初に別config.vm.provisionのセクションを使用Vagrantfileします:

# reset: true below is needed to reset the connection to the VM so that new
# environment variables set in /etc/environment will be picked up in next
# provisioning steps
config.vm.provision "shell", reset: true, inline: <<-SHELL

  if [ -f /vagrant/Vagrantfile-settings.sh ]
  then
    /vagrant/Vagrantfile-settings.sh
  fi
SHELL

次に、Vagrantfile-settings.shファイルをの横に置き、Vagrantfileそれを(または何でも)に追加し、.gitignoreスクリプトを中に入れます。たとえば、インタラクティブターミナル、すべてのデーモン、およびDockerコンテナのプロキシを設定します。

# Proxy for interactive terminals
echo "http_proxy=http://PROXY_ADDRESS:PROXY_PORT" >> /etc/environment
echo "https_proxy=http://PROXY_ADDRESS:PROXY_PORT" >> /etc/environment
echo "no_proxy=127.0.0.1,localhost" >> /etc/environment
# Proxy for daemons (e.g. Docker deamon - used to pull images, apt - run from default daily cron job)
mkdir /etc/systemd/system.conf.d
echo [Manager] > /etc/systemd/system.conf.d/01-http-proxy.conf
echo "DefaultEnvironment=\"http_proxy=PROXY_ADDRESS:PROXY_PORT\"" >> /etc/systemd/system.conf.d/01-http-proxy.conf
echo "DefaultEnvironment=\"https_proxy=PROXY_ADDRESS:PROXY_PORT\"" >> /etc/systemd/system.conf.d/01-http-proxy.conf
echo "DefaultEnvironment=\"no_proxy=127.0.0.1,localhost\"" >> /etc/systemd/system.conf.d/01-http-proxy.conf
echo "# Docker requires upper-case http proxy environment variables..." >> /etc/systemd/system.conf.d/01-http-proxy.conf
echo "DefaultEnvironment=\"HTTP_PROXY=http://PROXY_ADDRESS:PROXY_PORT2\"" >> /etc/systemd/system.conf.d/01-http-proxy.conf
echo "DefaultEnvironment=\"HTTPS_PROXY=http://PROXY_ADDRESS:PROXY_PORT\"" >> /etc/systemd/system.conf.d/01-http-proxy.conf
echo "DefaultEnvironment=\"NO_PROXY=127.0.0.1,localhost\"" >> /etc/systemd/system.conf.d/01-http-proxy.conf
# Proxy for docker containers started with `docker run`
mkdir /home/vagrant/.docker
cat <<EOF > /home/vagrant/.docker/config.json
{
  "proxies": {
    "default": {
      "httpProxy": "http:/PROXY_ADDRESS:PROXY_PORT",
      "httpsProxy": "http://PROXY_ADDRESS:PROXY_PORT",
      "noProxy": "127.0.0.1,localhost"
    }
  }
}
EOF
chown -R vagrant:vagrant /home/vagrant/.docker
于 2019-07-03T12:25:02.623 に答える
-2

YAMLファイルから設定を読み込むことができます。これは、DrupalVMで次のように示されます。

# 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']
于 2016-01-07T15:47:32.413 に答える