with provisioner network language example vagrant

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:

  1. Copie dependency_manager.rb junto a su Vagrantfile
  2. check_plugins y llame a check_plugins pasando sus dependencias como una matriz

    Ejemplo:

    # -*- 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. ¡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