provisioner - vagrantfile example
¿Exigir un complemento Vagrant dentro del Vagrantfile? (11)
La supuesta ejecución de un Vagrantfile
requiere la instalación de un complemento Vagrant específico. Entonces, básicamente, lo que tienes que hacer es
$ vagrant plugin install foobar-plugin
$ vagrant up
Si omite el primer paso, el vagrant up
falla.
¿Hay alguna opción en Vagrant para que instale el complemento automáticamente? En otras palabras: ¿es posible especificar dentro de un Vagrantfile
qué complementos se instalan automáticamente antes de crear y arrancar la máquina?
Acabo de notar aquí http://docs.vagrantup.com/v2/plugins/packaging.html una instrucción
Vagrant.require_plugin "vagrant-aws"
que hace exactamente lo mismo que lo que se describe fgrehm: elevar rápidamente un error si el complemento no está instalado.
Por lo que yo sé, aún no hay forma de instalar plugins automáticamente
Como señalé en mi respuesta a su otra pregunta , puede usar el bindler para instalar un conjunto de complementos específicos para un proyecto con un solo comando.
Si el enlazador está instalado y el complemento requerido no lo está, el vinculador producirá un error y abortará el proceso. También hay un problema abierto relacionado con la instalación automática de complementos en vagrant up
pero hasta ahora nadie se ha registrado aún.
Si no quiere usar el enlazador, puede utilizar Vagrant.has_plugin?
(disponible en 1.3.0+) en la parte superior de su Vagrantfile
y error out si el complemento requerido no está instalado.
Algo como:
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
ACTUALIZACIÓN : Bindler ya no es compatible y el núcleo de Vagrant no ha proporcionado ninguna funcionalidad equivalente desde el 11 de mayo de 2015.
Como soy un desarrollador de Ruby, y Bindler ya no se mantiene, me pareció más natural escribir un código en la parte superior de mi Vagrantfile para instalar los plugins necesarios si faltan (por ejemplo, antes de la línea Vagrant.configure
)
Lo siguiente funciona para mí:
required_plugins = %w( vagrant-hostmanager vagrant-someotherplugin )
required_plugins.each do |plugin|
system "vagrant plugin install #{plugin}" unless Vagrant.has_plugin? plugin
end
system
, a diferencia del uso de patillas, hará eco del comando para stdout, del mismo modo que ejecutar el comando usted mismo. Y de esta manera no necesito otro complemento o sistema con un nombre extraño para hacer un seguimiento de los complementos necesarios que pueden ser actualizados por Vagrant de todos modos.
En la nueva versión de Vagrant, la respuesta de @Amos Shapira se atasca en un ciclo infinito. La razón de esto es que cada llamada a la vagrant plugin install
también procesa el Vagrantfile
y cuando se procesa ejecuta el código relacionado con la instalación del complemento una y otra vez, y así sucesivamente.
Aquí está mi solución que evita el ciclo.
# 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
Esto es lo que estoy usando en Vagrant 1.8 y está funcionando bien. Coloque esto en algún lugar antes del bloque de configuración en su 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
Mi respuesta es muy similar a la respuesta de Louis St-Amour , pero en lugar de instalar complementos automáticamente, solo genera un mensaje de error, por lo que el usuario tiene que instalar el complemento manualmente.
Prefiero que los usuarios estén al tanto de los complementos que se instalan, ya que se aplican globalmente a todas las instancias de Vagrant, no solo al Vagrantfile actual.
Coloque en la parte superior de Vagrantfile
una línea como esta para cada complemento, en este ejemplo, vagrant-vbguest
:
raise "vagrant-vbguest plugin must be installed" unless Vagrant.has_plugin? "vagrant-vbguest"
No se pudo agregar un comentario a la respuesta de Louis St-Amour, pero quería publicarlo por si alguien necesitaba ayuda para extender su solución.
# 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
Puede usar este proyecto (yo soy el autor): https://github.com/DevNIX/Vagrant-dependency-manager
Se basa en respuestas similares pero trata de ser más completo y estable. La gran ventaja de esta idea es que puede distribuir su Vagrantfile y se ejecutará en todas las computadoras, independientemente de los complementos instalados en ese entorno.
Es fácil de usar:
- Copie dependency_manager.rb junto a su Vagrantfile
check_plugins
y llame acheck_plugins
pasando sus dependencias como una matrizEjemplo:
# -*- 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
???
¡Lucro!
Me encantaría fusionar solicitudes de extracción, solucionar cualquier problema que pueda tener y obtener ideas sobre nuevas funciones. Actualmente, estoy pensando en actualizar el administrador de dependencias en sí mismo y en requerir versiones de complemento específicas: D
¡Saludos!
Tenga en cuenta que a partir de Vagrant 1.5, puede especificar sus dependencias en su Gemfile
. Por la publicación del blog en la actualización :
Ahora, Vagrant 1.5 cargará automáticamente cualquier gema en el grupo "complementos" en su Gemfile. Como ejemplo, aquí está el Gemfile para un complemento "vagabundo":
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
Tengo un problema con la nueva instalación de Vagrant, donde todavía no se ha creado el directorio .vagrant.d. Pude hacer que el fragmento de Luis St. Amour funcionara atrapando la excepción.
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
ACTUALIZACIÓN 31 de agosto de 2018: Consulte la solución de @ Starx a continuación para versiones posteriores de Vagrant
Aquí está la versión basada en la solución de Louis St. Amour junto con el comentario de Rob Kinyon sobre re-exec si se instaló un nuevo plugin, lo uso con éxito en mi propia configuración:
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