Можно ли перезагрузить машину при настройке машины с помощью Vagrant и pickup, где остановился script?

Я читал учебное пособие в bash, где они говорили, чтобы перезагрузить машину, не было никакой возможности перезапустить службу напрямую, это был вопрос перезагрузки машины, а затем после этого было еще несколько команд, которые по-прежнему нужны для запуска при настройке.

Итак, есть ли способ перезапустить ящик в процессе подготовки, а затем выбрать, где вы остановились после этого?

Ответ 1

Насколько я знаю, у вас не может быть ни одного script/набора команд, которые будут выполняться там, где он был остановлен, если он пытается перезагрузить ОС, например:

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

В этом примере второй эхо-вызов не будет выполнен.

Вы можете разделить script/команды вверх и использовать плагин, такой как брезентная перезагрузка.

Пример фрагмента Vagrantfile, чтобы выделить его возможное использование:

  # 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

Ответ 2

Я никогда этого не делал, но если бы мне пришлось разбивать script на две части, одну перед перезагрузкой, которая включает в себя команду перезапуска, а затем другую, которая устанавливает пост.

Первый также создаст файл блокировки.

Общий script будет запускать первый script, если файл блокировки не существует или запускается второй, если файл существует. Этот общий script будет настроен для запуска.

Ответ 3

Один трюк, который вы можете использовать, - отправить сигнал перезагрузки и сохранить оставшуюся часть работы по обеспечению безопасности как script для запуска при загрузке:

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 destroyed and never run again"
      rm /etc/rc.local
RCLOCAL
  chmod o+x /etc/rc.local
  shutdown -r now #restart
SHELL

Это было протестировано для работы с debian 9, поэтому вам может понадобиться включить службы или найти другой способ получить ваш загрузочный код для запуска при следующей загрузке, если вы используете что-то еще.

К сожалению, вы не можете просто сделать:

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.

Ответ 4

Vagrant имеет возможность перезагрузки для обеспечения, однако возможности гостевой перезагрузки в настоящее время не поддерживаются для Linux.

Вы можете проверить мой плагин здесь, https://github.com/secret104278/vagrant_reboot_linux/tree/master, я реализовал функцию для Linux для перезагрузки.