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?
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 up
s, 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.
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
É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.
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
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
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
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
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"
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
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:
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
???
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!
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
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