Ответ 1
Это не идеально, но я получил это для работы сейчас:
config.vm.provision "shell" do |s|
s.inline = "VAR1 is $1 and VAR2 is $2"
s.args = "#{ENV['VAR1']} #{ENV['VAR2']}"
end
Похоже, что передача переменных окружения при вызове vagrant up
проста, если вы используете средство создания Ruby:
VAR=123 vagrant up
В Vagrantfile:
ENV['VAR']
Как это сделать с помощью средства создания :shell
? Просто это не работает:
$VAR
Это не идеально, но я получил это для работы сейчас:
config.vm.provision "shell" do |s|
s.inline = "VAR1 is $1 and VAR2 is $2"
s.args = "#{ENV['VAR1']} #{ENV['VAR2']}"
end
Начиная с Vagrant 1.8.0 вы можете забыть об уродливых хаках из других ответов здесь. Просто используйте параметр env
для средства обеспечения оболочки (docs).
Используйте это в своем Vagrantfile:
config.vm.provision "shell", path: "provisionscript.sh", env: {"MYVAR" => "value"}
Это установит среду только для обеспечения script. Если вам нужна постоянная переменная окружения, установленная для всех процессов в виртуальной машине, это выходит за рамки для подготовки Vagrant и смотрите здесь: Переменные среды оболочки в бродячих файлах передаются только с первого раза.суб >
Я пришел с этим решением для создания на основе 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
Для потомков (иначе в случае, если я снова это сделаю 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 будет обрабатывать цитирование значений переменных среды, но ключи остаются нетронутыми
Если кто-то заканчивает поиск того, как устанавливать переменные в среде обеспечения script, это сработало для меня.
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 содержит одинарные кавычки, все сломается.
vagrant-env плагин делает именно это. С его помощью вы можете добавить переменные окружения в файл .env
в локальном каталоге, который будет загружен в файл Vagrant
. Я предлагаю сохранить .env
в вашем .gitignore
, таким образом, вы гарантируете свою конфиденциальность.
Вот как я работаю.
Я перешел от использования механизма марионетки для бродяг, чтобы просто использовать средство обеспечения оболочки. Я делал это главным образом потому, что я хотел, чтобы марионетка не запускалась как 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
:
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?
это сработало для меня
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