353.4 Vagrant (weight: 3)
Description Candidate should be able to use Vagrant to manage virtual machines, including provisioning of the virtual machine.
Key Knowledge Areas:
Understand Vagrant architecture and concepts, including storage and networking
Retrieve and use boxes from Atlas
Create and run Vagrantfiles
Access Vagrant virtual machines
Share and synchronize folder between a Vagrant virtual machine and the host system
Understand Vagrant provisioning, i.e. File and Shell provisioners
Understand multi-machine setup
Partial list of the used files, terms and utilities:
vagrant
Vagrantfile
Vagrant es una herramienta que nos ayuda a desplegar máquinas virtualizadas rápidamente, ademas a estas máquinas se les puede añadir una configuración en el despliege via script, ansible y otros, donde podremos desplegar y configurar una o varias máquinas de manera rápida y eficaz.
Cabe decir que vagrant es solo la herramienta de despliegue, necesita de un proveedor de virtualización, como VirtualBox, VMware, Amazon EC2, LXC, DigitalOcean, libvirt, etc.
Instalación
Para que vagrant funcione hay que tener un proveedor de máquinas virtuales, tipo virtualbox, libvirt, etc.
El el siguiente recuadro se muestra como intalar Vagrant para el proveedor libvirt, par otros proveedores consultar el enlace de documentación.
# Instalar vagrant-libvirt
sudo apt install vagrant-libvirt libvirt-daemon-system
# añadir usuario al grupo libvirt para evitr utilizar sudo
sudo usermod --append --groups libvirt $USER
# reiniciada la sesión comprovar el user añadido al grupo y la versión de vagrant
cat /etc/group | grep libvirt
vagrant --version
Vagrant 2.2.3
Boxes
En vagrant Boxes juega un papel inportante, ya que es el repositorio de imagenes base. Estas imagenes ya son un sistema operativo intalado y listo para utilizar, aqui recae la gracia y rapidez de vagrant.
Una vez vas desplegando máquinas se van guardando las imagenes localmente.
➜ vagrant cloud search ubuntu # buscar imagenes disponibles
➜ vagrant box add ubuntu/enial64 # añadir una imagen al box
➜ vagrant box list
debian/buster64 (libvirt, 10.4.0)
debian/buster64 (virtualbox, 10.4.0)
ubuntu/trusty64 (virtualbox, 20190514.0.0)
Desplegar
Al desplegar máquinas con vagrant hay que tener en cuenta que crea archivos para guardar configuraciones, por lo tanto es buena práctica crear un directorio donde se va a crear cada entorno de máquinas.
En el siguiente ejemplo se muestra como desplegar una máquina debian buster con el proveedor libvirt
# iniciar directorio como entorno vagrant con base debian/buster
vagrant init debian/buster64
# levantar máquina con entorno libvirt
vagrant up --provider=libvirt
# ahora ya podemos acceder a la shell de la máquina
vagrant ssh
Los archivos que genera el entorno vagrant son .vagrant
archivos relacionados con la máquina virtual y Vagrantfile
configuración a asignar a la máquina.
➜ ls -al
total 16
drwxr-xr-x 3 debian debian 4096 ene 15 10:55 .
drwxr-xr-x 12 debian debian 4096 ene 15 10:47 ..
drwxr-xr-x 4 debian debian 4096 ene 15 10:55 .vagrant
-rw-r--r-- 1 debian debian 3022 ene 15 10:52 Vagrantfile
Comandos básicos
vagrant init debian/buster64
vagrant up # levantar configuracion/maquinas
vagrant up --provider=libvirt
vagrant halt # apagar
vagrant suspend # suspender
vagrant destroy # destrouir
vagrant reload # recargar archivo vagrantfile en maquina desplegada
vagrant ssh [nombre_maquina] # acceder a la maquina
vagrant cloud search buntu
vagrant box list
vagrant box add ubuntu/enial64
vagrant snapshot list
vagrant snapshot save [maquina] name-snap
vagrant snapshot restore [maquina] name-snap
vagrant snapshot delete [maquina] name-snap
vagrant status # ver estado de las máquinas
vagrant global-status # lo mismo pero extendido
vagrant port # ver mapeos de puertos
Configuraciones
Una vez iniciado un entorno vagrant con init
se cre un archivo VagrantFile
donde configuramos la/s máquina que queremos desplegar.
config.vm.define "mv0" do |test|
test.vm.box = "debian/buster64"
test.vm.hostname = "mv0
test.vm.provider :libvirt do |lb|
lb.memory = "1024"
end
end
Aprovisionamiento
El aprovisionamiento es una de las grandes utilidades de la configuración de vagrant, sirve para instalar o configurar todo lo que necesites en el primer arranque de la máquina.
Para hacer este despliege puedes utilizar, shell, script, ansible, chef, etc.
VagrantFile
# despliege con shell
config.vm.provision "shell", inline: <<-SHELL
apt-get update
apt-get install -y nginx
SHELL
# depliege con script
config.vm.provision "shell", path: 'script.sh'
# despliege con ansible
config.vm.provision "ansible" do |ansible|
ansible.playbook = "instrucciones.yml"
end
Rendimiento
La configuración del rendimiento que quieres dar a una máquina es importante, en la sección provider podemos configurar cuanta ram mo cpu tendrá nuestra máquina.
config.vm.provider :libvirt do |lb|
lb.memory = "1024"
lb.cpus = 2
end
Network
Por defecto vagrant crea las máquinas con un interfaz NAT hacia nuestro host, donde se veran entre ellas pero desde el exterior no podras ver la máquina virtual.
-
Private_network
esta opción añade una red privada, que solo se veran entre las maquinas virtuales. -
Public-network
esta opción cre un bridge a la interfaz del host y se vera como una máquina mas en la LAN -
Forwarded_port
redireccionar un puerto de el host a la máquina virtual.
# redireccionmiento de vpuerto a la interfaz localhost
config.vm.network "forwarded_port", guest: 80, host: 8080
# redireccionmiento de vpuerto a la interfaz 192.168.88.2
config.vm.network "forwarded_port", guest: 80, host: 8080, host_ip: "192.168.88.2"
# interfaz privada
config.vm.network "private_network", ip: "192.168.33.10"
# interfaz publica
config.vm.network "public_network"
En libvirt la interfaz publica da problemas y se tiene que crear un bridge anualmente para que fincuione correctamente.
# VagrantFile
config.vm.network "public_network", dev: "br0", mode: "bridge", type: "bridge"
# /etc/network/interfaces
...
auto br0
iface br0 inet dhcp
bridge_ports enp3s0
bridge_stp off
bridge_fd 0
bridge_maxwait 0
Volumes
Los puntos de montaje siempre son utiles para transferir archivos entre nuestras máquinas.
config.vm.synced_folder "../data", "/vagrant_data"
Discos
Añadir discos extra a la máquina virtual
config.vm.provider :libvirt do |lb|
lb.storage :file, size:'2G'
lb.storage :file, size:'2G'
end
Multi_maquina
Para según que proyectos es necesario levantar mas de una máquina virtual. Pues simplemente definiendo multiples máquinas en el archivo VagrantFile
se desplegaran a la vez.
Vagrant.configure("2") do |config|
config.vm.define "web1" do |web1|
web1.vm.box = "debian/buster64"
web1.vm.provider :libvirt
web1.vm.hostname = "ojoaldato.net"
web1.vm.network "public_network", dev: "br0", mode: "bridge", type: "bridge"
config.vm.provision "shell", inline: <<-SHELL
apt-get update
apt-get install -y nginx
SHELL
end
# ---------------------
config.vm.define "web2" do |web2|
web2.vm.box = "debian/buster64"
web2.vm.provider :libvirt
web2.vm.hostname = "vayviene.net"
web2.vm.network "public_network", dev: "br0", mode: "bridge", type: "bridge"
config.vm.provision "shell", inline: <<-SHELL
apt-get update
apt-get install -y nginx
SHELL
end
end
Snapshot
sintaxis vagrant snapshot save [maquina] name-snap
# crear snapshot
➜ vagrant vagrant snapshot save web snap01
==> web: Snapshotting the machine as 'snap01'...
==> web: Snapshot saved! You can restore the snapshot at any time by
==> web: using `vagrant snapshot restore`. You can delete it using
==> web: `vagrant snapshot delete`.
# ver snapshot
➜ vagrant vagrant snapshot list
==> web:
snap01
# restaurar snap
➜ vagrant vagrant snapshot restore web snap01
# eliminar snap
➜ vagrant vagrant snapshot delete web snap01