Como mencioné anteriormente, la idea de colaborar con un proyecto de Código Abierto lo comencé a realizar, de eso espero poder escribir mas adelante sobre el proceso, ya que he podido introducir cambios en los dos proyectos que quería.
Hubo algo que necesité resolver para trabajar en el proyecto Asterisk ya tenía la necesidad de ir probando las distintas ramas donde se está desarrollando. La idea es tener una máquina de test y desarrollo para cada release. Inicialmente lo hice inicialmente manual usando virtualbox, al correr del tiempo se me hizo tedioso. Así que decidí hacer una box para vagrant y luego aplicar algunas recetas en chef que me dejen el entorno tal como quiero.
El problema a solucionar inicial es tener una box. Busqué en www.vagrantbox.es pero ninguna me acomodó, así que decidí hacerme una y documentar el proceso.
Creando maquina virtual
El primer paso es crear mediante Virtualbox una maquina virtual, en mi caso le puse el nombre debian8. Un ejemplo para hacerlo desde una ISO lo encuentras acá, en mi caso estoy utilizando la iso de Debian net install de la versión Jessie.
En el proceso de creación configuras la cantidad de RAM, disco y configuraciones iniciales. De las cosas a considerar en caso de una box en Linux es:
- El password de root se debe setear como vagrant
- Debes crear un usuario con nombre vagrant y password vagrant
Si se considera redistribuir la box posteriormente, debes considerar la siguiente definición:
- Hostname: vagrant-[nombre-os], ejemplo vagrant-debian-jessie en mi caso
Domain: vagrantup.com
Actualización y Guest Additions
Creada la máquina e instalado el sistema es necesario actualizar e instalar los build-essential module-assistant que se necesitarán, también así los headers del kernel los vamos utilizar en la compilación de los Guest Addtions.
apt-get update
apt-get upgrade
apt-get install build-essential module-assistant linux-headers-$(uname -r|sed 's,[^-]*-[^-]*-,,')
m-a prepare
A continuación de eso tenemos que instalar los Guest Additions de VirtualBox. Para eso en menú de la ventana de la maquina virtual clic en Devices y Install Guest Additions. En maquina virtual ejecutamos:
mount /media/cdrom bash /media/cdrom/VBoxLinuxAdditions.run
Si tuvieras problemas con la instalación de este punto, te recomiendo a actualizar el VirtualBox a 4.3 en caso de tener una versión más antigua.
Configuración
Ahora es tiempo de configurar el sistema. Acá instalamos el software necesario que va ir por defecto en la box. También otro punto es instalar algún sistema de provisionamiento como Chef o Puppets, esto nos permitirá crear o utilizar los scripts que automatizan el proceso de configuración e instalación de sistemas tipo base de datos, editores, configuraciones adicional u otras herramientas que se necesiten.
En mi caso voy a trabajar con Chef, así que la Box le instalaré ese software. También adicionaré el servidor SSH, sudo y zerofree que son necesarios para que Vagrant funcione.
apt-get install openssh-server sudo zerofree chef
Sudo
El usuario vagrant creado inicialmente debe tener acceso a sudo sin password. Para esto lo configuraremos ejecutando visudo
Agregamos la siguiente línea debajo del usuario root
vagrant ALL=(ALL:ALL) NOPASSWD: ALL
Para probar el cambio, debemos hacer
su vagrant sudo -s
Si lo anterior pasamos a ser root sin pedirnos password estamos bien.
Vagrant para hacer las distintas cosas sobre la maquina virtual necesita autentificación mediante ssh-key, para eso existe un par de key que se pueden utilizar. Se debe poner el contenido de la pública en el archivo .ssh/authorized_keys del usuario vagrant.
Ingresamos como usuario vagrant a la maquina virtual
vagrant:~$ mkdir .ssh vagrant:~$ chmod 700 .ssh
vagrant:~$ nano .ssh/authorized_keys
ZeroFree
Lo que necesitamos ahora es llenar con ceros(0) de los sectores que no se han utilizado del disco , para eso se utiliza zerofree. Necesitamos pasar a modo mono usuario en el sistema.
init 1
Ingresamos el password de root.
Montamos la partición y procedemos con el uso de zerofree (Este proceso podría demorar un poco)
mount -o remount,ro /dev/sda1 zerofree /dev/sda1
Con esto ya se tiene lista la maquina virtual para crear la box, para eso se debe apagar la maquina virtual.
Creando Box
Apagada la maquina virtual vamos a utilizar Vagrant para crear la box. Creamos un directorio donde se almacenará el archivo .box
mkdir -p vagrant/boxes cd vagrant/boxes
Ahora procedemos a crear la Box. Acá usamos el mismo nombre de la maquina que creamos inicialmente en el VirtualBox, en mi caso debian8
vagrant package --base debian8
Con lo anterior nos debería mostrar lo siguiente:
==> debian8: Pruning invalid NFS exports. Administrator privileges will be required... ==> debian8: Exporting VM... ==> debian8: Compressing package to: /home/rodrigo/vagrant/boxes/package.box
Esto nos indica que se creó un un package.box en la ruta que estabamos, este box es que podríamos compartir y usar.
Probando la box
Como tenemos el archivo package.box , en nuestra maquina de trabajo vamos a agregarlo a la lista de boxes de Vagrant.
vagrant box add MyBoxDebian8 package.box
Deberíamos tener por resultado
==> box: Adding box 'MyBoxDebian8' (v0) for provider: box: Downloading: file:///home/rodrigo/vagrant/boxes/package.box ==> box: Successfully added box 'MyBoxDebian8' (v0) for 'virtualbox'!
Para confirmar que fue agregada podemos verla listado las boxes con la siguiente instrucción
vagrant box list
nos debería mostrar …
MyBoxDebian8 (virtualbox, 0)
Para crear una maquina virtual a partir de nuestra box vamos a crear un nuevo directorio e iniciaremos el archivo Vagrantfile
mkdir -p env/test cd env/test vagrant init MyBoxDebian8
En el directorio se genera el Vagrantfile. Este archivo es el maestro que permite agregar configuraciones especiales y las distintas recetas. Puedes revisarlo y modificarlo, se puede definir la dirección IP, nombre, paquetes a instalar, etc..
Iniciando la maquina virtual
Ya hemos llegado al proceso final, debemos subir nuestra nueva maquina virtual a partir de nuestra box creada.
vagrant up
El resultado debería ser algo como:
Bringing machine 'default' up with 'virtualbox' provider... ==> default: Importing base box 'MyBoxDebian8'... ==> default: Matching MAC address for NAT networking... ==> default: Setting the name of the VM: boxes_default_1431790340244_71433 ==> default: Clearing any previously set network interfaces... ==> default: Preparing network interfaces based on configuration... default: Adapter 1: nat ==> default: Forwarding ports... default: 22 => 2222 (adapter 1) ==> 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: Warning: Connection timeout. Retrying... default: Warning: Remote connection disconnect. Retrying... 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 its 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/rodrigo/vagrant/boxes
Con esto se ha creado la maquina virtual. Un punto a considerar que mediante nfs se genera mediante un directorio compatido entre el equipo y la maquina virtual, este se monta en /vagrant de la virtual.
Para entrar a la maquina:
vagrant ssh
Ahora si necesitas profundizar sobre Vagrant puedes leer la documentación sobre la configuración, los sistemas de provisionamiento (Puppets, Chef) y definición de multiples ambientes
Además si quieres, puedes descargar la box que creé si la deseas utilizar.
Muy buena guía, me podrías decir que sistema operativo utilizas (debian, ubuntu) y su respectiva versión.
Actualmente Debian 9