vagrant up
如果您使用的是Ruby供应器,则在调用时很简单,就像传递环境变量一样:
VAR=123 vagrant up
在Vagrantfile中:
ENV['VAR']
我如何通过预配器执行此操作:shell
?只是这样做似乎不起作用:
$VAR
vagrant up
如果您使用的是Ruby供应器,则在调用时很简单,就像传递环境变量一样:
VAR=123 vagrant up
在Vagrantfile中:
ENV['VAR']
我如何通过预配器执行此操作:shell
?只是这样做似乎不起作用:
$VAR
Answers:
从Vagrant 1.8.0开始,您可以在这里忘记其他答案中的难看技巧。只需使用env
shell配置程序(docs)的选项即可。
在您的Vagrantfile中像这样使用它:
config.vm.provision "shell", path: "provisionscript.sh", env: {"MYVAR" => "value"}
这将仅为配置脚本设置环境。如果您需要为VM中的所有进程设置一个持久性环境变量集,则这超出了Vagrant设置的范围,请查看此处:vagrant文件中的Shell环境变量仅在第一次传递时传递。
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 => ""
。(我的供应商有数百条线路,因此不适合内联。)
:args => ""
参数一起使用,例如。
s.args
吗?
我提供了用于基于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将处理环境变量值的引用,但键保持不变
您可以#{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
该示例取自有效的Vagrantfile。
这有一些缺点:如果$ VAR包含单引号,则事情会中断。
如果有人最终在配置脚本的环境中寻找如何设置变量的方法,这对我很有用。
config.vm.provision :shell, :inline => <<-SH
export GRAPHITE_HOST=192.168.33.10
/vagrant/install_app_with_monitoring.sh
SH
请注意,这是假设您要像/vagrant
在VM上一样共享工作目录,但这应该是默认目录。
install_app_with_monitoring.sh
呢?
private_network
and之间的奇偶性GRAPHITE_HOST
。甚至可以更进一步,并用于export GRAPHITE_HOST=#{ip}
引用单个常见的红宝石变种。
这些答案大多数似乎已过时。使用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插件正是这样做的。使用它,您可以将环境变量添加到.env
本地目录中的文件中,然后将其加载到Vagrant
文件中。我的建议是将.env
你的.gitignore
,这样你有你的隐私保证。
这就是我的工作方式。
我从使用无所事事的木偶供应商方式转变为仅使用外壳供应商。我这样做主要是因为我想伪造不要以root身份运行,shell提供程序为您提供: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
。
这对我有用
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
脚本时才起作用。