Now that we have learned the basics of how to work with Vagrant, let’s now go a little further into working with the fundamentals in Vagrant. In this vagrant tutorial, we’re going to create a new development environment using the precise32 box as we have done already. This time, however, we are going to add some shell provisioning to the Vagrantfile in order to automatically install the NGINX web server on our new virtual machine. Of course, we could go into the VM and manually install nginx process via SSH, but that kind of defeats the purpose of Vagrant. We want to be able to share our Vagrantfile with another developer or administrator, and all they need to do is type vagrant up. They won’t have to fiddle with manual installation of software, it is all scripted out for them. This leads to better control over our environment, and easier collaboration with others.
Start a new Vagrant environment
From our home directory, we’ll make a new directory named nginx
and then cd into it. Once there, we will go ahead and run the command vagrant init hashicorp/precise32 –minimal. This will give us a brand new Vagrantfile with a minimal configuration base. As we can see in this screenshot we make use of mkdir nginx
, cd nginx
, and vagrant init hashicorp/precise32 --minimal
.
Enable Vagrantfile Syntax Highlighting
The Vagrantfile is written in Ruby, it has no extension, however – so most times you will not see any syntax highlighting when editing it. In this episode, we are making use of Visual Studio Code, and it turns out there is an extension you can add to the IDE in order to enable syntax highlighting of the Vagrantfile. In this screenshot, we located it by clicking on View->Extensions, and then searching for Vagrantfile. After that, all we have to do is click install.
Add Material Theme
While we are at it, why don’t we add a super cool looking theme to the editor? This Material Theme is one of the most popular for Visual Studio Code, so let’s go ahead and install that. We can do this in the same extension viewer as the previous step.
Looking Good
Behold! The Vagrantfile in all of it’s syntax highlighted glory!
Instruct Vagrant to use a shell provisioner
Since we would like Vagrant to handle the task of installing Nginx on the virtual machine for us, we need to find a method to do this. One option is to make use of a shell script. In order to instruct Vagrant to make use of a shell script, we must adjust the Vagrantfile to how it looks in this snippet. Basically with that new line added we tell Vagrant that we are going to use a shell script for provisioning, and where to find said shell script via the path attribute. Note the addition of config.vm.provision “shell”, path: “provision.sh”.
Vagrant.configure(2) do |config|
config.vm.box = "hashicorp/precise32"
config.vm.provision "shell", path: "provision.sh"
end
Create the shell script to install nginx
At this point, Vagrant knows there is a shell script involved, but we need to actually put some commands into the script file itself in order for it to do anything. That is exactly what we do in this step. If we were to install Nginx manually, these are the exact commands we would need to run in order to get the Nginx software installed and running. Note we add three simple commands of apt-get -y update
, apt-get -y install nginx
, and service nginx start
to the file and save it. Do note, this file lives in the same exact directory as the Vagrantfile itself.
Confirm the files are correct
On the host operating system, let’s make sure that both the Vagrantfile and the provision.sh file look correct. A quick inspection indicates they look good.
Ready for vagrant up
At the command prompt, we are ready to type vagrant up. This will kick off the process of Vagrant building our virtual machine for us. In addition to this, since we added a shell script to the Vagrantfile, Vagrant will go ahead and execute anything in that script automatically. As we can see in this screenshot, as part of the process of the VM coming online, Nginx is being fetched from a remote server and installed for us. So cool!
Check the status of nginx
We can now vagrant ssh
into the guest operating system and have a look at the nginx service. Note that it is running as we see here via the service nginx status
command.
Fetch the nginx welcome page
We won’t be able to use a browser just yet, but we can fetch the index.html page right from the console via wget -qO- localhost
. Check it out, we get the raw html right in the terminal window. It might be nice to also test this from a browser, so let’s set up port forwarding next in order to do this.
Set up port forwarding
We can make one additional configuration change to the Vagrantfile so that we can browse to our newly installed Nginx web server. Note the updated line of config.vm.network “forwarded_port”, guest: 80, host: 8080, id: “nginx” below. With this change, we should be able to launch a browser and see the Nginx welcome page right away. Do note, any time you make a change to the Vagrantfile and the virtual machine is already running, you will need to run a vagrant reload
or vagrant provision
to actually make the changes take effect.
Vagrant.configure(2) do |config|
config.vm.box = "hashicorp/precise32"
config.vm.provision "shell", path: "provision.sh"
config.vm.network "forwarded_port", guest: 80, host: 8080, id: "nginx"
end
Test from a browser
Finally! We can launch a browser, and confirm that our newly installed nginx web server is working perfectly. 🙂
How To Provision NGINX Using Vagrant Summary
And there it is, a fully functioning virtual machine with Nginx installed for us automatically. It is a simple example, but it shows how developers and administrators can now fully automate the building of custom components into their virtual machines. What’s more, the Vagrantfile is easily put into version control so that when a developer on the other side of the world needs to test out some software, they can build the exact same environment by simply having access to the right Vagrantfile and typing vagrant up
on a Vagrant enabled machine. In summary, we created a new directory for a new Vagrant environment, configured the Vagrantfile for shell provisioning, created the shell script to install Nginx, and ran Vagrant to set everything up for us. What a great tool Vagrant is!