Je propose simplement ici une alternative qui a fonctionné pour moi, en utilisant des déclencheurs vagabonds. Considérez cet exemple directement tiré de leur documentation :
Exécution d'un script distant pour enregistrer une base de données sur votre hôte avant de détruire un invité :
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
Il y a aussi le plugin vagrant-triggers que vous pouvez consulter
vous pouvez utiliser run: 'always'
config.vm.provision :shell, path: "vagrant/bootstrap.sh", run: 'always'
Cela garantira que votre commande est exécutée à chaque démarrage de votre machine virtuelle (vagrant up ou vagrant rechargement)
Si vous avez besoin que certaines commandes soient toujours exécutées, vous pouvez diviser votre script
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"
le script sera exécuté dans l'ordre, bootstrap1 puis 2 puis 3 lors du premier provisionnement de la machine
chaque fois que vous exécutez vagrant up
(ou recharger) seul bootstrap2 sera exécuté
J'ai utilisé Ubuntu 18.04. Les déclencheurs n'ont pas fonctionné pour moi, j'ai donc choisi de copier le script de post-provisionnement dans vm box, puis à partir d'un script maître, exécutez le post-provisionnement souhaité :
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
le contenu du script principal utilise exec pour actualiser le nouveau shell. Vous pouvez également utiliser
réinitialiser
sudo chmod +x *.sh
exec /home/vagrant/install-monitor-stack.sh
exec /home/vagrant/bootstrap.sh