Vagrant
és una eina lliure per a la creació i el treball amb entorns de desenvolupament. Aquests entorns de desenvolupament se sustenten sobre alguna eina de virtualització com VirtualBox
, libvirt
o Docker
, per la qual cosa a la pràctica Vagrant
ens permetrà definir en un arxiu Vagrantfile
la nostra infraestructura.
A partir del fitxer Vagrantfile
l’eina vagrant s’encarregarà de:
D’aquesta manera és molt senzill desplegar infraestructura a partir d’un fitxer i, quan ja no calgui, esborrar el directori del projecte i deixar la màquina neta.
Per a cada projecte vagrant
utilitza un directori, com a exemple podem crear el directori ubuntu-focal
per treballar amb una MV d’Ubuntu 20.04 Focal Fossa
.
[alumne@elpuig ~]$ mkdir ubuntu-jammy
[alumne@elpuig ~]$ cd ubuntu-jammy/
La configuració del projecte s’escriu al fitxer Vagrantfile
que podem crear directament amb l’ordre vagrant init <box>
indicant una de les MVs que es troben a Vagrant Cloud
. Per exemple, la distribució Ubuntu manté imatges oficials a https://app.vagrantup.com/ubuntu.
[alumne@elpuig ubuntu-jammy]$ vagrant init ubuntu/jammy64
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.
[alumne@elpuig ubuntu-jammy]$ ll
total 4
-rw-rw-r--. 1 alumne alumne 3020 15 jul. 14:23 Vagrantfile
[alumne@elpuig ubuntu-jammy]$
Ara podem aixecar tota la infraestructura (afegint el paràmetre --provider=virtualbox
perquè en algunes màquines el provider per defecte és libvirt
) amb vagrant up
:
[alumne@elpuig ubuntu-jammy]$ vagrant up --provider=virtualbox
Bringing machine 'default' up with 'virtualbox' provider...
==> default: Importing base box 'ubuntu/jammy64'...
==> default: Matching MAC address for NAT networking...
==> default: Checking if box 'ubuntu/jammy' version '20210709.0.0' is up to date...
==> default: Setting the name of the VM: ubuntu-jammy_default_1626352374768_57256
==> default: Clearing any previously set network interfaces...
==> default: Preparing network interfaces based on configuration...
default: Adapter 1: nat
==> default: Forwarding ports...
default: 22 (guest) => 2222 (host) (adapter 1)
==> default: Running 'pre-boot' VM customizations...
==> default: Booting VM...
==> default: Waiting for machine to boot. This may take a few minutes...
default: SSH address: 127.0.0.1:2222
default: SSH username: vagrant
default: SSH auth method: private key
default:
default: Vagrant insecure key detected. Vagrant will automatically replace
default: this with a newly generated keypair for better security.
default:
default: Inserting generated public key within guest...
default: Removing insecure key from the guest if it's present...
default: Key inserted! Disconnecting and reconnecting using new SSH key...
==> default: Machine booted and ready!
==> default: Checking for guest additions in VM...
==> default: Mounting shared folders...
default: /vagrant => /home/alumne/ubuntu-jammy
[alumne@elpuig ubuntu-focal]$
Aquesta comanda descàrrega (les màquines descarregades es guarden a ~/.vagrant.d/
) —si cal— la màquina utilitzada, crea una MV a VirtualBox
, la configura, l’encén i la prepara amb la clau pública del host per poder iniciar sessió amb ssh
.
[alumne@elpuig ubuntu-jammy]$ vagrant ssh
Welcome to Ubuntu 20.04.2 LTS (GNU/Linux 5.4.0-77-generic x86_64)
* Documentation: https://help.ubuntu.com
* Management: https://landscape.canonical.com
* Support: https://ubuntu.com/advantage
System information as of Thu Jul 15 12:38:47 UTC 2021
System load: 0.0 Processes: 110
Usage of /: 3.2% of 38.71GB Users logged in: 0
Memory usage: 19% IPv4 address for enp0s3: 10.0.2.15
Swap usage: 0%
1 update can be applied immediately.
To see these additional updates run: apt list --upgradable
vagrant@ubuntu-jammy:~$
A més, per defecte s’ha compartit el directori del projecte (~/ubuntu-jammy
) entre la màquina física i la màquina virtual. Així resulta molt senzill compartir fitxers ja que el directori del projecte estarà muntat a la MV al directori /vagrant
:
vagrant@ubuntu-jammy:~$ ll /vagrant
total 8
drwxrwxr-x 1 vagrant vagrant 38 Jul 15 12:32 ./
drwxr-xr-x 20 root root 4096 Jul 15 12:33 ../
drwxrwxr-x 1 vagrant vagrant 32 Jul 15 12:32 .vagrant/
-rw-rw-r-- 1 vagrant vagrant 3020 Jul 15 12:23 Vagrantfile
vagrant@ubuntu-focal:~$
La comanda vagrant status
ens mostrarà informació sobre l’estat de les nostres MVs i les podrem aturar amb vagrant halt
o suspendre amb vagrant suspend
. En qualsevol cas, es podran tornar a encendre amb vagrant up
.
Quan ja no siguin necessàries les MVs es podran esborrar amb vagrant destroy
.
L’entorn que prepara vagrant
està definit al fitxer Vagrantfile
del projecte. Podeu consultar la documentació sobre els fitxers Vagrantfile
a https://www.vagrantup.com/docs/vagrantfile.
El fitxer Vagrantfile
creat de manera automàtica al pas anterior té moltes línies comentades que mostren com realitzar algunes operacions senzilles.
La configuració per defecte del nostre Vagrantfile
no especifica la quantitat de memòria per a la nostra màquina virtual així que s’utilitza 1GB
.
Però podem descomentar les línies següents del nostre fitxer Vagrantfile
i canviar especificar el valor de memòria per a la nostra màquina.
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 = "2048"
end
Un cop creada la MV a partir de la imatge oficial, s’haurà de preparar d’alguna manera perquè compleixi la funció esperada per l’usuari.
Per aquesta tasca vagrant
utilitza diferents provisioners entre els quals es troba l’intèrpret shell
i Ansible
. Amb ells es pot especificar qualsevol tasca automàtica que s’hagi de fer per preparar les MVs.
Per exemple, si volguéssim instal·lar un servidor web apache
a la nostra MV podrem trobar un exemple comentat al nostre Vagrantfile
.
Si descomentem les línies següents:
config.vm.provision "shell", inline: <<-SHELL
apt-get update
apt-get install -y apache2
SHELL
S’instal·larà el servidor web apache
de manera automàtica en crear l’entorn, encara que sense afegir una redirecció per a un port o una nova interfície encara no serà possible accedir al servidor web des de la nostra màquina.
La manera més senzilla d’accedir a un servei, com el nostre servidor Apache, que s’executa a la MV és redirigir el trànsit d’un port de la nostra màquina física a la MV.
Com ja resulta habitual trobarem un exemple preparat al nostre Vagrantfile que precisament redirigeix el trànsit del port 8080 TCP
de la nostra màquina física al port 80 TCP
de la MV.
Per fer visible el servidor apache de la MV a http://localhost:8080 de la màquina física únicament haurem de descomentar la línia següent:
# 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.
# NOTE: This will enable public access to the opened port
config.vm.network "forwarded_port", guest: 80, host: 8080
També és possible afegir una interfície de xarxa nova a la MV en una xarxa privada diferent de la xarxa a la qual està connectat l’ordinador amfitrió.
Descomentant la següent línia del fitxer Vagrantfile
:
# 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"
S’afegirà una interfície de xarxa nova a la MV amb la IP 192.168.33.10
i a l’equip amfitrió s’afegirà automàticament una interfície de xarxa vboxnet0
(si és la primera) amb la IP 192.168.33.1
per permetre la comunicació.
La xarxa privada també pot servir per comunicar diferents MVs que sexecuten a l’equip.
Vagrant
sap com configurar la xarxa en diferents sistemes operatius, per exemple al nostre Ubuntu 20.04
s’ha afegit el fitxer /etc/netplan/50-vagrant.yaml
amb la configuració de la nova interfície:
---
network:
version: 2
renderer: networkd
ethernets:
enp0s8:
addresses:
- 192.168.33.10/24
També serà possible assignar les adreces de manera automàtica utilitzant:
config.vm.network "private_network", type: "dhcp"
https://elpuig.xeill.net/Members/vcarceler/articulos/introduccion-a-vagrant/index_html