web-dev-qa-db-ja.com

環境変数をVagrant Shellプロビジョニング機能に渡す

Rubyプロビジョニングツールを使用している場合、vagrant upを呼び出すときに環境変数を渡すのは簡単です:

VAR=123 vagrant up

Vagrantfileで:

ENV['VAR']

:Shellプロビジョニングツールでこれを行うにはどうすればよいですか?単にこれを行うだけではうまくいかないようです:

$VAR
70
Abdullah Jibaly

それは理想的ではありませんが、私はこれを今のところ働かせました:

config.vm.provision "Shell" do |s|
    s.inline = "VAR1 is $1 and VAR2 is $2"
    s.args   = "#{ENV['VAR1']} #{ENV['VAR2']}"
end
41
Abdullah Jibaly

Vagrant 1.8.0以降 他の回答のotherいハックはここで忘れることができます。シェルプロビジョニングツールにenvオプションを使用するだけです( docs )。

Vagrantfileで次のように使用します。

config.vm.provision "Shell", path: "provisionscript.sh", env: {"MYVAR" => "value"}

これにより、プロビジョニングスクリプトのみの環境が設定されます。 VMのすべてのプロセスに永続的な環境変数セットが必要な場合、これはVagrantプロビジョニングの範囲外であり、ここを参照してください: vagrantファイルのシェル環境変数は最初にのみ渡されます

65
gertvdijk

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

16
Bivas

後世のために(別名私がもう一度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は環境変数値の引用を処理しますが、キーは変更されません

14
Al Belsky

誰かがプロビジョニングスクリプトの環境で変数を設定する方法を探すことになった場合、これはうまくいきました。

config.vm.provision :Shell, :inline => <<-SH
  export GRAPHITE_Host=192.168.33.10
  /vagrant/install_app_with_monitoring.sh
SH

これは、作業ディレクトリをVM上の/vagrantとして共有していることを前提としていますが、これがデフォルトである必要があります。

7
Mat Schaffer

インラインスクリプト内で#{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に一重引用符が含まれていると、問題が発生します。

5
Marius Gedminas

これらの答えのほとんどは時代遅れのようです。 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"
3
OZZIE

vagrant-env プラグインはまさにこれを行います。これを使用して、Vagrantファイルにロードされるローカルディレクトリの.envファイルに環境変数を追加できます。 .env.gitignoreに保管することをお勧めします。これにより、プライバシーが保証されます。

2
Shairon Toledo

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を使用します。

参照: Vagrantでパラメーターを渡し、Chefクックブックの範囲に含める方法

1
kenorb

これがどのように機能するかです。

気まぐれなパペットプロビジョニングツールの使用から、シェルプロビジョニングツールの使用に移行しました。これは主に、ルートとして実行しないようにパペットしたかったためです。シェルプロバイダーは: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
1
Kuberchaun