GNU/Linux >> LINUX-Kenntnisse >  >> Linux

Vagrant führt Skript oder Befehl nach jedem Gastneustart aus (vagrant up)

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

verwenden

zurücksetzen

sudo chmod  +x *.sh
exec /home/vagrant/install-monitor-stack.sh
exec /home/vagrant/bootstrap.sh

Linux
  1. So erstellen Sie ein Skript eines Linux-Befehls

  2. nohup:Befehl nicht gefunden

  3. Befehl für jede Datei im aktuellen Verzeichnis ausführen

  4. Führen Sie das Python-Skript über crontab aus

  5. Wie lässt man den Benutzer einen Befehl ausführen, der Anführungszeichen in Sudoers enthält?

Linux-Neustart (Neustart)-Befehl

Crontab-Beispiel – alle 5 Minuten

Wie führe ich einen Befehl in einem Shell-Skript aus?

matlab Skript von der Linux-Befehlszeile ausführen

Führen Sie das Bash-Skript nach der Anmeldung aus

-bash:/bin/cd:Keine solche Datei oder Verzeichnis - automatisch ls nach cd ausführen