Chciałbym uruchomić skrypt bash na maszynie hosta, gdy włóczęga zapewnia serwerowi.
Jaka byłaby najlepsza metoda osiągnięcia tego?
Co najmniej dwie wtyczki, które powinny pomóc:
Jeśli nie obchodzi cię, że skrypt jest uruchamiany na (prawie) wszystkich vagrant
poleceniach, możesz także po prostu wyrzucić (lub użyć jakiejkolwiek rubinowej magii) w Vagrantfile:
system('./myscript.sh')
Vagrant.configure('2') do |config|
# ...
end
Kernel
module, udokumentowanym tutaj .Kernel
Moduł jest zawarte wObject
klasie, więc są dostępne we wszystkich zakresach jej metody.Proste (i kompletne) rozwiązanie
(Mówię kompletne, ponieważ zaakceptowana odpowiedź nie sprawdza, czy użytkownik używa włóczęgi w górę. Dlatego skrypt jest wykonywany dla każdej komendy, co nie jest tym, czego chce OP).
Istnieje jednak proste rozwiązanie tego problemu.
ARGV[0]
Jest to pierwszy argument polecenia i może być wprowadzonyup
,down
,status
itp .. Wystarczy sprawdzić wartośćARGV[0]
w Vagrantfile.Coś takiego zrobi:
źródło
Umieść to w górnej części pliku Vagrantfile:
Następnie po prostu przywołaj swój plik Vagrantfile w następujący sposób:
config.vm.provision "list-files", type: "local_shell", command: "ls"
I za pomocą wiersza polecenia takiego:
vagrant provision --provision-with list-files
Jest to rodzaj włamania, ponieważ wygląda jak wtyczka, ale tak naprawdę nie jest (nie pojawi się, gdy to zrobisz
vagrant plugin list
). Nie polecam robić tego w ten sposób, z tą różnicą, że ma tę zaletę, że nie trzeba instalować wtyczki, więc plik Vagrantfile będzie działał na każdym komputerze, który obsługuje najnowszą wersję konfiguracji (od wersji 2 w momencie pisania tego). Choć brzmi to obiecująco przenośnie, istnieje także kwestia wydawania poleceń na wiele platform. Musisz wziąć pod uwagę, jeśli chcesz, aby Twój Vagrantfile był przenośny, ale to powinno zacząć.źródło
W oparciu o odpowiedź @ tmatilai, ale zaktualizowaną do 2019 r., Wyzwalacze Vagrant zostały połączone w Vagrant. Możesz teraz zrobić coś takiego:
Ten blok wchodzi w skład
config.vm.define
. Dalsza dokumentacja: https://www.vagrantup.com/docs/triggers/źródło
config.vm.define
nie jest wymogiem; można je również umieścić wVagrant.configure("2") do |config| ... end
środku. Na koniec, na hostach Windows, Vagrant chętnie wykona skrypty Powershell, które również mają.ps1
rozszerzenie.Zgodnie z tym, co @tmatilai powiedział o używaniu
Uznałem, że jest to bardzo pomocne dla jednorazowych poleceń, takich jak instalowanie błędnych poleceń lub jakiegoś dostawcy, który może nie zostać zainstalowany w systemie. Po prostu unikam jego ponownego uruchamiania za każdym razem, gdy wywołuję
vagrant
polecenia, dodając sed, aby automatycznie komentowaćVagrantfile
.Na przykład:
I czynię to pierwszą linią mojego Vagrantfile. W ten sposób najpierw zainstaluje wtyczkę Vagrant-fabric, fabric i jinja (najpierw spróbuje bez
sudo
forvirtualenvs
and with,sudo
jeśli to się nie powiedzie), a następnie linia sama się komentuje.źródło
if [[ $(vagrant plugin list | grep -c vagrant-host-shell) == "0" ]] then vagrant plugin install vagrant-host-shell fi
vagrant status
wcześniejvagrant up
...