Требовать плагин Vagrant в Vagrantfile?
предполагается выполнение a Vagrantfile требуется установить определенный плагин Vagrant. Так, в основном то, что вам нужно сделать, это
$ vagrant plugin install foobar-plugin
$ vagrant up
если вы пропустите первый шаг, vagrant up не удается.
есть ли возможность в Vagrant, чтобы сделать его установить плагин автоматически? Другими словами: можно ли указать в Vagrantfile какие плагины необходимо установить автоматически перед созданием и загрузкой машины?
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, и он будет работать на каждом компьютере независимо от установленных плагинов в этой среде.
Он прост в использовании:
- копировать dependency_manager.следующий RB на свой Vagrantfile
включите его и позвоните
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???
профит!
Я хотел бы объединить запросы на вытягивание, исправить любую проблему, которую вы могли бы иметь, и получить идеи о новых функциях. В настоящее время я думаю об обновлении самого менеджера зависимостей и требую конкретных версий плагинов : 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