GNU/Linux >> Tutoriels Linux >  >> Linux

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

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

Linux
  1. provoquer l'exécution d'un script après le démarrage de la mise en réseau ?

  2. Exécute la commande pour chaque fichier dans le répertoire courant

  3. Exécuter le script Python via crontab

  4. Comment laisser l'utilisateur exécuter une commande contenant des guillemets dans sudoers ?

  5. -bash:/bin/cd :aucun fichier ou répertoire de ce type - exécute automatiquement ls après cd

Commande de redémarrage Linux (redémarrer)

Comment créer un script d'une commande Linux

Exemple Crontab – toutes les 5 minutes

Comment exécuter une commande dans un script shell ?

matlab exécute le script à partir de la ligne de commande linux

Exécuter le script bash après la connexion