一般的に質問に答えてほしいのですが、それを説明するために、ここにユースケースがあります:
シンプルなLMAPプロジェクトにVagrantを使用しています。プロビジョニングにはスタンドアロンのPuppetを使用します。現在、プロキシの背後に座っている開発者がいて、VMに対して追加の構成を行う必要がある場合があります。 Puppet側で作業しているものがあります。プロキシIP(存在する場合)をVagrantfile
のパペットにファクトとして渡すことができ、Puppetは設定されている場合はそれに応じて反応します。
唯一の問題は、開発者が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
...また、メインVagrantfile
で作成した他のすべてのパペット設定値を「リセット」します。これにより、ここで間違った方向に進んでいると思われます。私はRuby;)の完全な初心者です。
誰でも私にここで一般的に開発者ごとのカスタマイズを行う方法についてのヒントや実用的なソリューションを教えてもらえますか?
環境変数を使用して、ファイル自体を編集せずに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 からのものです
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
すべてのVagrantボックスに適用される設定を定義する準備ができている場合、「Vagrantは実際に一連のVagrantfileをロードし、設定をそのままマージする」ことに注意する価値があります。 (参照 https://docs.vagrantup.com/v2/vagrantfile/ )
だから、~/.vagrant.d/Vagrantfile
RAM Vagrantボックスの量を増やすには:
Vagrant.configure(2) do |config|
config.vm.provider "virtualbox" do |vb|
vb.memory = 2048
end
end
これがアイデアです。それは「ugい」と「間違っている」かもしれませんが、少なくとも、それは動作します:)
# 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
Nugrant plugin が解決するために作成された正確なユースケースだと思います。各開発者は、カスタム設定値を指定するYAMLで.vagrantuser
(.gitignore-edファイル)を使用し、Vagrantfile
でこれらの値を簡単に参照できます。
あなたの場合、プロキシされた開発者は.vagrantuser
ファイルを次のようにします。
proxy: 'proxy.Host:80'
そして、あなたのVagrantfile
は次のようになります(擬似コード、Rubyはあまり知りません):
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
)ファイルをバンドルする必要があります。
@Willie Wheelerの回答を拡張します。私のセットアップは次のとおりです。
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ごとの設定とマージします。また、開発者が実際に変更できる値は明らかです。
vagrant-proxyconf プラグインの使用を検討してください。すべてのVagrant VMのプロキシをグローバルに設定できます。
別の解決策は、プロビジョニング中に外部シェルスクリプトを実行することです。 Vagrantfile
の先頭に別のconfig.vm.provision
セクションを使用して、それを実行します。
# 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