Vagrantfile explained

Post’s pre-requisites:

You must understand each and every word in ‘vagrant up‘, otherwise the following text won’t make much sense to you.


A minimal Vagrantfile

Let’s start with a minimal Vagrantfile, which you’ll get on executing vagrant init hashicorp/precise64:

 

# -*- mode: ruby -*-
# vi: set ft=ruby :# All Vagrant configuration is done below. The "2" in Vagrant.configure
# configures the configuration version (we support older styles for
# backwards compatibility). Please don't change it unless you know what
# you're doing.
Vagrant.configure("2") do |config|
# The most common configuration options are documented and commented below.
# For a complete reference, please see the online documentation at
# https://docs.vagrantup.com.# Every Vagrant development environment requires a box. You can search for
# boxes at https://atlas.hashicorp.com/search.
config.vm.box = "hashicorp/precise64"# Disable automatic box update checking. If you disable this, then
# boxes will only be checked for updates when the user runs
# `vagrant box outdated`. This is not recommended.
# config.vm.box_check_update = false# Create a forwarded port mapping which allows access to a specific port
# within the machine from a port on the host machine. In the example below,
# accessing "localhost:8080" will access port 80 on the guest machine.
# config.vm.network "forwarded_port", guest: 80, host: 8080# Create a private network, which allows host-only access to the machine
# using a specific IP.
# config.vm.network "private_network", ip: "192.168.33.10"# Create a public network, which generally matched to bridged network.
# Bridged networks make the machine appear as another physical device on
# your network.
# config.vm.network "public_network"# Share an additional folder to the guest VM. The first argument is
# the path on the host to the actual folder. The second argument is
# the path on the guest to mount the folder. And the optional third
# argument is a set of non-required options.
# config.vm.synced_folder "../data", "/vagrant_data"# Provider-specific configuration so you can fine-tune various
# backing providers for Vagrant. These expose provider-specific options.
# Example for VirtualBox:
#
# config.vm.provider "virtualbox" do |vb|
# # Display the VirtualBox GUI when booting the machine
# vb.gui = true
#
# # Customize the amount of memory on the VM:
# vb.memory = "1024"
# end
#
# View the documentation for the provider you are using for more
# information on available options.# Define a Vagrant Push strategy for pushing to Atlas. Other push strategies
# such as FTP and Heroku are also available. See the documentation at
# https://docs.vagrantup.com/v2/push/atlas.html for more information.
# config.push.define "atlas" do |push|
# push.app = "YOUR_ATLAS_USERNAME/YOUR_APPLICATION_NAME"
# end# Enable provisioning with a shell script. Additional provisioners such as
# Puppet, Chef, Ansible, Salt, and Docker are also available. Please see the
# documentation for more information about their specific syntax and use.
# config.vm.provision "shell", inline: <<-SHELL
# apt-get update
# apt-get install -y apache2
# SHELL
end

The above file has so many scary lines, but in fact it has only two configuration lines (lot of other commented lines) i.e. removing the commented part makes it:
Vagrant.configure("2") do |config|
config.vm.box = "hashicorp/precise64"
end
Vagrant API version
The line 1 is Vagrant API version specification – Vagrant requires explicit mention of the API versions in the configuration file, to stay backward compatible. So in every Vagrantfile we need to specify which version to use. The current one is version 2 which works with Vagrant 1.1 and up.
The line 1 and 3 enclose all the configuration in Vagrantfile i.e. the first line is specifying the version and staring a block, and ‘end’ specify the block closing.
config.vm.box = "hashicorp/precise64"
Here it is specified, what Vagrant box to use. precise64 by hashicorp is a publicly available basic Ubuntu 12.04 (32 and 64-bit) box good for minimal use cases (you see it in almost every Vagrant post).
The config namespace is mainly about config.vm i.e. the required conf parameters for VM are of form config.vm.*
Config namespace: config.vm
The settings within config.vm modify the configuration of the machine that Vagrant manages.

Looking further – into the commented configuration parameters – The above two lines are enough to get started with your VM, But in case you’re curious, or simply want to check the effect of other configuration options – below is the explanation of all the commented configuration parameters in the file:
config.vm.network – You can set anything related to VM’s network configuration using the ‘config.vm.network’ variable. Configures networks on the machine. Please see the networking page for more information.
config.vm.network "forwarded_port", guest: 80, host: 8080
Creates port forwarding – guest/VM’s port 80 will be accessible on host’s port 8080 i.e. if you have webserver running Apache, or NginX (using port 80), it’ll be accessible from host using localhost:8080.
config.vm.network "private_network", ip: "192.168.33.10"
Use this setting to create a private network for VM i.e. will only be accessible via host, specifically using the (above) set IP.
config.vm.network "public_network"
The other type of network we can set for the VM is public network, quite like bridged network – will make the your VM a separate node on your network.

config.vm.synced_folder "../data", "/vagrant_data"

Is for sharing a folder between the host and VM i.e. the first argument ‘../data’ is the path to the host folder, and the second argument ‘/vagrant_data’ (the name is an example – you can set whatever you want) is the folder on guest/VM. This can be super helpful for sharing files between host and guest, or simply you can work on files while VM is powered-off i.e. simply edit the host copy of the file and it’ll get synced on guest once powered-on.


Provider specific configuration

Provider is the virtualization software Vagrant uses to create a VM, as mentioned in the previous post, Vagrant itself is just a wrapper on top of providers i.e. VitualBox, libvirt, VMWare, etc. The minimal file have the provider configuration commented though it’s a requirement – the reason is, Vagrant takes VirtualBox as the default provider, in case you don’t specify otherwise.

# config.vm.provider "virtualbox" do |vb|
#   vb.gui = true
#   vb.memory = "1024"
# end
config.vm.provider “virtualbox” do |vb| – instructing Vagrant to use VirtualBox as the provider (virualization software). And all the provider specific settings are to be specified after this line and before the block’s end.
vb.gui = true – It’ll enable the VirtualBox GUI (Graphical User-Interface) for this machine. Not setting it or, setting it to false runs the machine in headless mode i.e. there’ll be no UI for the virtual machine visible on the host machine.
vb.memory = “1024” – explicitly specifying to allocate 1 GB of RAM for the VM.
Apart this we can specify these customizations in VBoxManage (Vagrant itself uses VBoxManage utility for setting VM specific parameters before booting it up) format:
config.vm.provider :virtualbox do |v|
v.customize ["modifyvm", :id, "--memory", 2048]
v.customize ["modifyvm", :id, "--cpus", 4]
end
Where modifyvm is the VBoxManage command name, which takes VM id (the GUI for the VM) as param, and next are the options ‘–memory’, ‘–cpu’, followed by the value you want it to set – the VBoxManage command ‘d be:
$ VBoxManage modifyvm 'id/name' --memory 2048

Provisioner-specific configuration

Vagrant requires a provisioner to finally provision the machine, this happens after you run ‘vagrant up‘.  Provisioner can be any of the openly available configuration management tools, like Chef, Puppet, or simply a shell script. Vagrant requires Provisioners to automatically install software, alter configurations, and more on the machine as part of the vagrant provision and coming live process.

# config.vm.provision "shell", inline: <<-SHELL
# apt-get update
# apt-get install -y apache2
# SHELL

config.vm.provision “shell” – specifying simple shell provisioner, with inline mode i.e. specifying the commands to run here too. Here Vagrant has been instructed to run update, followed by Apache 2 installation. You can also use a separate shell script, and specify the path to it in this block:

config.vm.provision "shell" do |sh|
sh.path "provision/setup_apache.sh"
end

The setup_apache.sh:

#!/bin/bash

echo "Provisioning First VM ..."

echo "Updating ...."
apt-get update

echo "Installing Apache2 ..."
apt-get install -y apache2

In case of any confusion, let me know in the comment section.

Leave a Reply

Your email address will not be published. Required fields are marked *