Risposte:
Almeno due plugin che dovrebbero aiutare:
Se non ti interessa che lo script venga eseguito su (quasi) tutti i vagrant
comandi, puoi anche sborsare (o usare qualsiasi cosa ruby magic) in Vagrantfile:
system('./myscript.sh')
Vagrant.configure('2') do |config|
# ...
end
Kernel
modulo, documentato qui . Il Kernel
modulo è incluso nella Object
classe, quindi i suoi metodi sono disponibili in tutti gli ambiti.
(Dico completo perché la risposta accettata non verifica se l'utente sta usando Vagrant up. Pertanto, lo script viene eseguito su ogni comando, che non è quello che l'OP vuole.)
C'è comunque una soluzione semplice a questo.
ARGV[0]
è il primo argomento del comando immesso e può essere up
, down
, status
, ecc .. Basta controllare il valore di ARGV[0]
nel vostro Vagrantfile.
Qualcosa del genere farà:
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
Metti questo vicino alla cima del tuo 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
Quindi invoca semplicemente il tuo Vagrantfile in questo modo:
config.vm.provision "list-files", type: "local_shell", command: "ls"
E tramite la riga di comando in questo modo:
vagrant provision --provision-with list-files
Questo è un tipo di hack in quanto sembra un plug-in, ma in realtà non lo è (non verrà visualizzato quando lo fai vagrant plugin list
). Non consiglio di farlo in questo modo, tranne per il fatto che ha il vantaggio di non dover installare un plugin, quindi il tuo Vagrantfile funzionerà su qualsiasi macchina che supporti l'ultima versione di configurazione (versione 2 al momento della stesura di questo). Anche se sembra promettentemente portatile, c'è anche l'intero problema multipiattaforma del comando effettivo che stai emettendo. Dovrai prendere in considerazione se vuoi che il tuo Vagrantfile sia portatile, ma questo dovrebbe iniziare.
Basato sulla risposta di @ tmatilai ma aggiornato per il 2019, i trigger di Vagrant sono stati fusi in Vagrant. Quindi ora puoi fare qualcosa del genere:
node.trigger.before [:up, :provision] do |trigger|
trigger.info = "Running ./myscript.sh locally..."
trigger.run = {path: "./myscript.sh"}
end
Questo blocco va dentro config.vm.define
. Ulteriore documentazione: https://www.vagrantup.com/docs/triggers/
config.vm.define
non è un requisito; possono anche essere inseriti all'interno Vagrant.configure("2") do |config| ... end
. Come ultimo punto da notare, su host Windows, Vagrant eseguirà volentieri anche gli script Powershell che hanno l' .ps1
estensione.
In linea con quanto affermato da @tmatilai sull'uso
system('./myscript.sh')
L'ho trovato abbastanza utile per i comandi di una volta come l'installazione di comandi vagabondi o alcuni provisioner che potrebbero non essere installati nel sistema. Lo evito solo di rieseguirlo ogni volta che invoco i vagrant
comandi aggiungendo un sed per commentare automaticamente il file Vagrantfile
.
Per esempio:
system('vagrant plugin install vagrant-fabric && (pip install fabric jinja2 || sudo pip install fabric jinja2) && sed -i -e "s/^system/#system/g" Vagrantfile')
E lo faccio come prima riga del mio Vagrantfile. In questo modo installerà prima il plug-in vagrant-fabric, fabric e jinja (proverà prima senza sudo
per virtualenvs
e con sudo
se ciò fallisce) e quindi la riga stessa commenta.
if [[ $(vagrant plugin list | grep -c vagrant-host-shell) == "0" ]] then vagrant plugin install vagrant-host-shell fi
vagrant status
prima vagrant up
...