# Vagrant

**Vagrant** és una eina de codi obert creada per HashiCorp que permet **crear i gestionar entorns de desenvolupament virtualitzats** de manera automatitzada i reproduïble.

## 1. La idea principal

En lloc de configurar manualment una màquina virtual cada vegada, Vagrant et permet descriure l'entorn en un fitxer de text (`Vagrantfile`) i aixecar-lo amb una sola ordre.

## 2. Com funciona

Vagrant actua com una **capa d'abstracció** per sobre dels proveïdors de virtualització:

- **VirtualBox** (el més comú i gratuït)
- VMware
- Hyper-V
- Docker
- Proveïdors al núvol (AWS, Azure...)

El flux bàsic és 

```ini
Vagrantfile  →  vagrant up  →  Màquina virtual llesta i configurada
```

## 3. Conceptes clau

- **Vagrantfile** — fitxer de configuració en Ruby que defineix la màquina: sistema operatiu, memòria, xarxa, carpetes compartides, scripts de provisió...

- **Box** — imatge base del sistema operatiu (com una plantilla). Per exemple: `ubuntu/focal64`, `debian/bullseye64`. Es descarreguen del [catàleg públic de Vagrant Cloud](https://portal.cloud.hashicorp.com/vagrant/discover).

- **Provisioners** — scripts que s'executen automàticament en crear la màquina per instal·lar programari (Shell, Ansible, Puppet, Chef...).

## 4. Per a què serveix

- **Entorns de desenvolupament** idèntics per a tot l'equip ("funciona a la meva màquina" → resolt)
- **Pràctiques de laboratori** (xarxes, servidors, seguretat...)
- **Proves d'infraestructura** abans de desplegar a producció
- **Formació i ensenyament** — perfecte per crear laboratoris reproduïbles per als estudiants

Per al context educatiu de xarxes i sistemes, Vagrant és especialment útil perquè permet aixecar múltiples màquines virtuals interconnectades amb una sola ordre.

## 5. Instal·lació

```bash
wget -O- https://apt.releases.hashicorp.com/gpg | sudo gpg --dearmor -o /usr/share/keyrings/hashicorp-archive-keyring.gpg

echo "deb [signed-by=/usr/share/keyrings/hashicorp-archive-keyring.gpg] \
https://apt.releases.hashicorp.com $(lsb_release -cs) main" | \
sudo tee /etc/apt/sources.list.d/hashicorp.list

sudo apt update 

sudo apt install vagrant
```

## 6. Ordres essencials

```bash
vagrant init ubuntu/jammy64   # Crear un Vagrantfile bàsic
vagrant up                    # Crear i arrencar la VM
vagrant ssh                   # Connectar-se per SSH
vagrant halt                  # Apagar la VM
vagrant suspend               # Suspendre (guardar estat)
vagrant resume                # Reprendre
vagrant reload                # Reiniciar i reaplicar config
vagrant provision             # Tornar a executar els provisioners
vagrant destroy               # Eliminar la VM completament
vagrant status                # Estat de la VM
vagrant global-status         # Estat de totes les VMs del sistema
```

## 7. Vagrantfile

És un fitxer Ruby que descriu la màquina virtual.
Aquest és un exemple de configuració. Pots trobar més informació a [Documentació de Vagrantfile](https://developer.hashicorp.com/vagrant/docs/vagrantfile)

```nano
Vagrant.configure("2") do |config|

  # Defineix la imatge (box) base que utilitzarà
  config.vm.box = "ubuntu/jammy64"
  
  # Configura l'adreça IP privada
  config.vm.network "private_network", ip: "192.168.56.10"

  # Assigna recursos de maquinari
  config.vm.provider "virtualbox" do |vb|
    vb.memory = "2048"
    vb.cpus = 2
  end

  # Executa un script bash automàticament durant el primer desplegament
  config.vm.provision "shell", inline: <<-SHELL
    apt-get update
    apt-get install -y apache2
  SHELL
end
```

[Catàleg de màquines disponibles](https://portal.cloud.hashicorp.com/vagrant/discover)

#### Versions d'aquest document

+ HTML - [vagrant.html](https://proferamon.com/tic/vagrant.html)
+ PDF - [vagrant.pdf](https://proferamon.com/tic/docs/vagrant.pdf)
+ ODT - [vagrant.odt](https://proferamon.com/tic/odt/vagrant.odt)
+ MD - [vagrant.md](https://proferamon.com/tic/md/vagrant.md)

[Domini Públic (CC0)](https://creativecommons.org/publicdomain/zero/1.0/deed.ca)

