Передать переменные среды в Vagrant shell provisioner


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

VAR=123 vagrant up

в Vagrantfile:

ENV['VAR']

как мне это сделать с :shell поставщица? Просто делать это, кажется, не работает:

$VAR
12 62

12 ответов:

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

используйте его вот так в вашем Vagrantfile:

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

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

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

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

Я пришел с этим решением для подготовки на основе 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

для потомков (ака в случае, если я снова гуглить)... Можно передавать пары ключ-значение через 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

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

можно использовать #{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 содержит одинарные кавычки, все будет сломано.

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

большинство из этих ответов, кажется, устарели. С 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"

вот как у меня это работает.

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

вы можете просто указать shell используя inlineв своем Vagrantfile file:

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 вверх и иметь его в объеме поваренной книги шеф-повара?

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

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

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

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