====== Vagrant ======
Vagrant és una eina de codi lliure desenvolupada per HashiCorp per automatitzar la creació i gestió de màquines virtuals. La podriem classificar dins les eines de [[DevOps]] conegudes com a [[https://es.wikipedia.org/wiki/Infraestructura_como_c%C3%B3digo|Infraestructure as Code]]. Vagrant no és un virtualitzador, només automatitza tasques de forma programàtica, pel què necessita que tinguem instal·lat algun //provider// com VirtualBox o VMware.
{{ vagrant.png?300 }}
La web oficial és https://www.vagrantup.com/
Està pensada per poques màquines i per entorns de desenvolupament i test. Si el què volem és creació de moltes màquines per entorns de producció segurament el què necessitem son eines com Terraform.
Vagrant és particularment útil quan necessitem recrear un entorn molts cops, ja sigui per testejar eines, configuracions, etc. i poder clarificar el típic cas de "en la meva màquina funciona".
Articles relacionats:
* [[vagrant ubuntu libvirt|Vagrant amb Libvirt a Ubuntu/Debian]]
{{tag> #FpInfor #Ciber #CiberMp03 #Ceti #CetiMp03 #Asix Vagrant DevOps}}
===== Instal·lació =====
Les instruccions oficials les teniu aquí: https://www.vagrantup.com/downloads
Sol estar disponible als repositoris de les distribucions de Linux, però sempre convé instal·lar la versió que ens recomanen a la web de Vagrant.
\\
===== Definicions =====
* **Vagrantfile** : arxiu on es defineixen les VMs de les que volem automatizar la seva creació i configuració.
* **box** : imatge de disc de VM per utilitzar inicialment en el nostre entorn. Podem trobar un catàleg a la [[https://app.vagrantup.com/boxes/search|Vagrant Cloud]]. Hi ha imatges oficials de distribucions de GNU/Linux clàssiques però també imatges binàries de gent que hi carrega la seva configuració particularitzada o d'altres SO com Windows o MacOS.
\\
===== Creant una VM =====
Cada "escenari" de VMs Vagrant necessitarà una carpeta on situar un arxiu d'inici ''Vagrantfile''.
Creem una carpeta i inicialitzem un ''Vagrantfile'' amb la imatge ubuntu/focal64 :
$ mkdir -p makines/makina1
$ cd makines/makina1
$ vagrant init ubuntu/jammy64
$ vagrant up
Això hauria de ser prou per posar en marxa la màquina Ubuntu Focal Fossa dins el virtualitzador que tinguem a la nostra màquina //host//. Ens podem connectar a la màquina acabada de crear amb:
$ vagrant ssh
I ja podrem treballar sobre la nostra màquina :)
Per fer un exemple ràpid, instal·larem Apache i visitarem la web creada:
vagrant@ubuntu-focal $ sudo apt update
vagrant@ubuntu-focal $ sudo apt install -y apache2
vagrant@ubuntu-focal $ ip address
=== Tancament de la Vagrant Cloud o HCP Vagrant Registry ===
Com a conseqüència de la compra de l'empresa HashiCorp per part d'IBM el febrer de 2025, **la Vagrant Cloud (o HCP Vagrant Registry) es tancarà el Gener de 2027**. De fet, des de l'1 d'Octubre de 2026 ja no es podran pujar més imatges a aquest repositori públic.
A partir d'aquestes dates **caldrà que cada usuari hostatgi les seves imatges en servidors propis**. Molts proveïdors de Vagrant boxes com generic, Roboxes.org, etc. han deixat de publicar i actualitzar imatges i ens podem trobar amb errors si les utilitzem.
Sembla ser que el proveïdor ''bento'' sí que les seguirà proveint, caldrà veure amb quin mecanisme les publica.
\\
===== Xarxa =====
Amb la darrera instrucció podrem veure la IP de la màquina creada, que probablement sigui una 10.0.2.15.
Si esteu fent servir VirtualBox, en la configuració per defecte la xarxa està en NAT, pel què no puc accedir a la màquina que acabo de crear. Per accedir a l'Apache que acabo de crear tinc diverses opcions, per exemple:
* Configurar la xarxa en mode //bridge//.
* Fent un //port forwarding// a la màquina //host//.
==== Port forwarding ====
Provarem el //port forwarding//, al Vagrant file ja ens surt un exemple.
Sortim de la //shell// amb CTRL+D, i editem el ''Vagrantfile'' per a fer aquest canvi. Descomentem la línia:
config.vm.network "forwarded_port", guest: 80, host: 8080
==== Xarxa privada ====
També podríem configurar la interfície en modalitat //host-only network//, sol fer-se d'aquesta manera al ''Vagrantfile'':
config.vm.network "private_network", ip: "192.168.33.110"
Si el VirtualBox ens dona error al crear la xarxa, podem [[https://www.virtualbox.org/manual/ch06.html|editar la configuració de xarxa de VirtualBox]] per permetre les IPs de les VMs:
* 0.0.0.0/0 ::/0
==== Accedint els serveis ====
I ara reiniciem la màquina amb la nova configuració:
$ vagrant reload
Ara podem accedir a la web de la nova VM mitançant el //browser// de la màquina //host// a través del //forwarded port//:
http://localhost:8080
O bé directament a la IP de la màquina si està en modalitat xarxa interna:
http://192.168.33.110
I si voleu comprovar que realment és la nostra nova màquina, personalitzeu la //default page// d'Apache:
vagrant@ubuntu-focal:~$ sudo -s
root@ubuntu-focal:/home/vagrant# echo "
Maquina vagrant
" > /var/www/html/index.html
Revisiteu la pàgina i... Voilà!
Resum de comandes utilitzades:
vagrant init
vagrant up
vagrant ssh
vagrant reload
\\
===== Exercicis =====
==== Exercici 1.1 ====
Investiga com utilitzar aquestes comandes bàsiques:
vagrant halt
vagrant suspend
vagrant resume
vagrant destroy
==== Exercici 1.2 ====
Cerca informació per configurar:
- El //hostname// de la màquina virtualitzada (anomena-la, per exemple, "zeus").
- Configurar un terminal de xarxa en mode //bridge//.
- Fer un script que automatitzi la instal·lació de Docker en la nova màquina creada.
- Connectar-te via SSH sense fer ''vagrant ssh'' (la info de connexió es mostra amb ''vagrant ssh-config'').
==== Exercici 1.3 ====
Cerca informació del //provider// VirtualBox i modifica el ''Vagrantfile'' adequadament per:
- Eliminar la interfície gràfica.
- Canviar el nom de la màquina dins del VirtualBox (que surti un nom sense números o codis).
- Configurar la VM perquè disposi de 2 CPUs.
- Augmentar la RAM a 2048 MB.
==== Exercici 1.4 ====
Configura una VM:
- Amb Apache2
- Amb una pàgina de benvinguda personalitzada senzilla, que mostri:
VM server
- Que mostri la web als ports 80 i 8080
==== Exercici 1.5: Apache, PHP i userdir ====
Fes un Vagrantfile que crei una màquina amb les següents característiques:
- Debian darrera versió.
- Que tingui com a //hostname// el teu nom i també com a nom de màquina en el VirtualBox.
- Amb un Apache i PHP preinstal·lat.
- Que redirigeixi el port 80 de la web d'Apache al port 9090 de la màquina //host//.
- Amb una pàgina per defecte en PHP amb el missatge "El servidor de " i que ens mostri el ''phpinfo();''
- Amb el mòdul //userdir// d'[[apache2 en debian ubuntu|Apache]] activat.
- Amb un usuari "manolo" creat.
- Que l'usuari "manolo" tingui una web pròpia accessible per //userdir// que mostri "Hola soc el Manolo" i el ''phpinfo();''
==== Exercici 1.6: Wordpress ====
Volem fer proves amb Wordpress i automatitzarem la configuració del servei en una VM amb Vagrant.
Requeriments:
- El Wordpress ha de ser la darrera versió en català.
- Ha d'estar preinstal·lat amb les taules creades i un usuari vagrant/vagrant.
- El nom del blog ha de ser "El meu blog vagrant".
- Ha de permetre que es carreguin imatges.
Es recomana seguir aquest guió per al script del Vagrantfile:
- Instal·lar dependències (apache, mariadb, etc.).
- Crear usuari, bd i permisos a mariadb.
- Descarregar arxiu ZIP de Wordpress en català i descomprimir.
- Configurar wp-config.php amb credencials per a BD (a partir de wp-config-sample.php).
- Es recomana utilitzar la comanda ''sed'' per modificar l'arxiu ''wp-config.php'' copiat de ''wp-config-sample.php''
- Ajustar permisos per a les càrregues d'arxius com imatges.
- Crear taules del blog i configurar usuari vagrant/vagrant. Es pot solventar de diverses formes:
* Amb una crida ''curl'' que simuli la introducció de les dades del formulari d'instal·lació que ens facilita Wordpress després de configurar la BD.
*Amb la utilitat via comandes wp-cli.org
Segurament el darrer pas de crear les taules del blog pot ser el menys habitual. El //hack// recomanat per fer el ''curl'' que crearà les taules es pot fer com segueix:
* Accedir a la web d'instal·lació.
* Introduir les dades
* Utilitzar l'inspector de HTML de les eines de desenvolupador del navegador, i modificar el per
* Enviar el formulari. Les dades que necessitem les tenim davant nostre a la URL.
* Elaborar la comanda curl amb -X POST i -d "...les-dades-que-apareixen-a-la-URL-dp-del-&..."
...et voilà!
\\
===== Aprofundint: scripts Ruby =====
Vagrant utilitza scripts en llenguatge Ruby. En realitat no utilitza funcions molt sofisticades d'aquest llenguatge, sinó que el que es fa és crear una configuració d'objectes que després Vagrant pot interpretar per a crear les diverses per a realitzar les configuracions de les VMs.
Pots crear un script ruby i executar-lo amb l'intèrpret de Ruby, per exemple:
#!/usr/bin/env ruby
puts "Com et dius?"
nom = gets.chomp
puts "Hola, #{nom}!"
Guarda l'arxiu i executa'l amb:
$ ruby nom.rb
\\
==== Loops en Ruby ====
Els //loops// en Ruby (ens caldran pels scripts Vagrant) es poden fer de moltes formes, de les quals les més típiques podrien ser aquestes:
# un bucle indexat
(1..5).each do |n|
puts "volta #{n}"
end
# iterar un array
nodes = [ "web", "db", "storage" ]
nodes.each_with_index do |name, i|
puts "VM num #{i} : #{name}"
end
# iterar un diccionari
nodes = {
"web" => { ip: "192.168.33.10", memory: 1024, cpus: 1 },
"db" => { ip: "192.168.33.11", memory: 2048, cpus: 2 },
"storage" => { ip: "192.168.33.12", memory: 512, cpus: 1 }
}
nodes.each do |name, opts|
puts "VM #{name}"
puts "\tcpus:\t" + opts[:cpus].to_s
puts "\tmemory:\t" + opts[:memory].to_s
puts "\tip:\t" + opts[:ip]
end
\\
==== Crear diverses VMs en un arxiu Vagrant ====
Per crear diverses VMs en un arxiu es fa mitjançant la crida ''config.vm.define'':
Vagrant.configure("2") do |config|
config.vm.box = "ubuntu/jammy64"
config.vm.define "web" do |web|
web.vm.hostname = "web"
web.vm.network "private_network", ip: "192.168.33.10"
end
config.vm.define "db" do |db|
db.vm.hostname = "db"
db.vm.network "private_network", ip: "192.168.33.11"
end
end
I si ho volem fer amb un loop:
Vagrant.configure("2") do |config|
config.vm.box = "ubuntu/jammy64"
nodes = {
"web" => "192.168.33.10",
"db" => "192.168.33.11"
}
nodes.each do |name, ip|
config.vm.define name do |node|
node.vm.hostname = name
node.vm.network "private_network", ip: ip
end
end
end
\\
===== Mes exercicis =====
==== Exercici 2.1: Cluster Proxmox ====
Crearem un cluster Proxmox (PVE) de 3 nodes amb Vagrant.
- Partirem d'una imatge de Proxmox 9 de l'usuari ''castor/proxmox''.
- Ha de tenir suficient RAM (4G) i CPU (2) per node (PVE requereix recursos)
- Les VMs han de tenir les adreces 192.168.40.21 , .22 i .23
- Documentació disponible:
* Instal·lació de Proxmox per a Debian 12 per a la configuració bàsica dels nodes.
* PVE Cluster Manager per la clusterització dels nodes.
- Configurar NFS per TCP si dona error de UDP (nfs_udp:false).
Recomanacions per al script de creació:
- Es poden aprovisionar diversos scripts, s'executaran seqüencialment.
- No utilitzar "apt install" ("apt" falla en alguns casos) sinó "apt-get install -y" (-y de "yes" evita que demani confirmació).
- Arranjar el fitxer /etc/hosts (el que ve a la imatge no funciona bé per clusteritzar). Ho podeu fer amb la comanda ''sed'' o similars:
* Eliminar la linia del /etc/hosts que diu "pve.example.com"
* Proxmox requereix que a l'arxiu ''/etc/hosts'' hi hagi la IP pública del node, no serveix el loopback 127.0.0.1 o similars. Elimineu la línia que diu "nodeX" de ''/etc/hosts'' i afegiu la IP del node en qüestió.
- Fer reboot afegint el paràmetres reboot:true al provision shell del script (si ho fem dins del script falla pq no espera el reinici).
- Al node1 caldrà crear el cluster amb la comanda "pvecm create mycluster"
- A la resta de nodes cal esperar (sleep) i anar-los afegint seqüencialment al cluster iniciat al node1. Esperar 10" x
- Per automatitzar ens convé buscar sempre versions de les instruccions que no siguin interactives. En el cas que no tinguem mes remei, com passa a l'afegir els nodes amb "pvecm add " es poden introduir els paràmetres amb la redirecció ''<<''. Ens demana introduir la contrasenya d'admin i respondre "yes", per tant serà algo com:pvecm add -force << EOF
yes
EOF