Este repositorio contiene todo lo necesario para crear una máquina virtual (VM: Virtual Machine) con Vagrant. Esta VM en particular está orientada al Desarrollo de Software con Python y JupyterLabs.
El repositorio está basado en NoSQL-box de Daniel Villanueva, con modificaciones y literatura adicional que he añadido. Podrás utilizar esta VM para conectar con servicios adicionales de Bases de Datos, cuadernos Jupyter de ejercicios. Más información al final de este README.
Vagrant es una utilidad de línea de comandos que permite gestionar el ciclo de vida de las máquinas virtuales. Necesitas instalar un Software de Vrtualización, el propio Vagrant y conectar ambos entre sí con un Proveedor. El Vagrantfile
de este repositorio está preparado para trabajar con los proveedores VirtualBox, Parallels o KVM.
- (1) Software de Virtualización, te paso algunos enlaces:
- Guía oficial sobre la instalación de VirtualBox.
- Si usas Parallels Desktop, aquí está su documentación para instalarlo.
- En el caso de KVM/libvirt hay cientos de referencias en internet. Aquí tienes mi apunte técnico sobre la instalación de KVM y Vagrant
- (2) Instalación de Vagrant: Sigue la guía oficial de instalación de Vagrant. Puedes instalarlo en Linux, MacOS, Windows...
- (3) Proveedor:
- Proveedor para VirtualBox: Vagrant trae soporte nativo para VirtualBox, por lo tanto no necesitas hacer nada especial.
- Proveedor para Parallels Desktop: En este sitio documentan cómo Vagrant puede usar las máquinas virtuales basadas en Parallels Desktop para Mac. Es sencillísimo:
- Instalación:
$ vagrant plugin install vagrant-parallels
- Actualización:
$ vagrant plugin update vagrant-parallels
- Uso:
$ vagrant up
o si tienes multi-proveedor$ vagrant up --provider=parallels
- Instalación:
- Proveedor para KVM/libvirt: Cada distribución de Linux tiene sus peculiaridades, así que lo mejor es que busques los manuales de la tuya. En mi apunte técnico sobre la instalación de KVM y Vagrant describo cómo lo instalé en un Ubuntu 20.10 (Groovy Gorilla).
Clona este repositorio en un ordenador donde tengas VirtualBox (Windows, Linux, MacOS,Solaris), Parallels Desktop (MacOS) o KVM (Libvirt en Linux).
git clone https://github.com/LuisPalacios/devbox.git
cd devbox
- Pega la(s) clave(s) pública SSH de tu ordenador cliente al fichero
bootstrap/public-keys.txt
:
cat ~/.ssh/id_rsa.pub >> bootstrap/public-keys.txt
- Revisa el fichero
bootstrap/bootstrap.yaml
y adáptalo a tus necesidades. Dentro del fichero tienes instrucciones para generar la contraseña de tu usuario.
usuario: luis
password: $6$x...
boxname: 'generic/ubuntu2010'
hostname: 'coder'
timezone: 'Europe/Madrid'
teclado: 'es'
- Arranca la máquina virtual:
luis@jupiter:~/devbox$ vagrant up
# Si estás en un MacOS con multiproveedor:
luis@jupiter:~/devbox$ vagrant up --provider=parallels
- Conecta con
vagrant ssh
. Esta opción siempre te va a funcionar, más adelante veremos más opciones.
luis @ idefix $ vagrant ssh
vagrant@coder:~$
vagrant@coder:~$ sudo su - luis
To run a command as administrator (user "root"), use "sudo <command>".
See "man sudo_root" for details.
_______________________________
< Bienvenido a mi servidor luis >
-------------------------------
\ ^__^
\ (oo)\_______
(__)\ )\/\
||----w |
|| ||
luis@coder:~$
Conectar con Jupyter Lab
A partir de ahora ya puedes conectar con los servicios de esta máquina virtual. Observa en el fichero Vagrantfile
los puertos mapeados, entre ellos el de JupyterLab. Dependiendo del tipo de proveedor utilizado podrás acceder en local (desde tu propio ordenador) o desde la LAN. Aquí tienes algunos ejemplos:
Configurar GIT
Una vez dentro de JupyterLab puedes arrancar el Terminal y configurar GIT:
$ git config --global user.email "you@example.com"
$ git config --global user.name "Tu Nombre"
El fichero Vagrantfile
está preparado para configurar dos estrategias distintas dependiendo de quién sea tu proveedor (KVM o VirtualBox / Parallels Desktop):
- VM en un HOST Linux con KVM/Libvirt - Uso networking público: Asigno una Dirección IP Fija a la VM
- VM en un HOST local con VirtualBox - Uso networking privado: PORT FORWARDING
- VM en un HOST local con Parallels Desktop - Uso networking privado: PORT FORWARDING
- Una vez que tienes la máquina virtual funcionando en tu Host Linux deberías poder ver algo parecido a esto desde
virt-manager
:
Configuro .ssh/config
para facilitar la conexión. Uso IP fija porque en KVM/Libvirt configuré networking público en el Vagrantfile
:
Host coder
HostName 192.168.1.13 <== Cámbialo por la IP de tu VM
User luis <== Cámbialo por tu usuario
Port 22
StrictHostKeyChecking no
UserKnownHostsFile=/dev/null
LogLevel=error
Conexión vía SSH
La contraseña es la de tu clave pública/privada
luis @ idefix ➜ ~ ssh coder
Enter passphrase for key '/Users/luis/.ssh/id_rsa':
luis@coder:~$
- Otro ejemplo, si lo monto en un Mac o un Windows, configuro el cliente SSH para conectar con la VirtualBox (localhost). Configuro el fichero ~/.ssh/config del cliente y a esta opción la llamo
coder-vb
.
Host coder-vb
HostName 127.0.0.1
User luis
Port 2222
Conecta vía SSH
Si la estableciste, recuerda que la contraseña es la de tu clave pública/privada
luis @ idefix ➜ ~ ssh coder-vb
Enter passphrase for key '/Users/luis/.ssh/id_rsa':
luis@coder:~$
- En este caso he configurado un MacOS con Parallels Desktop como Host. Configuro el cliente SSH para conectar con la VM en Parallels (localhost). Configuro el fichero ~/.ssh/config del cliente y a esta opción la llamo
coder-prl
.
Host coder-prl
HostName 127.0.0.1
User luis
Port 2222
Conecta vía SSH
Si la estableciste, recuerda que la contraseña es la de tu clave pública/privada
luis @ idefix ➜ ~ ssh coder-prl
Enter passphrase for key '/Users/luis/.ssh/id_rsa':
luis@coder:~$
Si quieres conectar con tu VM desde internet una posible solución es hacer SSH a un equipo intermedio (tu firewall) y que este pueda llegar a tu Host/VM a través de tu la LAN privada. Sería algo así:
┌─┬────────────┬─┐
│ │ coder VM │ │
│ │ │ │
┌──────────┐ ┌───────────┐ │ └────────────┘ │
│ │ INTERNET │ │ LAN │ │
│ Cliente ├──────────────►│ SSHServer ├───────► │ KVM HOST │
│ │ │ │ LOCAL │ │
└──────────┘ └───────────┘ └────────────────┘
miserver.midom.org 192.168.1.13
- Configuramos SSH para llegar al SSHServer y además preparamos "port forwarding", de modo que él pueda reenviar el puerto 8001 al HOST/VM
Host coder-via-internet
HostName miserver.midom.org
User luis
Port 12345
LocalForward 8001 192.168.1.13:8001
- Conectamos con el SSHServer, tendremos acceso al terminal (shell) y el reenvío del puerto activo.
luis @ idefix ➜ ~ ssh coder-via-internet
luis@coder:~$
Alternativa: usar
-N
que activa el reenvío del puerto SIBN terminal:ssh -N coder-via-internet
- Conectamos con Jupyter Lab: http://127.0.0.1:8001
Si queremos conectar con servidores de Git externos (github o gitlab) podemos preparar nuestra máquina virtual.
- Abrimos un terminal.
- Ejecutamos:
ssh-keygen -t rsa -b 2048
- Guardamos
~/.ssh/id_rsa.pub
en github o gitlab
Si vamos a trabajar contra esos servidores, también es recomendable configurar el cliente git
git config --global user.name "Coder Parchis"
git config --global user.email "coderparchis@gmail.com"
Para poder sacarle provecho a esta máquina virtual y al entorno JupyterLab
necesitarás contenido. Aquí tienes un proyecto interesante, Taller de Bases de Datos de Daniel Villanueva. Desde la shell de tu máquina virtual ejecuta el comando curl
que puedes ver en el siguiente ejemplo. Te permitirá instalar servidores Postgres, Riak, Cassandra, Mongodb, Neo4j, etc. usando Docker
$ ssh luis@coder
$ curl -s https://raw.githubusercontent.com/dvillaj/NoSQL-Services/master/scripts/setup.sh | bash