Je connais le script de provisioning, mais c'est un script différent que je demande. Je veux qu'un script soit exécuté après chaque redémarrage de l'invité.
J'utilise Shell Provisioner.
config.vm.provision :Shell, path: "vagrant/bootstrap.sh"
Je ne peux pas mettre mes commandes dans ce script que je veux exécuter après chaque redémarrage.
Fondamentalement, je souhaite que l'une de mes applications soit démarrée lorsque l'utilisateur exécute vagrant up
.
Mon invité est Ubuntu 14.04 fidèle et une solution que j'ai trouvée était de faire suite à mon invité -
Sudo crontab -e
#add the following line
@reboot sh /path/to/my_script_on_guest.sh
Je peux essayer de le faire dans mon script d'approvisionnement, mais Sudo crontab -e
demande un éditeur et je dois en quelque sorte ajouter la ligne de manière interactive. Étant donné que le fichier crontab n'est pas corrigé, je ne sais pas s'il est possible de faire une modification de fichier liner comme
echo '@reboot sh /path/to/my_script_on_guest.sh' >> crontab_file
Je suppose que cela doit être une chose spécifique au système d'exploitation invité.
Est-ce possible d'obtenir Vagrant?
EDIT: corrigé du provisionneur ssh au provisionneur Shell.
vous pouvez utiliser run: 'always'
config.vm.provision :Shell, path: "vagrant/bootstrap.sh", run: 'always'
Cela permettra de s'assurer que votre commande est exécutée à chaque démarrage de votre VM (vagrant up ou vagrant reload)
Si vous n'avez besoin que de certaines commandes pour être 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 de la première mise en service de la machine
chaque fois que vous exécutez vagrant up
(ou rechargement) seul bootstrap2 sera exécuté
Je propose juste une alternative ici qui a fonctionné pour moi, en utilisant des déclencheurs vagabonds . Considérez cet exemple directement dans leurs documents:
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
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 la boîte de VM, puis à partir d'un script principal d'exécuter la post-provisionnement souhaitée:
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