Требовать плагин Vagrant в Vagrantfile?



предполагается выполнение a Vagrantfile требуется установить определенный плагин Vagrant. Так, в основном то, что вам нужно сделать, это



$ vagrant plugin install foobar-plugin
$ vagrant up


если вы пропустите первый шаг, vagrant up не удается.



есть ли возможность в Vagrant, чтобы сделать его установить плагин автоматически? Другими словами: можно ли указать в Vagrantfile какие плагины необходимо установить автоматически перед созданием и загрузкой машины?

625   11  

11 ответов:

Как Я указал на мой ответ на другой ваш вопрос, вы можете использовать биндлер для установки набора плагинов, специфичных для проекта с помощью одной команды.

если bindler установлен, а необходимый плагин нет, bindler выдаст ошибку и прервет процесс. Есть также открытый вопрос связанные с автоматической установкой плагинов на vagrant upS, но до сих пор никто не подписался на это.

если вы не хотите используйте 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

обновление: Bindler больше не поддерживается, и эквивалентная функциональность не была предоставлена Vagrant core по состоянию на 11 мая 2015 года

обновление 31 августа 2018: смотрите исправление @Starx ниже для более поздних версий Vagrant

вот версия, основанная на решении Louis St. Amour вместе с комментарием Роба Киньона о re-exec если новый плагин был установлен, я успешно использую его в своей собственной настройке:

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

поскольку я разработчик 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

system, в отличие от использования backticks, будет повторять команду в stdout, так же, как и сама команда. И таким образом мне не нужен еще один странно названный плагин или система, чтобы отслеживать необходимые плагины, которые могут быть обновлены Vagrant в любом случае.

обратите внимание, что с Vagrant 1.5 вы можете указать свои зависимости в своем Gemfile. За сообщение в блоге об обновлении:

теперь Vagrant 1.5 будет автоматически загружать любые драгоценные камни в " плагины" группа в вашем файле. В качестве примера, вот Gemfile для a плагин" vagrant-bar":

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

не смог добавить комментарий к ответу Луи Сент-Амура, но я хотел опубликовать это на всякий случай, если кому-то понадобится помощь в расширении его решения.

# 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

Я только что заметил здесь http://docs.vagrantup.com/v2/plugins/packaging.html инструкция

Vagrant.require_plugin "vagrant-aws"

который делает точно то же самое, что и описанный fgrehm: быстро вызывает ошибку, если плагин не установлен.

насколько я знаю, до сих пор нет способа автоматической установки плагинов

мой ответ очень близок к ответ Луи Сен-Амура, но вместо автоматической установки плагинов, он просто вызывает сообщение об ошибке, так что пользователь должен установить плагин вручную.

Я бы предпочел, чтобы пользователи знали о любых плагинах, которые устанавливаются, потому что они применяются глобально ко всем экземплярам Vagrant, а не только к текущему Vagrantfile.

положить в верхней части Vagrantfile одна строка, как это для каждого плагина, в этом примере, vagrant-vbguest:

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

вы могли бы использовать этот проект (я автор):https://github.com/DevNIX/Vagrant-dependency-manager

Он основан на аналогичных ответах, но пытается быть более полным и стабильным. Большим преимуществом этой идеи является то, что вы можете распространять свой Vagrantfile, и он будет работать на каждом компьютере независимо от установленных плагинов в этой среде.

Он прост в использовании:

  1. копировать dependency_manager.следующий RB на свой Vagrantfile
  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. профит!

Я хотел бы объединить запросы на вытягивание, исправить любую проблему, которую вы могли бы иметь, и получить идеи о новых функциях. В настоящее время я думаю об обновлении самого менеджера зависимостей и требую конкретных версий плагинов : D

С уважением!

В новой версии Vagrant ответ @Amos Shapira застревает в бесконечном цикле. Причиной этого является каждый вызов vagrant plugin install также Vagrantfile и при обработке выполняет код, относящийся к установке плагин снова и снова и так далее.

вот мое решение, которое позволяет избежать петли.

# Plugins
#
# Check if the first argument to the vagrant
# command is plugin or not to avoid the loop
if ARGV[0] != 'plugin'

  # Define the plugins in an array format
  required_plugins = [
    'vagrant-vbguest', 'vagrant-hostmanager', 
    'vagrant-disksize'
  ]         
  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
end

У меня проблема с новой установкой Vagrant, где .бродяга.каталог d еще не создан. Я смог сделать фрагмент из работы Луиса Сент-Амура, поймав исключение.

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

вот что я использую на 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

Comments

    Ничего не найдено.