» Basic Usage
Below are some very simple examples of how to use Vagrant Triggers.
» Examples
The following is a basic example of two global triggers. One that runs before_the :up
command and one that runs _after the :up
command:
Vagrant.configure("2") do |config|
config.trigger.before :up do |trigger|
trigger.name = "Hello world"
trigger.info = "I am running before vagrant up!!"
end
config.trigger.after :up do |trigger|
trigger.name = "Hello world"
trigger.info = "I am running after vagrant up!!"
end
config.vm.define "ubuntu" do |ubuntu|
ubuntu.vm.box = "ubuntu"
end
end
These will run before and after each defined guest in the Vagrantfile.
Running a remote script to save a database on your host before destroying aguest:
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"}
end
end
end
Now that the trigger is defined, running the destroy command will fire offthe defined trigger before Vagrant destroys the machine.
$ vagrant destroy ubuntu
An example of defining three triggers that start and stop tinyproxy on your hostmachine using homebrew:
#/bin/bash
# start-tinyproxy.sh
brew services start tinyproxy
#/bin/bash
# stop-tinyproxy.sh
brew services stop tinyproxy
Vagrant.configure("2") do |config|
config.vm.define "ubuntu" do |ubuntu|
ubuntu.vm.box = "ubuntu"
ubuntu.trigger.before :up do |trigger|
trigger.info = "Starting tinyproxy..."
trigger.run = {path: "start-tinyproxy.sh"}
end
ubuntu.trigger.after :destroy, :halt do |trigger|
trigger.info = "Stopping tinyproxy..."
trigger.run = {path: "stop-tinyproxy.sh"}
end
end
end
Running vagrant up
would fire the before trigger to start tinyproxy, where asrunning either vagrant destroy
or vagrant halt
would stop tinyproxy.
» Ruby Option
Triggers can also be defined to run Ruby, rather than bash or powershell. Anexample of this might be using a Ruby option to get more information from the VBoxManage
tool. In this case, we are printing the ostype
defined for thte guest afterit has been brought up.
Vagrant.configure("2") do |config|
config.vm.define "ubuntu" do |ubuntu|
ubuntu.vm.box = "ubuntu"
ubuntu.trigger.after :up do |trigger|
trigger.info = "More information with ruby magic"
trigger.ruby do |env,machine|
puts `VBoxManage showvminfo #{machine.id} --machinereadable | grep ostype`
end
end
end
end
If you are defining your triggers using the hash syntax, you must use the Proc
type for defining a ruby trigger.
Vagrant.configure("2") do |config|
config.vm.define "ubuntu" do |ubuntu|
ubuntu.vm.box = "ubuntu"
ubuntu.trigger.after :up,
info: "More information with ruby magic",
ruby: proc{|env,machine| puts `VBoxManage showvminfo #{machine.id} --machinereadable | grep ostype`}
end
end
» Typed Triggers
Below are some basic examples of using :type
triggers. They cover commands, hooks,and actions.
It is important to note that while command
triggers will be a fairly common use case,both action
and hook
triggers are more complicated and are a more advanced use case.
» Commands
The most common use case for typed triggers are with command
. These kinds oftriggers allow you to run something before or after a subcommand in Vagrant.
config.trigger.after :status, type: :command do |t|
t.info = "Showing status of all VMs!"
end
Because they are specifically for subcommands, they do not work with any guestoperations like run_remote
or if you define the trigger as a guest trigger.
» Hooks
Below is an example of a Vagrant trigger that runs before and after each definedprovisioner:
config.trigger.before :provisioner_run, type: :hook do |t|
t.info = "Before the provision!"
end
config.vm.provision "file", source: "scripts/script.sh", destination: "/test/script.sh"
config.vm.provision "shell", inline: <<-SHELL
echo "Provision the guest!"
SHELL
Notice how this trigger runs before each provisioner defined for the guest:
==> guest: Running provisioner: Sandbox (file)...
==> vagrant: Running hook triggers before provisioner_run ...
==> vagrant: Running trigger...
==> vagrant: Before the provision!
guest: /home/hashicorp/vagrant-sandbox/scripts/script.sh => /home/vagrant/test/script.sh
==> guest: Running provisioner: shell...
==> vagrant: Running hook triggers before provisioner_run ...
==> vagrant: Running trigger...
==> vagrant: Before the provision!
guest: Running: inline script
guest: Provision the guest!
» Actions
With action typed triggers, you can fire off triggers before or after certainAction classes. A simple example of this might be warning the user when Vagrantinvokes the GracefulHalt
action.
config.trigger.before :"Vagrant::Action::Builtin::GracefulHalt", type: :action do |t|
t.warn = "Vagrant is halting your guest..."
end