将环境variables传递给stream浪shell供应商

如果您使用Rubyconfiguration器,调用vagrant up时看起来像传递环境variables很简单:

 VAR=123 vagrant up 

在Vagrantfile中:

 ENV['VAR'] 

如何使用:shellconfiguration程序执行此操作? 简单地做这个似乎不工作:

 $VAR 

从Vagrant 1.8.0开始,你可以在这里忘记其他答案的丑陋黑客。 只需使用shellconfiguration程序的env选项( docs )。

在你的Vagrantfile中像这样使用它:

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

这将仅设置供应脚本的环境。 如果您需要为虚拟机中的所有进程设置持久性环境variables,则超出了Vagrantconfiguration的范围,请参阅此处: 迁移文件中的Shell环境variables只会首先传递 。

这不是理想的,但我现在得到这个工作:

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

我提供了基于CentOS的configuration的解决scheme:将所有必需的环境variables放在/etc/profile.d/vagrant.sh文件中,然后在任何configuration脚本中访问。

简而言之:

  $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可以在这里findhttps://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} 

奖金function:

Vagrant将处理环境variables值的引用,但密钥保持不变

当有人最终寻找如何在configuration脚本的环境中设置variables时,这对我有用。

 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-env插件正是这样做的。 有了它,你可以将环境variables添加到本地目录中的.env文件中,该文件将被加载到Vagrant文件中。 我build议把.env在你的.gitignore ,这样你的隐私得到了保证。

这是我如何工作。

我从使用stream浪者的木偶提供者的方式去使用shell提供者。 我这样做主要是因为我想傀儡不作为根运行,shell提供商给你:特权=>虚假。

我的老路:

 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 

您可以简单地在您的Vagrantfile文件中使用inline指定shell

 config.vm.provision "shell", inline: %Q(/usr/bin/env FOO=1 BAR=1 bash /path/to/script.sh) 

或者从YAML文件加载一些额外的variables:

 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 Cookbook的范围内?

这对我工作

 VAGRANTFILE_API_VERSION = "2" kettle_dir = ENV['KETTLE_DIR'] Vagrant.configure(VAGRANTFILE_API_VERSION) do |config| config.vm.synced_folder kettle_dir, "/pentaho" config.vm.box = "ubuntu/trusty64" end 

在ubutnu框中,我只是在我的bootstrap.sh中做了以下操作:

 echo "DBHOST=localhost" >> /etc/environment echo "DBNAME=foo" >> /etc/environment echo "DBUSER=root" >> /etc/environment echo "DBPASSWD=root" >> /etc/environment