在Vagrantfile中需要一个Vagrant插件?

Gol*_*den 74 vagrant

假设执行a Vagrantfile需要安装特定的Vagrant插件.所以,基本上你需要做的是

$ vagrant plugin install foobar-plugin
$ vagrant up
Run Code Online (Sandbox Code Playgroud)

如果跳过第一步,则vagrant up失败.

Vagrant中是否有一个选项可以让它自动安装插件?换句话说:Vagrantfile在创建和启动计算机之前,是否可以在哪个插件中指定自动安装?

Amo*_*ira 67

更新2018年8月31日:有关Vagrant的更高版本,请参阅下面的@ Starx修复程序

这是基于Louis St. Amour解决方案的版本以及Rob Kinyon关于重新执行的评论如果安装了新插件,我在我自己的设置中成功使用它:

required_plugins = %w(vagrant-share vagrant-vbguest...)

plugins_to_install = required_plugins.select { |plugin| not Vagrant.has_plugin? plugin }
if not plugins_to_install.empty?
  puts "Installing plugins: #{plugins_to_install.join(' ')}"
  if system "vagrant plugin install #{plugins_to_install.join(' ')}"
    exec "vagrant #{ARGV.join(' ')}"
  else
    abort "Installation of one or more plugins has failed. Aborting."
  end
end
Run Code Online (Sandbox Code Playgroud)

  • 绝对是目前最好的解决方案 (5认同)
  • 这没用.它进入了无限循环安装插件.不知何故,新的流浪者进程无法获取父流浪者进程中新安装的插件 (4认同)

Lou*_*our 51

由于我是一个Ruby开发人员,并且Bindler不再被维护,我发现在我的Vagrantfile顶部编写一些代码来安装所需的插件(如果丢失Vagrant.configure)是最自然的(例如在行之前)

以下适用于我:

required_plugins = %w( vagrant-hostmanager vagrant-someotherplugin )
required_plugins.each do |plugin|
  system "vagrant plugin install #{plugin}" unless Vagrant.has_plugin? plugin
end
Run Code Online (Sandbox Code Playgroud)

system,与使用反引号不同,将命令回显到stdout,就像自己运行命令一样.这样我就不需要另一个奇怪命名的插件或系统来跟踪所需的插件,无论如何都可以通过Vagrant进行更新.

  • 您需要'exec'vagrant#{ARGV.join''}"'以便在安装插件的情况下重启vagrant进程. (8认同)
  • 在shell级别上使用`Vagrant.has_plugin?`命令或者只需要'vagrant plugin install`检查插件是否已存在就太棒了. (2认同)

fgr*_*ehm 48

正如我在回答您的其他问题时指出的那样,您可以使用bindler使用单个命令安装一组特定于项目的插件.

如果安装了bindler并且没有安装所需的插件,bindler将会出错并将中止该进程.还有一个与自动安装插件有关的未解决的问题,vagrant up但到目前为止还没有人注册.

如果您不想使用bindler,则可以Vagrant.has_plugin?在您的顶部使用(在1.3.0+上可用),Vagrantfile如果未安装所需的插件,则会出错.

就像是:

unless Vagrant.has_plugin?("vagrant-some-plugin")
  raise 'some-plugin is not installed!'
end

Vagrant.configure("2") do |config|
  config.vm.box = "box-name"
end
Run Code Online (Sandbox Code Playgroud)

更新:Bindler不再受支持,截至2015年5月11日,Vagrant核心未提供相应的功能

  • 对于未来的Google员工,请注意这个答案有点过时了.您现在可以在Vagrant将检查的`:plugins`组下的`Gemfile`中指定您的依赖项.有关详细信息,请参阅下面的答案. (14认同)
  • `Gemfile`用于Vagrant插件开发.请参阅https://github.com/mitchellh/vagrant/issues/8370 (2认同)

Jon*_*der 10

请注意,从Vagrant 1.5开始,您可以指定您的依赖项Gemfile.根据更新博客文章:

现在,Vagrant 1.5将自动加载Gemfile中"plugins"组中的任何gem.举个例子,这里是"vagrant-bar"插件的Gemfile:

source "https://rubygems.org"

group :development do
  gem "vagrant",
    git: "https://github.com/mitchellh/vagrant.git"
end

group :plugins do
  gem "vagrant-foo",
  gem "vagrant-bar", path: "."
end
Run Code Online (Sandbox Code Playgroud)

  • 这篇博文不是指Vagrant*插件*开发吗?Vagrant*box*通常没有Gemfiles,他们使用Vagrantfiles. (8认同)
  • 谢谢,这很有帮助.由于许多Vagrant用户不是ruby devs并且还没有`Gemfile`,你介意解释一下你如何设置它吗?我创建了一个类似于你的例子,但`vagrant up`不会自动加载任何东西.试过`bundle install`但是这提示系统Rubygems权限,这听起来不对. (7认同)

Mor*_*unz 10

2019更新:Vagrant现在具有通过以下方式要求插件的功能Vagrantfile

Vagrant.configure("2") do |config|
  config.vagrant.plugins = "vagrant-some-plugin"

  # or as array:
  config.vagrant.plugins = ["vagrant-some-plugin", "vagrant-some-other-plugin"]

  # or as hash
  config.vagrant.plugins = {"vagrant-some-plugin" => {"version" => "1.0.0"}}
end
Run Code Online (Sandbox Code Playgroud)

参见https://www.vagrantup.com/docs/vagrantfile/vagrant_settings.html

  • 如果我想跳过提示并自动安装所有必需的插件怎么办? (3认同)

小智 6

无法对Louis St-Amour的回答添加评论,但我想发布这个以防万一有人需要帮助扩展他的解决方案.

# Check for missing plugins
required_plugins = %w(vagrant-list)
plugin_installed = false
required_plugins.each do |plugin|
  unless Vagrant.has_plugin?(plugin)
    system "vagrant plugin install #{plugin}"
    plugin_installed = true
  end
end

# If new plugins installed, restart Vagrant process
if plugin_installed === true
  exec "vagrant #{ARGV.join' '}"
end
Run Code Online (Sandbox Code Playgroud)