Logo Questions Linux Laravel Mysql Ubuntu Git Menu
 

Vagrant execute script or command after every guest restart (vagrant up)

I know about the provisioning script, but this is a different script that I am asking about. I want a script to be executed after every restart of the guest.

I am using shell provisioner.

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

I can't put my commands in this script that I want to run after every restart.

Basically, I want one of my applications to be started when user executes vagrant up.

My guest is ubuntu 14.04 trusty and one solution I found was to do following on my guest -

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

I can try to do this in my provisioning script, but sudo crontab -e asks for an editor and I have to kind of interactively add the line. Since the crontab file is not fixed I don't know if it is feasible to do one liner file edits like

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

I am guessing that this must be a guest OS specific thing.

Is this possible to achieve using Vagrant?

EDIT: corrected from ssh provisioner to shell provisioner.

like image 876
Pranav Shukla Avatar asked May 13 '16 10:05

Pranav Shukla


People also ask

What is the most important command in Vagrant?

Command: vagrant up [name|id] This command creates and configures guest machines according to your Vagrantfile. This is the single most important command in Vagrant, since it is how any Vagrant machine is created. Anyone using Vagrant must use this command on a day-to-day basis.

How to call vagrant up from any directory?

Using id allows you to call vagrant up id from any directory. -- [no-]destroy-on-error - Destroy the newly created machine if a fatal, unexpected error occurs. This will only happen on the first vagrant up .

What is a reload command in Vagrant?

The equivalent of running a halt followed by an up. This command is usually required for changes made in the Vagrantfile to take effect. After making any modifications to the Vagrantfile, a reload should be called. The configured provisioners will not run again, by default.

What does the --provision command do in Vagrant?

This command is usually required for changes made in the Vagrantfile to take effect. After making any modifications to the Vagrantfile, a reload should be called. The configured provisioners will not run again, by default. You can force the provisioners to re-run by specifying the --provision flag. --provision - Force the provisioners to run.


2 Answers

you can use run: 'always'

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

This will make sure your command are executed every time your VM is starting (vagrant up or vagrant reload)

If you need only certain commands to be always run, you can split your 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 will be run in order, bootstrap1 then 2 then 3 when the machine is first provisioned

any further time you run vagrant up (or reload) only bootstrap2 will be run

like image 65
Frederic Henri Avatar answered Sep 22 '22 18:09

Frederic Henri


Just offering an alternative here that worked for me, using vagrant triggers. Consider this example straight from their docs:

Running a remote script to save a database on your host before destroying a guest:

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 

There's also the related vagrant-triggers plugin you can check out

like image 40
kip2 Avatar answered Sep 22 '22 18:09

kip2