Deploy your development infrastructure with 1 cmd💡
Tags: devops, vagrant, automation
Published: 2022-04-07 08:33:23

**_Vagrant_** is command line utility for managing the lifecycle of virtual machines. It help you to deploy a cluster of server with just one command line. And for that, we only need to create vagrantfile which will contain configuration of the VM you want to deploy.

Vagrant will create VM based on the Virtualisation software you're using. In my case, I'll use Virtualbox. But it's also work with VMware, Docker, Hyper-V or a custom provider (AWS). These virtualisation tools are called  _**Providers**_ in Vagrant.

A pratical use case of vagrant can be : "In a company, if a developer want to test a feature on his computer before pushing to production, he can use a vagrantfile build by for example a devops engineer and get all an infrastructure similar to production".


![Image description](https://dev-to-uploads.s3.amazonaws.com/uploads/articles/ith92omhvtckcpisiexk.png)
The image above present global architecture of Vagrant.


## **Get Started with Vagrant**

> I'm using Ubuntu 20.04 for this lab

### How to install vagrant ?
Before installing vagrant, you need to install virtualisation tool for example virtualbox in case. Run the command below if you want to use virtualbox and it's not installed.

```
sudo apt update
sudo apt install virtualbox -y
```

Add repository addition dependencies if it's not installed on your system.
```
sudo apt install -y apt-transport-https \
                    ca-certificates \
                    curl \
                    software-properties-common
```

Add the official Vagrant APT repository to your system
```
curl -fsSL https://apt.releases.hashicorp.com/gpg | sudo apt-key add -
sudo apt-add-repository "deb [arch=amd64] https://apt.releases.hashicorp.com $(lsb_release -cs) main"
```

And finaly run command below to install vagrant
```
sudo apt update
sudo apt install vagrant -y
vagrant --version
```

### How to use Vagrant ?
#### Vagrantfile
We'll use a simple vagrantfile for this tuto. You can check the full documentation on how to create vagrantfile [here](https://www.vagrantup.com/docs/vagrantfile).

```ruby
# -*- mode: ruby -*-
# vi: set ft=ruby :

BRIDGE_NETWORK = "Realtek RTL8852AE WiFi 6 802.11ax PCIe Adapter"
#replace with with your bridge network

### Master (Kubernetes Master Node)
MASTER_RAM = 4096
MASTER_CPU = 4

### Cluster nodernetes
N = 2
RAM = 2048
CPU = 2
PRIVATE_IP_PREFIX = "192.168.130."
PUBLIC_IP_PREFIX = "192.168.1."

Vagrant.configure("2") do |config|
  config.vm.provision "shell", inline: "echo Hello"

  (1..N).each do |machine_id|
    config.vm.define "node-0#{machine_id}" do |node|
      node.vm.box = "peru/ubuntu-20.04-server-amd64"
      node.vm.hostname = "node-0#{machine_id}"
      node.vm.provider "virtualbox" do |v|
        v.name = "node-0#{machine_id}"
        v.memory = RAM
        v.cpus = CPU
      end
      node.vm.network "public_network", bridge: BRIDGE_NETWORK, ip: "#{PUBLIC_IP_PREFIX}#{170+machine_id}"
      node.vm.network "private_network", ip: "#{PRIVATE_IP_PREFIX}#{170+machine_id}"
      # config.vm.provision "ansible" do |ansible|
      #   ansible.playbook = "ansible-playbook/site_staging.yml"
      # end
#you can use playbook there to configure your vm after their creation
    end
  end

  config.vm.define "master" do |master|
    master.vm.box = "peru/ubuntu-20.04-server-amd64"
    master.vm.provider "virtualbox" do |v|
      v.name = "master"
      v.memory = MASTER_RAM
      v.cpus = MASTER_CPU
    end
    master.vm.network "public_network", bridge: BRIDGE_NETWORK, ip: "#{PUBLIC_IP_PREFIX}#{170}"
    master.vm.network "private_network", ip: "#{PRIVATE_IP_PREFIX}#{170}"
  end

end
```
This image present code in vagrantfile for configuration of a VM worker node in Kubernetes Cluster. Full Code [here](https://github.com/arthking17/vm-provisioning-with-vagrant) 


#### Deploy a Cluster with Vagrant
After writing your vagrantfile, we just need to run the command `vagrant up` to create our cluster.

```
vagrant validate //look for error in our vagrantfile
vagrant up
```
Delete the cluster by using the command below
```
vagrant destroy
```
Remote ssh to your VM using the command below
```
ssh vagrant@ip //ip of the VM your want to connect
```

> The default username and password in VM create with vagrant is **_vagrant_**.