web-dev-qa-db-fra.com

Est-il possible de redémarrer une machine lors de la configuration d'une machine à l'aide de Vagrant et de la récupération où le script s'est arrêté?

Je lisais dans bash un tutoriel où ils disaient de redémarrer la machine, il n'y avait pas d'option pour redémarrer directement un service, il s'agissait simplement de redémarrer la machine, puis il y avait plus de commandes après cela qui devaient encore être exécutées lors du provisioning .

Alors, y a-t-il un moyen de redémarrer une boîte au milieu du provisioning, puis de reprendre là où vous l'avez laissé?

13
leeand00

Autant que je sache, vous ne pouvez pas avoir un seul script/ensemble de commandes qui continueraient là où il était laissé s'il essayait de redémarrer le système d'exploitation, tels que:

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

Dans cet exemple, le deuxième appel d'écho ne serait pas exécuté.

Vous pouvez scinder le script/les commandes et utiliser un plugin tel que vagrant reload .

Un exemple de fragment de fichier Vagrant pour souligner son utilisation possible:

  # 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
13
jaxim

Je n'ai jamais fait cela, mais si je devais le faire, je scinderais le script en deux parties, une avant le redémarrage, qui inclut la commande de redémarrage, puis une autre après l'installation.

Le premier créerait également un fichier de verrouillage.

Le script global exécuterait le premier script si le fichier de verrouillage n'existait pas ou exécutait le second si le fichier existait. Ce script global serait configuré pour le démarrage.

3
Marc Young

Une astuce que vous pouvez utiliser consiste à envoyer le signal de redémarrage et à enregistrer le reste du travail de provisionnement sous forme de script à exécuter au démarrage:

config.vm.provision "Shell", inline: <<-Shell
  echo "Do your thing... DONE"
cat <<-RCLOCAL | sed -s 's_^      __' > /etc/rc.local
      #!/bin/bash
      echo "This will be run once on next boot and then it's destroyed and never run again"
      rm /etc/rc.local
RCLOCAL
  chmod o+x /etc/rc.local
  shutdown -r now #restart
Shell

Cela a été testé pour fonctionner sur debian 9, vous devrez donc peut-être activer des services ou trouver un autre moyen d'obtenir votre code encapsulé pour qu'il s'exécute au prochain démarrage si vous utilisez autre chose.

Malheureusement, vous ne pouvez pas simplement faire:

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.
1
Timo