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:
# 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
config.vm.box = "hashicorp/precise64"
end
Vagrant API version
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.
# vb.gui = true
# vb.memory = "1024"
# end
v.customize ["modifyvm", :id, "--memory", 2048]
v.customize ["modifyvm", :id, "--cpus", 4]
end
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.
# 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:
sh.path "provision/setup_apache.sh"
end
The setup_apache.sh:
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.