Передать переменные среды в резервное устройство для бродячих оболочек

Похоже, что передача переменных окружения при вызове vagrant up проста, если вы используете средство создания Ruby:

VAR=123 vagrant up

В Vagrantfile:

ENV['VAR']

Как это сделать с помощью средства создания :shell? Просто это не работает:

$VAR

Ответ 1

Это не идеально, но я получил это для работы сейчас:

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

Ответ 2

Начиная с Vagrant 1.8.0 вы можете забыть об уродливых хаках из других ответов здесь. Просто используйте параметр env для средства обеспечения оболочки (docs).

Используйте это в своем Vagrantfile:

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

Это установит среду только для обеспечения script. Если вам нужна постоянная переменная окружения, установленная для всех процессов в виртуальной машине, это выходит за рамки для подготовки Vagrant и смотрите здесь: Переменные среды оболочки в бродячих файлах передаются только с первого раза.суб >

Ответ 3

Я пришел с этим решением для создания на основе CentOS: поместив все мои обязательные переменные envioronment в файл /etc/profile.d/vagrant.sh, а затем он получил доступ в любом положении script.

:

  $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

Ответ 4

Для потомков (иначе в случае, если я снова это сделаю 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

Затем укажите их в script:

export AWS_ACCESS_KEY_ID=${AWS_ACCESS_KEY}
export AWS_SECRET_ACCESS_KEY=${AWS_SECRET_KEY}

Бонусная функция:

Vagrant будет обрабатывать цитирование значений переменных среды, но ключи остаются нетронутыми

Ответ 5

Если кто-то заканчивает поиск того, как устанавливать переменные в среде обеспечения script, это сработало для меня.

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

Обратите внимание, что это предполагает, что вы делите рабочий каталог как /vagrant на виртуальной машине, но это должно быть значение по умолчанию.

Ответ 6

Вы можете использовать #{ENV['VAR']} внутри встроенного script, например:

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 содержит одинарные кавычки, все сломается.

Ответ 7

vagrant-env плагин делает именно это. С его помощью вы можете добавить переменные окружения в файл .env в локальном каталоге, который будет загружен в файл Vagrant. Я предлагаю сохранить .env в вашем .gitignore, таким образом, вы гарантируете свою конфиденциальность.

Ответ 8

Вот как я работаю.

Я перешел от использования механизма марионетки для бродяг, чтобы просто использовать средство обеспечения оболочки. Я делал это главным образом потому, что я хотел, чтобы марионетка не запускалась как root, поставщик оболочки дает вам: 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

Ответ 9

Вы можете просто указать для 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?

Ответ 10

это сработало для меня

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

Ответ 11

В окне ubutnu я просто сделал следующее в моем bootstrap.sh:

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