将环境变量传递给vagrant shell provisioner

Abd*_*aly 70 environment-variables vagrant

vagrant up如果您使用Ruby配置器,则在调用时看起来像传递环境变量很简单:

VAR=123 vagrant up
Run Code Online (Sandbox Code Playgroud)

在Vagrantfile中:

ENV['VAR']
Run Code Online (Sandbox Code Playgroud)

如何使用:shell配置程序执行此操作?简单地这样做似乎不起作用:

$VAR
Run Code Online (Sandbox Code Playgroud)

ger*_*ijk 68

从Vagrant 1.8.0开始,你可以忘记其他答案的丑陋黑客.只需使用envshell provisioner(docs)选项即可.

在你的Vagrantfile中使用它:

config.vm.provision "shell", path: "provisionscript.sh", env: {"MYVAR" => "value"}
Run Code Online (Sandbox Code Playgroud)

这将仅为配置脚本设置环境.如果您需要为VM中的所有进程设置持久性环境变量,则这超出了Vagrant配置的范围,请在此处查看:vagrant文​​件中的Shell环境变量仅在首次传递时传递.

  • @spyle我正在运行Vagrant 1.8.5(在Mac OS X 10.11.6上使用VirtualBox 5.1.2)并且`env`与`inline`一起工作。 (2认同)

Abd*_*aly 41

这不是理想的,但我现在让它工作:

config.vm.provision "shell" do |s|
    s.inline = "VAR1 is $1 and VAR2 is $2"
    s.args   = "#{ENV['VAR1']} #{ENV['VAR2']}"
end
Run Code Online (Sandbox Code Playgroud)

  • 你应该在`s.args`里面有一个逗号吗? (4认同)
  • 你也可以用`s.path`替换`s.inline`并使用你用`:path =>""`传递的相同脚本.(我的供应商是数百行,因此不适合内联.) (3认同)
  • 或者,使用带有`:args =>""参数的ruby方法,[如此](http://stackoverflow.com/questions/15461898/passing-variable-to-a-shell-script-provisioner-in -流浪汉). (3认同)

Biv*_*vas 16

我为基于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
Run Code Online (Sandbox Code Playgroud)

完成Vagrantfile可以在这里找到 https://gist.github.com/bivas/6192d6e422f8ff87c29d


Al *_*sky 15

对于后代(又如我再次谷歌)...可以通过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
Run Code Online (Sandbox Code Playgroud)

然后在你的脚本中引用它们:

export AWS_ACCESS_KEY_ID=${AWS_ACCESS_KEY}
export AWS_SECRET_ACCESS_KEY=${AWS_SECRET_KEY}
Run Code Online (Sandbox Code Playgroud)

奖金功能:

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


Mat*_*fer 7

如果有人最终在配置脚本的环境中寻找如何设置变量,这对我有用.

config.vm.provision :shell, :inline => <<-SH
  export GRAPHITE_HOST=192.168.33.10
  /vagrant/install_app_with_monitoring.sh
SH
Run Code Online (Sandbox Code Playgroud)

请注意,这假设您在/vagrantVM上共享工作目录,但这应该是默认值.


Mar*_*nas 6

您可以#{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
Run Code Online (Sandbox Code Playgroud)

该示例取自有效的Vagrantfile。

这有一些缺点:如果$ VAR包含单引号,则事情会中断。


OZZ*_*ZIE 6

这些答案中的大多数似乎已经过时了。使用 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"
Run Code Online (Sandbox Code Playgroud)