web-dev-qa-db-fra.com

Vagrant exécuter un script ou une commande après chaque redémarrage de l'invité (vagrant up)

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.

29
Pranav Shukla

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é

48
Frédéric Henri

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

4
kip2

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
0
Andres Leon Rangel