Ich biete hier nur eine Alternative an, die für mich funktioniert hat, indem sie Vagrant-Trigger verwendet. Betrachten Sie dieses Beispiel direkt aus ihrer Dokumentation:
Ausführen eines Remote-Skripts, um eine Datenbank auf Ihrem Host zu speichern, bevor ein Gast zerstört wird:
Vagrant.configure("2") do |config|
config.vm.define "ubuntu" do |ubuntu|
ubuntu.vm.box = "ubuntu"
ubuntu.trigger.before :destroy do |trigger|
trigger.warn = "Dumping database to /vagrant/outfile"
trigger.run_remote = {inline: "pg_dump dbname > /vagrant/outfile"}
# or trigger.run = {...} to run the command on the host instead
# of guest
end
end
end
Es gibt auch das zugehörige Vagrant-Triggers-Plugin, das Sie ausprobieren können
Sie können run: 'always'
verwenden
config.vm.provision :shell, path: "vagrant/bootstrap.sh", run: 'always'
Dadurch wird sichergestellt, dass Ihr Befehl jedes Mal ausgeführt wird, wenn Ihre VM gestartet wird (vagrant up oder vagrant reload)
Wenn Sie nur bestimmte Befehle benötigen, die immer ausgeführt werden sollen, können Sie Ihr Skript aufteilen
config.vm.provision :shell, path: "vagrant/bootstrap1.sh"
config.vm.provision :shell, path: "vagrant/bootstrap2.sh", run: 'always'
config.vm.provision :shell, path: "vagrant/bootstrap3.sh"
Das Skript wird der Reihe nach ausgeführt, bootstrap1, dann 2, dann 3, wenn die Maschine zum ersten Mal bereitgestellt wird
jedes weitere Mal, wenn Sie vagrant up
ausführen (oder neu laden) nur bootstrap2 wird ausgeführt
Ich habe Ubuntu 18.04 verwendet. Trigger haben bei mir nicht funktioniert, also habe ich mich entschieden, das Post-Provisioning-Skript in die VM-Box zu kopieren und dann von einem Master-Skript aus das gewünschte Post-Provisioning auszuführen:
config.trigger.before :provisioner_run, type: :hook do |t|
t.info = "Before the provision!"
end
config.vm.provision "shell" do |s|
s.inline = "echo $1 "
s.args = [" '--->' Provisioning the environment!"]
end
config.vm.provision "file", source: "scripts/post-provision/.", destination: "/home/vagrant"
config.vm.provision "shell", path: "scripts/install.sh"
# config.vm.provision "shell", path: "scripts/bootstrap.sh", run: 'always'
# config.trigger.after :up do |trigger|
# trigger.info = "Installing Monitoring Stack..."
# trigger.run_remote = {path: "./install-monitor-stack.sh"}
# end
end
Der Inhalt des Hauptskripts verwendet exec, um die neue Shell zu aktualisieren. Sie können auch
verwendenzurücksetzen
sudo chmod +x *.sh
exec /home/vagrant/install-monitor-stack.sh
exec /home/vagrant/bootstrap.sh