Vagrant исполняет команду script или команду после перезапуска каждого гостя (бродяга вверх)

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

Я использую средство обеспечения оболочки.

config.vm.provision :shell, path: "vagrant/bootstrap.sh"

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

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

Мой гость ubuntu 14.04 trusty, и одно решение, которое я нашел, должно было делать следующее на моем гостю -

sudo crontab -e
#add the following line 
@reboot sh /path/to/my_script_on_guest.sh

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

echo '@reboot sh /path/to/my_script_on_guest.sh' >> crontab_file

Я предполагаю, что это должна быть специфическая гостевая ОС.

Можно ли достичь использования Vagrant?

РЕДАКТИРОВАТЬ: исправлено с помощью ssh-ассистента в средство обеспечения оболочки.

Ответы

Ответ 1

вы можете использовать run: 'always'

config.vm.provision :shell, path: "vagrant/bootstrap.sh", run: 'always'

Это гарантирует, что ваша команда будет выполняться каждый раз, когда ваша виртуальная машина запускается (бродячая или бродячая перезагрузка)

Если вам нужно выполнить только определенные команды, вы можете разделить свой script

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"

script будет запущен в порядке, bootstrap1 затем 2, затем 3, когда машина будет сначала обеспечена

в любое другое время, когда вы запустите vagrant up (или перезагрузите), будет запущен только bootstrap2

Ответ 2

Просто предлагая альтернативу, которая работала для меня, используя бродячие триггеры. Рассмотрим этот пример прямо из их документов:

Запуск удаленного сценария для сохранения базы данных на вашем хосте перед уничтожением гостя:

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

Там также есть связанный плагин vagrant-triggers, который вы можете проверить

Ответ 3

Я использовал Ubuntu 18.04. Триггеры не работают для меня, поэтому я решил скопировать сценарий пост-предоставления в окно vm, а затем из основного сценария выполнить желаемое пост-предоставление:

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

Содержание основного сценария использует exec для обновления новой оболочки. Вы также можете использовать

сброс

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