Respuestas:
Al menos dos complementos que deberían ayudar:
Si no le importa que el script se ejecute en (casi) todos los vagrant
comandos, también puede desembolsar (o usar cualquier magia de rubí) en Vagrantfile:
system('./myscript.sh')
Vagrant.configure('2') do |config|
# ...
end
Kernel
módulo, documentado aquí . El Kernel
módulo está incluido en la Object
clase, por lo que sus métodos están disponibles en todos los ámbitos.
(Digo completa porque la respuesta aceptada no comprueba si el usuario está usando vagabundo. Por lo tanto, el script se ejecuta en cada comando, que no es lo que quiere el OP).
Sin embargo, hay una solución simple para esto.
ARGV[0]
es el primer argumento del comando entró y puede ser up
, down
, status
, etc .. Basta comprobar el valor de ARGV[0]
en su Vagrantfile.
Algo como esto hará:
system("
if [ #{ARGV[0]} = 'up' ]; then
echo 'You are doing vagrant up and can execute your script'
./myscript.sh
fi
")
Vagrant.configure('2') do |config|
# ...
end
Pon esto cerca de la parte superior de tu Vagrantfile:
module LocalCommand
class Config < Vagrant.plugin("2", :config)
attr_accessor :command
end
class Plugin < Vagrant.plugin("2")
name "local_shell"
config(:local_shell, :provisioner) do
Config
end
provisioner(:local_shell) do
Provisioner
end
end
class Provisioner < Vagrant.plugin("2", :provisioner)
def provision
result = system "#{config.command}"
end
end
end
Luego simplemente invoque en su Vagrantfile de esta manera:
config.vm.provision "list-files", type: "local_shell", command: "ls"
Y a través de la línea de comando como esta:
vagrant provision --provision-with list-files
Este es un truco, ya que parece un complemento, pero realmente no lo es (no aparecerá cuando lo hagas vagrant plugin list
). No recomiendo hacerlo de esta manera, excepto que tiene la ventaja de no necesitar instalar un complemento, por lo que su Vagrantfile funcionará en cualquier máquina que admita la última versión de configuración (versión 2 al momento de escribir esto). Aunque eso suena prometedoramente portátil, también está todo el problema multiplataforma del comando real que está emitiendo. Deberá tener en cuenta si desea que su Vagrantfile sea portátil, pero esto debería ayudarlo a comenzar.
Según la respuesta de @ tmatilai, pero actualizada para 2019, los disparadores vagrant se han fusionado con Vagrant. Entonces ahora puedes hacer algo así:
node.trigger.before [:up, :provision] do |trigger|
trigger.info = "Running ./myscript.sh locally..."
trigger.run = {path: "./myscript.sh"}
end
Este bloque va dentro de config.vm.define
. Documentación adicional: https://www.vagrantup.com/docs/triggers/
config.vm.define
no es un requisito; también se pueden colocar dentro Vagrant.configure("2") do |config| ... end
. Como punto final de la nota, en los hosts de Windows, Vagrant con mucho gusto ejecutará scripts de Powershell que también tengan la .ps1
extensión.
En línea con lo que @tmatilai dijo sobre el uso
system('./myscript.sh')
Lo encontré bastante útil para comandos únicos como la instalación de comandos vagos o algún aprovisionador que podría no estar instalado en el sistema. Solo evito que se vuelva a ejecutar cada vez que invoco los vagrant
comandos agregando un sed para auto-comentar el Vagrantfile
.
Por ejemplo:
system('vagrant plugin install vagrant-fabric && (pip install fabric jinja2 || sudo pip install fabric jinja2) && sed -i -e "s/^system/#system/g" Vagrantfile')
Y hago de eso la primera línea de mi Vagrantfile. De esta manera será primero instalar el plugin vagabundo-tela, tela y Jinja (intentará primero sin sudo
para virtualenvs
y con sudo
si eso no funciona) y luego la propia línea comentarios.
if [[ $(vagrant plugin list | grep -c vagrant-host-shell) == "0" ]] then vagrant plugin install vagrant-host-shell fi
vagrant status
antes vagrant up
...