2016-05-17 8 views
0

Mit dem Vorschlag in returning a value from a provision script to vagrant, ich bin ein Provisioning-Skript ausgeführt, die einen Wert in Datei schreibt. Ich möchte, dass Ruby diese Datei öffnet und die VM je nach dem Wert bedingt neu lädt (die config.vm.provision :reload Zeile ist erreichbar, indem ein Plugin über vagrant plugin install vagrant-reload installiert wird). Dann möchte ich, dass das zweite Bereitstellungsskript ausgeführt wird.Verwenden von Ruby zum bedingten Laden einer vagrant VM zwischen laufenden Provisioning-Skripts

Ich bin verwirrt, wie und wann die Ruby-Befehle mit dem folgenden Code in meinem vagrantfile ausgeführt werden: Wenn das erste Provisioner-Skript abgeschlossen ist, geht es direkt zum zweiten, ohne etwas zu drucken oder neu zu laden (der Wert in requestreboot.txt ist wahr).

Welche Änderungen muss ich vornehmen, damit der Dateiverarbeitungscode ausgeführt wird, nachdem das erste Provisionierungsskript beendet wurde?

# -*- mode: ruby -*- 
# vi: set ft=ruby : 

$script1 = <<SCRIPT 
echo "Run this provisioner first to write a value to requiresreboot.txt... " 
start-process "C:\\...\\vagrant_provisioning_file1.bat" -wait 
SCRIPT 

$script2 = <<SCRIPT 
echo "Run this provisioner second... " 
start-process "C:\\...\\vagrant_provisioning_file2.bat" -wait 
SCRIPT 

Vagrant.configure(2) do |config| 

    # Other vagrant setup..... 
    # ........................ 

    File.new("requiresreboot.txt", "w+"); 

    # Enable provisioning with a shell script 1. 
    config.vm.provision "shell", inline: $script1 

    file = File.open("requiresreboot.txt", "r") 
    contents = file.read 
    if contents == "max_rearms_reached" 
    print "Cannot extend Windows 7 trial: maximum number of rearms reached." 
    elsif contents == "true" 
    # trigger reload (reboot to apply changes for Windows trial renewal) 
    print "Windows trial renewal is required" 
    config.vm.provision :reload 
    elsif contents == "false" 
    print "No reload required, continuing with provisioning..." 
    end 
    file.close 

    # Enable provisioning with a shell script 2. 
    config.vm.provision "shell", inline: $script2 

end 

Antwort

0

Wenn Sie das Skript von dem Host-Rechner ausgeführt werden soll, ich würde recoment, dass Sie dieses Plugin verwenden:

vagrant-host-shell

Wenn Sie das Skript in der Gastcomputer ausführen möchte ich Sie denken, sollte eine .rb Datei in dem Host-Rechner erstellen und kopieren Sie dann und es im Innern des Gastcomputers ausführen, können Sie das tun, dies zu tun:

config.vm.provision :file, :source => "/path/ruby_script.rb", :destination => "/ruby_script.rb"

config.vm.provision :shell, :inline => "ruby /ruby_script.rb"

Dazu benötigen Sie Ruby installiert auf dem Gastcomputer.

+0

@ allesandro-caetano Wie könnte ich in jedem Fall die VM aus dem externen Skript laden? d. h. führen Sie 'config.vm.provision: reload' –

+0

@ kieran_pli aus, da Sie Shell-Skripte ausführen, die Sie einfach' vagrant reload' aus dem Skript heraus aufrufen können. Wenn Sie ein Ruby-Skript verwenden, können Sie einfach einen Subprozess mit 'IO erstellen.popen ("vagrant reload") –

0

Ich bin verwirrt, wie und wann die Ruby-Befehle werden mit dem Code unten in meinem vagrantfile ausgeführt: Wenn der erste provisioner Skript abgeschlossen ist es ohne Druck etwas oder Nachladen gerade eine zum zweiten geht (das Wert in requireboot.txt ist wahr).

Wie Sie gesehen haben, wird das Skript den ganzen Weg laufen - nicht Zeile für Zeile. Zum Beispiel wird Vagrant alle Sync-Ordner, etc. tun und dann die Bereitstellung (Provisioning laufen in der Reihenfolge sie geschrieben, aber selbst wenn am Anfang der Datei bedeutet nicht, dass sie als allererste Sache ausgeführt werden), was passiert ist Das. Also, was Sie haben als

file = File.open("requiresreboot.txt", "r") 
    contents = file.read 

wird von Vagrant vor jeder Bereitstellung ausgeführt wird. also nichts wird gedruckt, weil Inhalt ist leer

ok, aber es beantwortet nicht Ihre Frage und wie können Sie es zum Laufen bringen - ehrlich gesagt weiß ich nicht, ich versuchte mit vagrant trigger plugin, um die VM nach up-Befehl neu zu laden, war aber nicht erfolgreich. und Landstreicher mag es nicht, von einem Landstreicherbefehl gerufen zu werden.

vagrant vbguest Plugin im Grunde tun Sie die gleiche Sache, die Sie tun möchten, aber sie führen es von einem Plugin, so haben Sie Zugriff auf alle Vagrant Config. Wenn Sie wirklich tun wollen, was Sie wollen, ist Plugin wahrscheinlich die beste Option.

Verwandte Themen