在Vagrantfile中需要一个Vagrant插件?

时间:2013-10-21 11:01:52

标签: vagrant

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

$ vagrant plugin install foobar-plugin
$ vagrant up

如果您跳过第一步,vagrant up将失败。

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

12 个答案:

答案 0 :(得分:67)

更新2018年8月31日:有关Vagrant的更高版本(1.8及更高版本),请参阅下面的@ 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

答案 1 :(得分:50)

由于我是一个Ruby开发人员,并且Bindler不再被维护,我发现在我的Vagrant文​​件顶部编写一些代码以便在缺少时安装所需的插件是最自然的(例如在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

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

答案 2 :(得分:48)

在我pointed out on my answer to your other question时,您可以使用bindler使用单个命令安装一组特定于项目的插件。

如果安装了bindler并且没有安装所需的插件,bindler将会出错并将中止该进程。还有an open issue与在vagrant up上自动安装插件相关,但到目前为止还没有人注册过它。

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

类似的东西:

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

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

答案 3 :(得分:11)

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

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

答案 4 :(得分:10)

请注意,从Vagrant 1.5开始,您可以在Gemfile中指定依赖项。根据{{​​3}}:

  

现在,Vagrant 1.5会自动加载"插件中的任何宝石。   您的Gemfile中的组。举个例子,这里是一个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

答案 5 :(得分: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

答案 6 :(得分:3)

在新版本的Vagrant上,@ Amos Shapira的回答陷入了无限循环。这样做的原因是,每次对select name from Products where id = ? 的调用也会处理vagrant plugin install,并在处理后执行与一次又一次地安装插件有关的代码。

这是我避免循环的解决方案。

Vagrantfile

答案 7 :(得分:1)

我在这里注意到http://docs.vagrantup.com/v2/plugins/packaging.html一条指令

Vagrant.require_plugin "vagrant-aws"

与fgrehm的描述完全相同:如果未安装插件,则会快速引发错误。

据我所知,暂时无法自动安装插件

答案 8 :(得分:1)

我的答案非常接近Louis St-Amour's answer,但不是自动安装插件,而是提出错误消息,以便用户必须手动安装插件。

我希望用户知道任何已安装的插件,因为它们全局应用于所有Vagrant实例,而不仅仅是当前的Vagrant文​​件。

Vagrantfile这样的一行放在每个插件的顶部,在此示例中为vagrant-vbguest

 raise "vagrant-vbguest plugin must be installed" unless Vagrant.has_plugin? "vagrant-vbguest"

答案 9 :(得分:1)

您可以使用此项目(我是作者):https://github.com/DevNIX/Vagrant-dependency-manager

它基于类似的答案,但试图更完整和稳定。这个想法的最大优点是,您可以分发您的Vagrant文​​件,它将在每台计算机上运行,​​无论该环境中安装的插件是什么。

易于使用:

  1. 复制Vagrantfile旁边的dependency_manager.rb
  2. 包含它并调用check_plugins将依赖项作为数组传递

    示例:

    # -*- mode: ruby -*-
    # vi: set ft=ruby :
    
    require File.dirname(__FILE__)+"./dependency_manager"
    
    check_plugins ["vagrant-exec", "vagrant-hostsupdater", "vagrant-cachier", "vagrant-triggers"]
    
    Vagrant.configure(2) do |config|
    
      config.vm.box = "base"
    
    end
    
  3. ???

  4. 利润!

  5. 我很想合并拉取请求,解决您可能遇到的任何问题,并获得新功能的想法。目前我正在考虑更新依赖管理器本身,并需要特定的插件版本:D

    问候!

答案 10 :(得分:0)

我遇到了新安装的Vagrant的问题,但尚未创建.vagrant.d目录。我能够通过捕捉异常来制作Luis St. Amour的片段。

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

begin
    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
rescue
    exec "vagrant #{ARGV.join(' ')}"
end

答案 11 :(得分:0)

这是我在Vagrant 1.8上使用的,它运行正常。把它放在Vagrantfile中配置块之前的某个地方。

# install required plugins if necessary
if ARGV[0] == 'up'
    # add required plugins here
    required_plugins = %w( plugin1 plugin2 plugin3 )
    missing_plugins = []
    required_plugins.each do |plugin|
        missing_plugins.push(plugin) unless Vagrant.has_plugin? plugin
    end

    if ! missing_plugins.empty?
        install_these = missing_plugins.join(' ')
        puts "Found missing plugins: #{install_these}.  Installing using sudo..."
        exec "sudo vagrant plugin install #{install_these}; vagrant up"
    end
end