Vagrant es una herramienta para la creación y configuración de entornos de desarrollo virtualizados desarrollada por HashiCorp. Originalmente se desarrolló para VirtualBox y sistemas de configuración tales como Chef, Salt y Puppet.
En este post, se va a utilizar Virtualbox como sistema de virtualización. Por lo tanto es necesario tenerlo instalado.
Instalar vagrant
apt install vagrant
Lo primero es crear la carpeta donde se creará el proyecto. En este caso a modo de ejemplo, se va a crear una infraestructura de 3 máquinas virtuales para simular un cluster.
mkdir cluster && cd cluster
Iniciar el proyecto
vagrant init A `Vagrantfile` has been placed in this directory. You are now ready to `vagrant up` your first virtual environment! Please read the comments in the Vagrantfile as well as documentation on `vagrantup.com` for more information on using Vagrant.
Descargar el box que necesitemos, un box es una imagen base del sistema que se usa para clonar y crear la máquina virtual. En este caso se usará ubuntu16.04
vagrant box add ubuntu/xenial64 ==> box: Loading metadata for box 'ubuntu/xenial64' box: URL: https://atlas.hashicorp.com/ubuntu/xenial64 ==> box: Adding box 'ubuntu/xenial64' (v20170321.0.0) for provider: virtualbox box: Downloading: https://atlas.hashicorp.com/ubuntu/boxes/xenial64/versions/20170321.0.0/providers/virtualbox.box ==> box: Successfully added box 'ubuntu/xenial64' (v20170321.0.0) for 'virtualbox'!
Ahora hay que configurar el Vagrantfile con las características que queremos que tenga nuestra máquina. En este caso va a levantar 3 maquinas virtuales en VirtualBox con una serie de características.
vim Vagrantfile # -*- mode: ruby -*- # vi: set ft=ruby : #Variable con el Box que se va a utilizar BOX = "ubuntu/xenial64" #Variable con la interfaz NIC = "wlp5s0" Vagrant.configure("2") do |config| config.vm.define "master" do |master| master.vm.box = BOX master.vm.hostname = 'master' #Configuración de la interfaz de red master.vm.network "public_network", bridge: NIC, use_dhcp_assigned_default_route: true #Post script de configuración master.vm.provision "shell", path: "config.sh" #Configuración de la máquina virtual config.vm.provider :virtualbox do |vb| vb.customize ["modifyvm", :id, "--natdnshostresolver1", "on"] vb.customize ["modifyvm", :id, "--memory", 3072] vb.customize ["modifyvm", :id, "--name", "master"] vb.customize ["modifyvm", :id, "--cpus", "2"] end end config.vm.define "node1" do |node1| node1.vm.box = BOX node1.vm.hostname = 'node1' node1.vm.network "public_network", bridge: NIC, use_dhcp_assigned_default_route: true node1.vm.provision "shell", path: "config.sh" node1.vm.provider :virtualbox do |vb| vb.customize ["modifyvm", :id, "--natdnshostresolver1", "on"] vb.customize ["modifyvm", :id, "--memory", 2048] vb.customize ["modifyvm", :id, "--name", "node1"] end end config.vm.define "node2" do |node2| node2.vm.box = BOX node2.vm.hostname = 'node2' node2.vm.network "public_network", bridge: NIC, use_dhcp_assigned_default_route: true node2.vm.provision "shell", path: "config.sh" node2.vm.provider :virtualbox do |vb| vb.customize ["modifyvm", :id, "--natdnshostresolver1", "on"] vb.customize ["modifyvm", :id, "--memory", 2048] vb.customize ["modifyvm", :id, "--name", "node2"] end end end
Ahora creamos el script de configuración. Se pueden hacer varios scripts y cargar a cada uno uno diferente
vim config.sh #!/bin/bash #Locales apt-get install -y language-pack-es localectl set-locale LANG=es_ES.utf8 #Actualizar apt-get update && apt-get -y upgrade #Instalar paquetes básicos apt-get install htop git curl tmux zsh
Y por último lanzar levantar vagrant. Para esto, se puede hacer todos a la vez con el comando
vagrant up
O se puede hacer de uno en uno con
vagrant up master
Ver el estado de los boxes
vagrant status
Una vez levantadas las máquinas, hay que conectarse a ellas mediante ssh de la siguiente forma
vagrant ssh master
Para eliminar todo sería de la siguiente manera
vagrant destroy
O para eliminar solo una máquina
vagrant destroy master