Rubyプロビジョニングツールを使用している場合、vagrant up
を呼び出すときに環境変数を渡すのは簡単です:
VAR=123 vagrant up
Vagrantfileで:
ENV['VAR']
:Shell
プロビジョニングツールでこれを行うにはどうすればよいですか?単にこれを行うだけではうまくいかないようです:
$VAR
それは理想的ではありませんが、私はこれを今のところ働かせました:
config.vm.provision "Shell" do |s|
s.inline = "VAR1 is $1 and VAR2 is $2"
s.args = "#{ENV['VAR1']} #{ENV['VAR2']}"
end
Vagrant 1.8.0以降 他の回答のotherいハックはここで忘れることができます。シェルプロビジョニングツールにenv
オプションを使用するだけです( docs )。
Vagrantfileで次のように使用します。
config.vm.provision "Shell", path: "provisionscript.sh", env: {"MYVAR" => "value"}
これにより、プロビジョニングスクリプトのみの環境が設定されます。 VMのすべてのプロセスに永続的な環境変数セットが必要な場合、これはVagrantプロビジョニングの範囲外であり、ここを参照してください: vagrantファイルのシェル環境変数は最初にのみ渡されます 。
CentOSベースのプロビジョニング用にこのソリューションを使用しました。必要なすべての環境変数を/etc/profile.d/vagrant.sh
ファイルに配置し、プロビジョニングスクリプトでアクセスします。
要するに:
$before_script = <<SCRIPT
echo # vagrant profile script > /etc/profile.d/vagrant.sh
echo export ENV_VAR1=foo.com/bar >> /etc/profile.d/vagrant.sh
echo export ENV_VAR2=bar.com/foo >> /etc/profile.d/vagrant.sh
chmod +x /etc/profile.d/vagrant.sh
SCRIPT
$after_script = <<SCRIPT
rm -rf /etc/profile.d/vagrant.sh
SCRIPT
config.vm.provision "Shell", inline: $before_script
config.vm.provision "Shell", path: "build.sh"
config.vm.provision "Shell", inline: $after_script
完全なVagrantfile
はここにあります https://Gist.github.com/bivas/6192d6e422f8ff87c29d
後世のために(別名私がもう一度Googleで検索する場合)... env を介してキーと値のペアを渡すことができます。
box.vm.provision :Shell do |s|
s.env = {AWS_ACCESS_KEY:ENV['AWS_ACCESS_KEY'], AWS_SECRET_KEY:ENV['AWS_SECRET_KEY']}
s.path = 'scripts/bootstrap.sh'
end
次に、スクリプトでそれらを参照します。
export AWS_ACCESS_KEY_ID=${AWS_ACCESS_KEY}
export AWS_SECRET_ACCESS_KEY=${AWS_SECRET_KEY}
ボーナス機能:
Vagrantは環境変数値の引用を処理しますが、キーは変更されません
誰かがプロビジョニングスクリプトの環境で変数を設定する方法を探すことになった場合、これはうまくいきました。
config.vm.provision :Shell, :inline => <<-SH
export GRAPHITE_Host=192.168.33.10
/vagrant/install_app_with_monitoring.sh
SH
これは、作業ディレクトリをVM上の/vagrant
として共有していることを前提としていますが、これがデフォルトである必要があります。
インラインスクリプト内で#{ENV['VAR']}
を使用できます。例:
config.vm.provision "Shell", inline: <<-END
...
# Install my dotfiles are there. If you're in a hurry you can do
# SKIP_DOTFILES=1 vagrant up
if ! [ -d /home/vagrant/dotfiles ] && [ -z '#{ENV['SKIP_DOTFILES']}']; then
if ! [ -x /usr/bin/git ]; then
DEBIAN_FRONTEND=noninteractive apt-get install -y git
fi
su - vagrant -c 'git clone https://github.com/mgedmin/dotfiles'
su - vagrant -c 'dotfiles/install.sh'
fi
...
END
動作中のVagrantfileからの例。
これにはいくつかの欠点があります。$ VARに一重引用符が含まれていると、問題が発生します。
これらの答えのほとんどは時代遅れのようです。 Vagrant 2.1.1では、これがうまくいきました:
VAGRANTFILE_API_VERSION = "2" //...
machine.vm.provision "Shell",
env: {
"ELASTIC_XMS" => servers["elastic"]["memory_xms"],
"ELASTIC_XMX" => servers["elastic"]["memory_xmx"]
},
inline: "sed -i -e \"s/-Xms.*/$ELASTIC_XMS/g\" /etc/elasticsearch/jvm.options"
vagrant-env プラグインはまさにこれを行います。これを使用して、Vagrant
ファイルにロードされるローカルディレクトリの.env
ファイルに環境変数を追加できます。 .env
を.gitignore
に保管することをお勧めします。これにより、プライバシーが保証されます。
Shell
ファイルにinline
を使用して、Vagrantfile
を指定するだけです。
config.vm.provision "Shell", inline: %Q(/usr/bin/env FOO=1 BAR=1 bash /path/to/script.sh)
または、YAMLファイルからいくつかの追加変数をロードします。
require 'yaml'
dir = File.dirname(File.expand_path(__FILE__))
vconfig = YAML::load_file("#{dir}/config.yml")
config.vm.provision "Shell", inline: %Q(/usr/bin/env FOO=#{vconfig['foo']} bash /path/to/script.sh)
あるいは、コマンドラインからいくつかのオプションの引数を実装することもできます、例えば:
# Parse optional arguments.
opts = GetoptLong.new(
[ '--foo', GetoptLong::OPTIONAL_ARGUMENT ], # With optional parameter.
[ '--bar', GetoptLong::OPTIONAL_ARGUMENT ], # With optional parameter.files.
)
opts.each do |opt, arg|
case opt
when '--foo'
foo==arg
when '--bar'
bar=arg
end
end
次にopt['--foo'].to_s
を使用します。
これがどのように機能するかです。
気まぐれなパペットプロビジョニングツールの使用から、シェルプロビジョニングツールの使用に移行しました。これは主に、ルートとして実行しないようにパペットしたかったためです。シェルプロバイダーは:privileged => falseを提供します。
私の古い方法:
config.vm.provision :puppet do |puppet|
puppet.module_path = ENV.fetch('MODULES_PATH', 'modules')
puppet.manifests_path = ENV.fetch('MANIFESTS_PATH', 'manifests')
puppet.manifest_file = ENV.fetch('MANIFEST_FILE', 'site.pp')
puppet.options = "--debug"
end
私の新しい方法:
config.vm.provision :Shell, :privileged => false do |Shell|
Shell.inline = "puppet apply --debug --modulepath '/vagrant/#{ENV.fetch('MODULES_PATH', 'modules')}' --detailed-exitcodes '/vagrant/#{ENV.fetch('MANIFESTS_PATH', 'manifests')}/#{ENV.fetch('MANIFEST_FILE', 'site.pp')}'"
end