Entornos de desarrollo con vagrant y puphpet – Parte 1

Ésta es una guía un poco extensa por lo cual la dividiré en 2 partes. La primera contempla la generación de la configuración necesaria para crear una máquina virtual con virtualbox, vagrant y puphpet mientras que la segunda abarcará la creación y operación de ésta.

Hay una gran variedad de opciones cuando se quiere contar con entornos locales de desarrollo para aplicaciones web. Por un lado, es posible instalar los servicios directamente en el sistema como cuando se trabaja con XAMP o cuando se ejecuta tasksel en Linux. Otra opción que es un poco menos invasiva, consta de disponer de un stack de desarrollo como Bitnami cuya instalación (y desinstalación) es más directa debiendo lidiar menos con los permisos de las carpetas y archivos. Sin embargo en este caso me referiré a generar mediante una máquina virtual, entornos de desarrollo con vagrant y puphpet.

¿Qué es una máquina virtual?

A pesar de ser un mundo en sí mismas con múltiples tipos y técnicas de implementación, se puede decir que, en términos simples, una máquina virtual es una emulación mediante software de un sistema computacional específico, el cual cuenta con sus propios recursos (unidades de disco, memoria RAM, interfaces de red, etc). Naturalmente lo anterior lo obtiene de la máquina física (denominada host)  y se comparte, razón por la cual se debe considerar las especificaciones de nuestro equipo, ya que si éstas son demasiado limitadas no se podrá realizar una virtualización adecuada.

Una de sus principales ventajas es el poder ejecutar entornos completamente separados del sistema base por lo que se pueden usar para probar otros sistemas operativos, o en este caso instalar todo lo necesario para desarrollar aplicaciones sin temor a estropear nuestro sistema principal. En caso de dañar algo a un punto en que no es posible repararlo, se puede destruir la máquina virtual y crearla nuevamente.

Otra ventaja es que se puede generar un archivo de configuración que puede ser compartido entre todos los integrantes de un proyecto para así asegurarse que todos poseen las mismas herramientas.

Para trabajar con estas máquinas hay varias opciones dependiendo del sistema operativo tales como: virtualbox, parallels, vmware, etc.

Suena bien pero por qué querría instalar algo así en vez de un stack o servicio local

El instalar una máquina virtual puede parecer intimidante y más complicado de lo necesario, por lo que la pregunta que cae de cajón es ¿por qué querría instalar algo así en vez de un stack o servicio local?

Una respuesta inicial sería, es cuestión de gustos. Hay gente que prefiere que las cosas funcionen y por ende es más cómodo el instalar servicios locales o stacks específicos y trabajar con estos y se llegaría eventualmente a resultados similares. Sin embargo la respuesta correcta sería por la enorme flexibilidad que ofrecen.

El desarrollo de aplicaciones de hoy en día implica más que contar con un motor de base de datos y un servidor web. La cantidad de herramientas, lenguajes y frameworks que aparecen a diario crece constantemente, a menudo para facilitar nuestro trabajo.  Entonces podemos instalar o eliminar cosas a gusto, ¿quieren reemplazar MySQL por Maria DB?, ¿Cambiar Apache2 por nginx?, ¿Instalar las bibliotecas necesarias parar desarrollar con django y rails simultaneamente? ¿Instalar node?, ¿Precompiladores? ¿Profilers?. Todo lo anterior es posible junto con generar puntos de restauración (snapshots) en caso de que algo salga mal.

Instalando lo necesario

Lo primero que se debe instalar es un software que permita la creación de máquinas virtuales. Para esto existen varias alternativas en el mercado, cada una con su costo, sus pro y contra. El analizarlas escapa del objetivo de este artículo pero para usar algo transversal descargaremos Virtualbox. La instalación es bastante directa y se encuentra disponible para Linux, Mac OSX y Windows. También se debería instalar el Extension pack.

Luego se necesita instalar Vagrant el cual permite generar entornos de desarrollo sobre software de virtualización como Virtualbox o VMware usando gestores de configuración como Chef o Puppet. Su instalación también es directa y disponible para Linux, Mac OSX y Windows.

Aunque no es obligatorio, sí es útil para Mac OSX go2shell una vez instalado aparece en el finder como un botón que abre una terminal en la carpeta que se está visualizando en ese momento. Esto ahorra tener que buscar la ruta y hacer muchos cds.

Vagrant y Puphpet, generando la configuración necesaria

Teniendo todo lo anterior podemos generar un archivo (varios en realidad) de configuración para con ellos levantar una máquina la cual puede ser replicada muchas veces ayudando no sólo a ahorrar tiempo en la generación de ésta sino también estandarizar los ambientes para evitar inconsistencias cuando se trabaja con varias personas en un equipo.

Esto lo llevamos a cabo con PuPHPet que es una aplicación web gratuita y diseñada para tomar una serie de opciones de configuración y convertirla en un script que puede ser procesado por Vagrant.

vagrant y puphpet 1

La cantidad de opciones es un poco extensa pero intentaré hacer hincapié en las más importantes, pueden jugar con los valores a ver qué les acomoda más (en esto pongo énfasis).

Deploy Target

Comencemos con deploy target que es donde se define en qué parte se instalará nuestra máquina pudiendo ser localmente (locally) o en algún servicio en la nube. Las opciones que debemos configurar son las siguientes:

  • Provider: VirtualBox (en este caso en particular)
  • Distro: la que más les acomode, en mi caso prefiero debian 7 pero es cosa de gustos
  • Memory: 1024 (1GB) es como ideal para comenzar
  • CPUs: 1
  • Forwarded ports: permite establecer una relación 1:1 entre los puertos de la máquina virtual y cómo acceder a ellos desde nuestro host. Ya hay uno definido que corresponde al 22 (SSH) y deberíamos dejarlo tal como está. A modo de ejemplo, digamos que queremos configurar el servidor web que usualmente escucha en el puerto 80; en VM port colocamos el puerto al que queremos acceder, en este caso 80 y en host port a través del cual vamos a acceder, por ejemplo 8080, así cuando queramos ingresar al servidor mediante nuestro navegador escribimos http://localhost:8080 . Podemos agregar tantas relaciones como queramos lo que es muy útil cuando se usan aplicaciones con servidores de prueba integrados, Lo que hace esta parte es agregar las reglas necesarias al cortafuegos para que funcione.
  • Shared Folders: define directorios compartidos entre la máquina virtual y el host y los configura para un acceso transparente para el usuario donde Folder source corresponde a la carpeta en nuestro host y Folder Target a la máquina virtual. Probablemente el más usado será /var/www que corresponde a la raíz del servidor web por defecto. Debe colocarse la ruta completa y su formato variará dependiendo de nuestro sistema operativo, así si tenemos una carpeta “web” en nuestra carpeta de usuario que queremos configurar como /var/www , la opción sería en folder source /home/{usuario}/web o /Users/{usuario}/web ya sea Linux o Mac OSX respectivamente y en Folder Target /var/www . Al igual que en el caso anterior podemos agregar todos los directorios que queramos. La ventaja obvia es que podemos ingresar desde nuestro navegador de archivos y copiar todo lo que queramos directamente sin tener que ejecutar comandos o configurar cosas extras para cambiar permisos de lectura/escritura.

System

En la sección siguiente System, podemos dejar todo tal como está y no afectaría mucho, sin embargo la desglosaré para mayor claridad:

  • System Packages: permite agregar paquetes de software del sistema que necesitemos y aquí ya depende de las necesidades de cada uno.
  • Users & groups: gestiona usuarios extras que se deseen agregar a la máquina y sus grupos.
  • Locale: gestiona los locales (en caso que las aplicaciones a desarrollar lo soporten permite configurar entre otras cosas la forma de mostrar las monedas, números, formatos de dirección, fechas, etc). Puede cambiarse a es_CL.UTF-8. Además configura la zona horaria.
  • Firewall: establece reglas para el cortafuegos de la máquina virtual. Usualmente no se utiliza a menos que se tengan requerimientos específicos.
  • Cron Jobs: son tareas que se realizan periódicamente. Se puede establecer la periodicidad, comando a ejecutar, usuario, variables de entorno y darle un nombre.
  • Custom Files: no se utiliza directamente sino que se puede usar el directorio puphpet/files/dot que aparece luego de descomprimir el resultado de este proceso y copiar dentro archivos como .bash_aliases, .vimrc, .gitconfig, etc. Esto queda a criterio de cada uno si les es útil o no.

Web Servers

Luego viene la sección Web servers. Se pueden elegir 2 servidores diferentes, Nginx y Apache pero sólo se puede instalar uno a la vez mediante éste método lo que no significa que no se pueda hacer después dentro de la máquina misma. La configuración en este punto puede variar mucho dependiendo de sus necesidades tanto de módulos, virtualhosts, etc.

En lo que respecta a Apache, primero se configuran los módulos a agregar y que son elegibles desde una lista y siendo estrictos los que aparecen son suficientes para comenzar aunque pueden agregarse headers, expires o userdir.

Luego se configuran los virtualhosts que se utilizarán y donde se encuentra uno como ejemplo ya rellenado pudiendo dejarse tal como está, sino, se puede cambiar server name, server aliases y document root por algo que sea de nuestro agrado. En esta sección también se puede configurar el uso de SSL donde se puede configurar las rutas de los archivos de certificados dentro de la máquina virtual. La creación de estos escapa del alcance de este post por lo que se asume que saben lo que están haciendo aunque puedo comentarlo posteriormente. NO usen let’s encrypt a menos que posean una ip pública o no resultará.

Lo siguiente corresponden a directory block el cual configura las opciones del bloque con parámetros tales como Indexes que muestra el listado de los archivos de un directorio si no hay presente un archivo index.html o index.php o allowoverride all que permite sobrescribir algunas opciones mediante archivos .htaccess y son usados por muchas aplicaciones web modernas.  Éstas funcionan de manera adecuada con lo que se muestra de manera predeterminada. Cabe destacar que las opciones path y document root deben ser las mismas.

Languages

En esta sección se decide qué soporte para lenguajes de programación se instala. Las opciones disponibles son PHP, Python, Ruby, Node, y HHVM que es excluyente con PHP. Afortunadamente acá no se necesita mucha configuración salvo en la parte de PHP

  • PHP: se puede elegir la versión entre 5.4, 5.5, 5.6 y 7.0 . Esto ya depende del desarrollo. 5.4 es lo más seguro por retro compatibilidad pero como digo es muy variable. También es posible instalar composer como una aplicación del sistema lo que es recomendado y simplificará su manejo y actualización.
    Es preferible instalar los módulos de PHP requeridos desde esta parte por si acaso ya que realiza la configuración completa y quedan disponibles inmediatamente (en caso de edición de php.ini). Algunos útiles son:  curl, imagick, mbstring, memcached, mcrypt, sqlite. En caso de necesitarse, puede instalarse xdebug o xhprof  . Si utilizan wordpress está disponible wp-cli y drush en el caso de Drupal.
  • Ruby: permite elegir la versión y gems a instalar.
  • Python: viene incluida la versión 2.7 en Ubuntu y Debian y 2.6 en Centos. Se pueden elegir paquetes a instalar y es factible agregar otras versiones al final de la sección mediante pyenv
  • Node: se puede elegir entre las versiones 0.10, 0.12, 4 y 5, además está la opción para agregar paquetes.
  • HHVM: es una alternativa para la ejecución de scripts PHP que tiene un mejor rendimiento pero puede presentar ciertas incompatibilidades. Si lo utilizan está disponible.

Databases

Se pueden elegir varios motores de bases de datos: MariaDB, MySQL, PostreSQL, SQlite, Redis y MongoDB

  • MariaDB y Mysql son incompatibles entre sí al momento de generar el script de instalación. Pero las opciones son similares entre sí. Las versiones disponibles son 5.5, 10.0 , 10.1 y 5.4, 5.5, 5.6, respectivamente.
    La configuración es la misma en ambos casos. Se elige una contraseña para el usuario root (por defecto 123), se ofrece la posibilidad de instalar adminer para gestionar las bases (recomendado), crear usuarios en la sección Create User donde se configura el nombre de usuario y contraseña, luego es posible crear una base de datos con su nombre DB name y finalmente otorgar grants que corresponden a los permisos que un usuario tiene sobre una base de datos (privileges).
  • El caso de PostgreSQL es análogo al punto anterior pero las versiones cambian como es de esperarse. Se puede elegir entre: 8.4, 9.1, 9.2, 9.3 y 9.4
  • Mongodb: se escoge la ip y el puerto donde escuchará las conexiones (usualmente es 127.0.0.1 o localhost). y Permite agregar una nueva base de datos con su nombre, un nombre de usuario y una contraseña
  • SQLite: funciona sin mayores configuraciones extras
  • Redis: permite elegir el puerto a usar.

Hasta este punto se puede contar con una máquina básica LAMP o MEAN. Las otras secciones obedecen a requerimientos un poco más específicos.

Una vez terminada la elección de todo lo que deseamos tener, se va a la sección Create archive y luego se hace clic sobre el botón grande verde que aparece. Con esto se obtiene un archivo que dentro tiene una carpeta la cual se deberá descomprimir en cualquier parte.

vagrant y puphpet 2

Con esto se concluye la sección de configuración de un entorno que usará vagrant y puphpet. Luego veremos cómo iniciar la máquina y algunas otras operaciones útiles.