2016-01-20 6 views
8

Ich habe ein Tutorial in Bash gelesen, wo sie sagten, um die Maschine neu zu starten, gab es keine Option, einen Dienst direkt neu zu starten, es war eine Frage des Neustarts der Maschine, und dann gab es weitere Befehle, die noch ausgeführt werden mussten bei der Bereitstellung.Ist es möglich, eine Maschine neu zu starten, wenn eine Maschine mit Vagrant und Pickup bereitgestellt wird, wo das Skript aufgehört hat?

Gibt es also eine Möglichkeit, eine Box inmitten von Provisioning neu zu starten und dann dort weiterzumachen, wo Sie aufgehört haben?

+1

Welche Provisioning verwenden Sie? – dizballanze

+0

[vagrant vbguest plugin] (https://github.com/dotless-de/vagrant-vbguest/) tut es so, es sollte möglich sein. schau nie tief wie sie es taten und es ist ein plugin, also kann es ein wenig anders sein aber du könntest eine gute Idee bekommen –

+0

@dizballanze Bash an dieser Stelle ... – leeand00

Antwort

8

Soweit ich weiß, Sie nicht ein einziges Skript/Befehlssatz haben, der auf dem er unterbrochen tragen würde, wenn es das Betriebssystem, wie zum Neustart versucht:

config.vm.provision "shell", inline: <<-SHELL 
    echo $(date) > ~/rebootexample 
    reboot 
    echo $(date) >> ~/rebootexample 
    SHELL 

In diesem Beispiel der zweite Echo-Aufruf würde nicht ausgeführt werden.

Sie könnten das Skript/Befehle aufteilen und ein Plugin wie vagrant reload verwenden.

Ein Beispiel Schnipsel eines Vagrantfile seine mögliche Verwendung hervorzuheben:

# execute code before reload 
    config.vm.provision "shell", inline: <<-SHELL 
    echo $(date) > ~/rebootexample 
    SHELL 

    # trigger reload 
    config.vm.provision :reload 

    # execute code after reload 
    config.vm.provision "shell", inline: <<-SHELL 
    echo $(date) >> ~/rebootexample 
    SHELL 
3

Ich habe das noch nie gemacht, aber wenn ich musste ich das Skript in zwei Teile aufteilen, eine vor dem Neustart, die den Neustart Befehl enthält, dann eine andere, die nach der Installation ist.

Der erste würde auch eine Sperrdatei erstellen.

Das gesamte Skript würde das erste Skript ausführen, wenn die Sperrdatei nicht existiert, oder das zweite ausführen, wenn die Datei existiert. Dieses allgemeine Skript wäre für den Start eingerichtet.

0

Ein Trick, den Sie verwenden können, ist restart Signal zu senden, und den Rest der Bereitstellung Arbeit als Skript beim Booten ausgeführt werden sollte sparen:

Dies wurde getestet, um mit debian 9 zu arbeiten, also müssen Sie möglicherweise Dienste aktivieren oder einen anderen Weg finden, um Ihren Code beim nächsten Start neu zu starten, wenn Sie etwas anderes ausführen.

Leider kann man nicht einfach tun:

config.vm.provision "shell", inline: "shutdown -r now" 
config.vm.provision "shell", inline: "echo 'hello world'" 

results in ==> 
The SSH connection was unexpectedly closed by the remote end. This 
usually indicates that SSH within the guest machine was unable to 
properly start up. Please boot the VM in GUI mode to check whether 
it is booting properly.