Me gustaría ejecutar un script bash en la máquina host cuando aprovisione vagamente el servidor.
¿Cuál sería el mejor método para lograr esto?
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í . ElKernel
módulo está incluido en laObject
clase, por lo que sus métodos están disponibles en todos los ámbitos.Solución simple (y completa)
(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 serup
,down
,status
, etc .. Basta comprobar el valor deARGV[0]
en su Vagrantfile.Algo como esto hará:
fuente
Pon esto cerca de la parte superior de tu Vagrantfile:
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.fuente
Según la respuesta de @ tmatilai, pero actualizada para 2019, los disparadores vagrant se han fusionado con Vagrant. Entonces ahora puedes hacer algo así:
Este bloque va dentro de
config.vm.define
. Documentación adicional: https://www.vagrantup.com/docs/triggers/fuente
config.vm.define
no es un requisito; también se pueden colocar dentroVagrant.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
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 elVagrantfile
.Por ejemplo:
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
paravirtualenvs
y consudo
si eso no funciona) y luego la propia línea comentarios.fuente
if [[ $(vagrant plugin list | grep -c vagrant-host-shell) == "0" ]] then vagrant plugin install vagrant-host-shell fi
vagrant status
antesvagrant up
...