Схоже, передача змінних середовища під час виклику vagrant up
проста, якщо ви використовуєте провайдер Ruby:
VAR=123 vagrant up
У файлі Vagrant:
ENV['VAR']
Як це зробити з :shell
провізором? Просто робити це, здається, не працює:
$VAR
Схоже, передача змінних середовища під час виклику vagrant up
проста, якщо ви використовуєте провайдер Ruby:
VAR=123 vagrant up
У файлі Vagrant:
ENV['VAR']
Як це зробити з :shell
провізором? Просто робити це, здається, не працює:
$VAR
Відповіді:
З Vagrant 1.8.0 ви можете забути потворні хаки з інших відповідей тут. Просто використовуйте env
опцію для постачальника оболонки ( docs ).
Використовуйте його так у вашому файлі Vagrant:
config.vm.provision "shell", path: "provisionscript.sh", env: {"MYVAR" => "value"}
Це встановить середовище лише для сценарію підготовки. Якщо вам потрібен постійний набір змінних середовища для всіх процесів у віртуальній машині, це виходить за рамки надання Vagrant і дивіться тут: Змінні середовища оболонки у файлах бродяги передаються лише спочатку .
env
з inline
.
config.vm.provision :shell, path: "bootstrap.sh", env: {"MYSQL_DB_USERNAME"=>"django", "MYSQL_DB_PASSWORD"=>"supersecretpasswordwasreplaced"}
з іншого боку os.environ['MYSQL_DB_USERNAME']
видає ключову помилку :(
Це не ідеально, але поки що я працюю так:
config.vm.provision "shell" do |s|
s.inline = "VAR1 is $1 and VAR2 is $2"
s.args = "#{ENV['VAR1']} #{ENV['VAR2']}"
end
s.inline
на s.path
і використовувати той же сценарій , ви б пройшли з :path => ""
. (Мій
s.args
?
Для нащадків (він же на випадок, якщо я знову загуглю) ... Можна передати пари ключ-значення через 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 буде обробляти цитування значень змінних середовища, але клавіші залишаються недоторканими
Я запропонував це рішення для підготовки на основі 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['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
Приклад взято з робочого файлу Vagrant.
У цього є деякі недоліки: якщо $ VAR містить одинарні лапки, все зламається.
Якщо хтось в кінцевому підсумку шукає, як встановити змінні в середовищі сценарію підготовки, це спрацювало для мене.
config.vm.provision :shell, :inline => <<-SH
export GRAPHITE_HOST=192.168.33.10
/vagrant/install_app_with_monitoring.sh
SH
Зверніть увагу, що це передбачає, що ви ділитесь своїм робочим каталогом як /vagrant
на віртуальній машині, але це має бути за замовчуванням.
install_app_with_monitoring.sh
?
private_network
і GRAPHITE_HOST
. Можна навіть зробити крок далі і використовувати export GRAPHITE_HOST=#{ip}
для посилання на єдиний загальний рубіновий var.
Більшість із цих відповідей застарілі. З 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"
Бродяга-окр плагін робить саме це. За допомогою нього ви можете додавати змінні середовища до .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 і включити його в обсяг кулінарної книги шеф-кухаря?
це спрацювало для мене
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
env
здається , параметр працює лише при використанніpath
сценарію, а неinline
сценарію.