Antworten:
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 . Das Kernel
Modul ist in der Object
Klasse enthalten, sodass seine Methoden in allen Bereichen verfügbar sind.
(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 kann up
, down
, status
, etc .. Sie einfach den Wert überprüfen ARGV[0]
in Ihrem Vagrantfile.
So etwas reicht aus:
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
Legen Sie dies oben in Ihre Vagrantdatei:
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
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.
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:
node.trigger.before [:up, :provision] do |trigger|
trigger.info = "Running ./myscript.sh locally..."
trigger.run = {path: "./myscript.sh"}
end
Dieser Block geht rein von config.vm.define
. Weitere Dokumentation: https://www.vagrantup.com/docs/triggers/
config.vm.define
nicht erforderlich ist. Sie können auch darin platziert werden Vagrant.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
system('./myscript.sh')
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 kommentieren Vagrantfile
.
Beispielsweise:
system('vagrant plugin install vagrant-fabric && (pip install fabric jinja2 || sudo pip install fabric jinja2) && sed -i -e "s/^system/#system/g" Vagrantfile')
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ür virtualenvs
und mit sudo
wenn das fehlschlägt) und dann der Linie Kommentare selbst.
if [[ $(vagrant plugin list | grep -c vagrant-host-shell) == "0" ]] then vagrant plugin install vagrant-host-shell fi
vagrant status
vorher laufen vagrant up
...