Передать переменные среды в Vagrant shell provisioner
похоже на передачу переменных окружения при вызове vagrant up
просто, если вы используете Ruby provisioner:
VAR=123 vagrant up
в Vagrantfile:
ENV['VAR']
как мне это сделать с :shell
поставщица? Просто делать это, кажется, не работает:
$VAR
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 вверх и иметь его в объеме поваренной книги шеф-повара?