Ich möchte ein Bash-Skript auf dem Host-Computer ausführen, wenn Vagrant den Server bereitstellt.
Was wäre die beste Methode, um dies zu erreichen?
Mindestens zwei Plugins, die helfen sollten:
Wenn es Ihnen egal ist, ob das Skript mit (fast) allen vagrant
Befehlen ausgeführt wird, können Sie in Vagrantfile auch einfach die Rubinmagie ausgeben (oder verwenden):
system('./myscript.sh')
Vagrant.configure('2') do |config|
# ...
end
Kernel
Modul, hier dokumentiert . DasKernel
Modul ist in derObject
Klasse enthalten, sodass seine Methoden in allen Bereichen verfügbar sind.Einfache (und vollständige) Lösung
(Ich sage vollständig, weil die akzeptierte Antwort nicht prüft, ob der Benutzer Vagabund verwendet. Daher wird das Skript bei jedem Befehl ausgeführt, was das OP nicht wünscht.)
Hierfür gibt es jedoch eine einfache Lösung.
ARGV[0]
ist das erste Argument des Befehls eingegeben und sein kannup
,down
,status
, etc .. Sie einfach den Wert überprüfenARGV[0]
in Ihrem Vagrantfile.So etwas reicht aus:
quelle
Legen Sie dies oben in Ihre Vagrantdatei:
Dann rufen Sie einfach in Ihrem Vagrantfile auf:
config.vm.provision "list-files", type: "local_shell", command: "ls"
Und über die Kommandozeile so:
vagrant provision --provision-with list-files
Dies ist eine Art Hack, da es wie ein Plug-In aussieht, es aber nicht ist (es wird nicht angezeigt, wenn Sie es tun
vagrant plugin list
). Ich empfehle nicht, dies auf diese Weise zu tun, außer dass es den Vorteil hat, dass kein Plugin installiert werden muss, sodass Ihr Vagrantfile auf jedem Computer funktioniert, der die neueste Konfigurationsversion unterstützt (Version 2 zum Zeitpunkt der Erstellung dieses Dokuments). Das klingt zwar vielversprechend portabel, aber es gibt auch die gesamte plattformübergreifende Ausgabe des tatsächlichen Befehls, den Sie ausgeben. Sie müssen berücksichtigen, ob Ihr Vagrantfile portabel sein soll, aber dies sollte Ihnen den Einstieg erleichtern.quelle
Basierend auf der Antwort von @ tmatilai, die für 2019 aktualisiert wurde, wurden Vagrant-Trigger in Vagrant zusammengeführt. So können Sie jetzt so etwas tun:
Dieser Block geht rein von
config.vm.define
. Weitere Dokumentation: https://www.vagrantup.com/docs/triggers/quelle
config.vm.define
nicht erforderlich ist. Sie können auch darin platziert werdenVagrant.configure("2") do |config| ... end
. Abschließend sei angemerkt, dass Vagrant auf Windows-Hosts gerne auch Powershell-Skripte mit der.ps1
Erweiterung ausführt .Im Einklang mit dem, was @ tmatilai über die Verwendung gesagt hat
Ich fand es sehr hilfreich für einmalige Befehle wie die Installation von vagrant-Befehlen oder eines Provisioners, der möglicherweise nicht im System installiert ist. Ich vermeide einfach, dass es jedes Mal neu ausgeführt wird, wenn ich die
vagrant
Befehle aufrufe , indem ich ein sed hinzufüge, um das automatisch zu kommentierenVagrantfile
.Beispielsweise:
Und ich mache das zur ersten Zeile meines Vagrantfiles. Auf diese Weise wird es zuerst den Vagabund-Stoff - Plugin, Stoff und jinja installiert (wird zunächst versuchen , ohne
sudo
fürvirtualenvs
und mitsudo
wenn das fehlschlägt) und dann der Linie Kommentare selbst.quelle
if [[ $(vagrant plugin list | grep -c vagrant-host-shell) == "0" ]] then vagrant plugin install vagrant-host-shell fi
vagrant status
vorher laufenvagrant up
...