web-dev-qa-db-fra.com

Exiger un plugin Vagrant dans Vagrantfile?

L'exécution supposée d'une Vagrantfile nécessite l'installation d'un plug-in Vagrant spécifique. Donc, fondamentalement, ce que vous devez faire est

$ vagrant plugin install foobar-plugin
$ vagrant up

Si vous ignorez la première étape, vagrant up échoue.

Y at-il une option dans Vagrant pour lui permettre d’installer le plugin automatiquement? En d'autres termes: Est-il possible de spécifier dans une Vagrantfile les plugins à installer automatiquement avant de créer et de démarrer la machine?

64
Golo Roden

Comme je indiqué sur ma réponse à votre autre question , vous pouvez utiliser bindler pour installer un ensemble de plug-ins spécifiques à un projet à l'aide d'une seule commande.

Si bindler est installé et que le plug-in requis ne l'est pas, bindler générera une erreur et interrompra le processus. Il y a aussi un problème en suspens lié à l'installation automatique de plugins sur vagrant ups, mais jusqu'à présent, personne ne s'y est encore inscrit.

Si vous ne voulez pas utiliser bindler, vous pouvez utiliser Vagrant.has_plugin? (disponible sur la version 1.3.0+) en haut de votre Vagrantfile et une erreur sur si le plug-in requis n'est pas installé.

Quelque chose comme:

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

UPDATE: Bindler n'est plus pris en charge et aucune fonctionnalité équivalente n'a été fournie par le noyau Vagrant depuis le 11 mai 2015.

46
fgrehm

MISE À JOUR 31 août 2018: Voir le correctif de @ Starx ci-dessous pour les versions ultérieures de Vagrant

Voici une version basée sur la solution de Louis St. Amour et le commentaire de Rob Kinyon sur la ré-exécution si un nouveau plugin était installé, je l'utilise avec succès dans ma propre configuration:

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
65
Amos Shapira

Étant donné que je suis un développeur Ruby et que Bindler n’est plus mis à jour, j’ai trouvé très naturel d’écrire du code en haut de mon fichier Vagrantfile pour installer les plugins nécessaires s’il manquait (par exemple avant la ligne Vagrant.configure

Ce qui suit fonctionne pour moi:

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

system, contrairement à l'utilisation de backticks, fera écho à la commande sur stdout, tout comme exécuter la commande vous-même. Et de cette façon, je n'ai pas besoin d'un autre plugin ou système étrangement nommé pour garder une trace des plugins nécessaires qui peuvent de toute façon être mis à jour par Vagrant.

50
Louis St-Amour

Veuillez noter qu'à partir de Vagrant 1.5, vous pouvez spécifier vos dépendances dans votre Gemfile. Par le blog sur la mise à jour :

Maintenant, Vagrant 1.5 chargera automatiquement toutes les gemmes dans les "plugins" groupe dans votre Gemfile. Par exemple, voici le Gemfile pour un plugin "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
10
Jonathan Bender

Je ne pouvais pas ajouter de commentaire à la réponse de Louis St-Amour, mais je voulais le publier au cas où quelqu'un aurait besoin d'aide pour étendre sa solution.

# 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
James Reimer

Sur la nouvelle version de Vagrant, la réponse de @Amos Shapira reste bloquée dans une boucle infinie. La raison en est que chaque appel à vagrant plugin install traite également la Vagrantfile et, lorsqu'il est traité, exécute le code relatif à l'installation du plug-in encore et encore, etc.

Voici ma solution qui évite la boucle.

# 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
2
Starx

Je viens de remarquer ici http://docs.vagrantup.com/v2/plugins/packaging.html une instruction 

Vagrant.require_plugin "vagrant-aws"

ce qui fait exactement la même chose que ce qui est décrit par fgrehm: générer rapidement une erreur si le plugin n’est pas installé.

Pour autant que je sache, il n'y a toujours aucun moyen d'installer automatiquement des plugins

1
Julien

Ma réponse est très proche de La réponse de Louis St-Amour , mais au lieu d'installer des plugins automatiquement, cela déclenche simplement un message d'erreur, de sorte que l'utilisateur doit installer le plugin manuellement.

Je préférerais que les utilisateurs soient au courant des plugins installés, car ils s'appliquent de manière globale à toutes les instances de Vagrant, et pas seulement au fichier Vagrant actuel.

Mettez au début de Vagrantfile une ligne comme celle-ci pour chaque plugin, dans cet exemple, vagrant-vbguest:

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

Mise à jour 2019: Vagrant dispose désormais d'une fonctionnalité permettant de demander des plug-ins via Vagrantfile via:

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

Voir https://www.vagrantup.com/docs/vagrantfile/vagrant_settings.html

1
Moritz Gunz

Vous pouvez utiliser ce projet (j'en suis l'auteur): https://github.com/DevNIX/Vagrant-dependency-manager

C'est basé sur des réponses similaires mais en essayant d'être plus complet et stable. Le gros avantage de cette idée est que vous pouvez distribuer votre Vagrantfile et qu’il fonctionnera sur tous les ordinateurs, quels que soient les plugins installés sur cet environnement.

C'est facile a utiliser:

  1. Copiez le fichier dependency_manager.rb à côté de votre fichier Vagrant.
  2. Incluez-le et appelez check_plugins en passant vos dépendances sous forme de tableau

    Exemple:

    # -*- 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. Profit!

J'adorerais fusionner les demandes d'extraction, résoudre tout problème éventuel et avoir une idée des nouvelles fonctionnalités. Actuellement, je songe à mettre à jour le gestionnaire de dépendance lui-même et à demander des versions de plug-in spécifiques: D

Cordialement!

1
Dev_NIX

J'ai un problème avec la nouvelle installation de Vagrant, où le répertoire .vagrant.d n'est pas encore créé. J'ai réussi à faire fonctionner l'extrait de Luis St. Amour en attrapant l'exception.

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
0
Guillaume Hardy

Voici ce que j'utilise sur Vagrant 1.8 et cela fonctionne bien. Placez ceci quelque part avant le bloc configure dans votre 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
0
lps