Ya sea que durante años has desarrollado a nivel local, o que acabas de comenzar, y si siempre has utilizado un servidor local como XAMPP o WAMP (o MAMP) para tus desarrollos, podría ser el momento de tener un entorno de desarrollo más flexible. Gracias a Vagrant y PuPHPet, puedes crear fácilmente entornos de desarrollo PHP que se aprovechan de la tecnología de máquina virtual. Estas herramientas de código abierto funcionan con el software de virtualización de escritorio como VirtualBox para ayudar a acabar con los errores aparentes que resultan de las discrepancias entre sistemas.

Todo desarrollador conoce esa sensación terrible del momento de enviar un informe de error y la respuesta es que el código funciona bien. O peor, recibir un informe de error, cuyo problema es imposible de reproducir. Por lo general, estas situaciones se producen debido a las diferencias entre los entornos de producción y desarrollo, o incluso las diferencias entre los entornos de dos desarrolladores. Frustración a parte, la verdadera cuestión es si el software se ejecutará en producción, porque esa es la meta final.

He visto muchos intentos de solución diferentes a este problema. Hace una década, además, todo el mundo en un equipo de desarrollo podría haber adquirido ordenadores idénticos a los utilizados en producción. Más recientemente, una práctica común fue la creación de un entorno de desarrollo organizado que todos los programadores compartían y requería que el desarrollo se hiciese a distancia. Esta fue una solución eficaz, pero tenía la gran desventaja de no permitir el desarrollo offline.

Gracias al aumento de la potencia de cálculo, en el desarrollo de hoy en día se puede usar máquinas virtuales para ayudar a resolver este problema. Si cada desarrollador en su equipo tiene una máquina virtual para desarrollar, puede crear una sola configuración de máquina virtual para todo el equipo - una tarea de una sola vez. Así como Composer se encarga de la instalación de bibliotecas por ti, puedes usar máquinas virtuales para estandarizar el sistem. Este tutorial te presenta herramientas de código abierto que funcionan en combinación para automatizar la creación de máquinas virtuales y el proceso de configuración.

Máquinas virtuales para el desarrollo local

Aquí está la definición de máquina virtual de la Wikipedia:

Una máquina virtual es un software que simula a una computadora y puede ejecutar programas como si fuese una computadora real. Este software en un principio fue definido como "un duplicado eficiente y aislado de una máquina física". La acepción del término actualmente incluye a máquinas virtuales que no tienen ninguna equivalencia directa con ningún hardware real.

Una característica esencial de las máquinas virtuales es que los procesos que ejecutan están limitados por los recursos y abstracciones proporcionados por ellas. Estos procesos no pueden escaparse de esta "computadora virtual".

El uso de una máquina virtual para emular un equipo físico es lo que te da el beneficio de la coherencia en tu desarrollo y despliegue. Si estás desplegando a una arquitectura de nube como Amazon Web Services, ya estás desplegando a una máquina virtual. Me centraré aquí en el funcionamiento de una máquina virtual en su computadora local.

Puedes elegir entre varias soluciones de software para crear máquinas virtuales locales. Las opciones comunes incluyen VMware (Windows® / Linux® / Mac), Parallels (Mac), y VirtualBox (Windows / Linux / Solaris / Mac). Voy a usar VirtualBox para este tutorial. No sólo se ejecuta VirtualBox en todos estos sistemas, sino también es probablemente la solución que ahora es más comúnmente utilizada por los desarrolladores de PHP. Desarrollado por Oracle como un proyecto de código abierto, VirtualBox es 100% libre para utilizarse.

Para continuar, ve a la página de descarga de VirtualBox y descarga el instalador correspondiente a tu sistema operativo. Ejecuta el programa de instalación, que te guiará a través de un proceso de instalación del software típico para tu sistema operativo. Después de la instalación, inicia el programa. La pantalla de bienvenida muestra que usted no tiene máquinas virtuales, como se muestra en la Figura 1.

Instalación inicial de VirtualBox
Figura 1. Instalación inicial de VirtualBox

 

Antes de empezar hay que tener en cuenta que VirtualBox almacena la máquina virtual en la carpeta VirtualBox VM. Esto significa que necesita suficiente espacio en la unidad del sistema para guardar el archivo de imagen. La ubicación se puede cambiar desde el menú Archivo/Preferencias/Carpeta predeterminada de máquinas.

Ahora voy a pasar por el proceso manual de creación de una máquina virtual. (Aprenderás más adelante en el tutorial cómo automatizar estos pasos, pero te animo a seguir de modo manual para que puedas entender lo que implica el proceso.) Después de hacer clic en el botón Nueva, el cuadro de diálogo Nombre y sistema operativo pide el nomre de mi máquina y elegir qué tipo de máquina uiero. Como se muestra en la Figura 2, elijo hacer una instalación de Ubuntu.

Creando máquina virtual Ubuntu
Figura 2. Creando máquina virtual Ubuntu

 

Ahora hay que pasar a través de una serie de cuadros de diálogo. VirtualBox pregunta cuánta RAM adjudicar a la máquina, qué tan grande hacer el disco virtual, y qué formato de archivo del disco debe usar. Se recomienda seleccionar los valores predeterminados para todos estos valores a menos que tenga una razón específica para hacerlo de otra manera. Después de hacer clic a través de todos los valores por defecto, se crea la máquina virtual y puedo ver toda la configuración, como se muestra en la Figura 3.

Configuración de la nueva máquina virtual
Figura 3. Configuración de la nueva máquina virtual

 

En este punto, todavía no tengo una máquina virtual trabajando. VirtualBox ha creado una máquina virtual para mí que está preparada y lista para instalar Ubuntu en ella. Sin embargo, esta máquina no es diferente de una máquina física que está montada a partir de componentes de hardware. Puedes encenderla, pero a menos que instales el sistema operativo en el disco duro, no pasará nada.

Cuando hago clic en el botón Iniciar para poner en marcha esta nueva máquina virtual, el siguiente cuadro de diálogo me pide que especifique el disco de instalación que quiero usar, como se muestra en la Figura 4.

Preguntando por medio de instalación
Figura 4. Preguntando por medio de instalación

 

Si estuviera listo para terminar de hacer una máquina virtual personalizada para Ubuntu en este momento, señalariá a VirtualBox una imagen de disco con un instalador de Ubuntu, y todo el proceso de instalación de Linux comenzaría. Pero en este momento no es el objetivo. El objetivo es hacer las máquinas virtuales, consistentes y repetibles - por lo que se requiere una mayor automatización que lo que una instalación manual puede proporcionar.

Presentando Vagrant

Vagrant es una capa de automatización que se creó para manejar el aprovisionamiento automatizado de máquinas virtuales para VirtualBox y otro software de máquinas virtuales. Vagrant automatiza completamente los pasos que tomé en la sección "Máquinas virtuales para desarrollo local" para configurar VirtualBox para crear una nueva caja.

A través del uso de un archivo de configuración personalizado, Vagrant establece varios ajustes de la máquina virtual y se instala el sistema operativo base de tu elección. Puedes especificar con detalle, la máquina virtual que deseas. Vagrant guarda toda esa información en un archivo llamado Vagrantfile, que luego se puede comitear en tus proyectos de software. Análogo al archivo composer.json para la construcción de su proyecto, el Vagrantfile especifica exactamente el sistema que deseas instalar. Sólo tienes que usar el comando vagrant up y entonces Vagrant creará e iniciará el servidor.

El proyecto Vagrant también tiene acceso a un directorio de muchas máquinas preconfiguradas para actuar como configuraciones base sobre las que se puede construir, por lo que es muy fácil crear una nueva instalación por ti mismo.

Ahora, mediante el uso de Vagrant, puedo crear automáticamente la máquina virtual Ubuntu que quería antes. Descarga Vagrant desde su página de descargas y ejecutar el instalador apropiado para tu sistema operativo. (Una vez más, aprenderás más adelante en el tutorial sobre una mayor automatización que sustituirá a los pasos que voy a realizar aquí, pero yo recomiendo que sigas manualmente para entender el proceso.)

Creando y configurando una máquina virtual Ubuntu

Vagrant es una herramienta de línea de comandos, por lo que no verá una GUI de Vagrant después de la instalación. En la documentación de Vagrant, encontrarás un enlace al catálogo de cajas HashiCorp Atlas. Similar a Packagist para Composer, este catálogo es la ubicación predeterminada donde Vagrant busca imágenes de máquinas virtuales para actuar como tu imagen base. El catálogo ofrece un índice de búsqueda para buscar las cajas, como puedes ver en la Figura 5.

Catálogo de cajas de HashiCorp Atlas
Figura 5. Catálogo de cajas de HashiCorp Atlas

 

Justo en la parte superior de la página hay una gran opción para mí: la versión oficial de la última versión de Ubuntu. Anoto el nombre de la caja, como se muestra en el catálogo (ubuntu/trusty64) y ahora puedes ejecutar los siguientes comandos:

vagrant init ubuntu/trusty64
vagrant up

Al ejecutar estos comandos, verá muchas líneas en la pantalla (similar a lo que se muestra en la Figura 6).

Salida de los comandos vagrant init y vagrant up
Figura 6. Salida de los comandos vagrant init y vagrant up

 

Y eso es todo. He terminado. No sólo creé una máquina VirtualBox, sino también la he configurado con Ubuntu y la he lanzado. Mi máquina virtual se ejecuta en segundo plano, lista para que me conecte a ella escribiendo vagrant ssh.

Otros comandos vagrant

Querrás usar otros comandos comunes, tales como:

vagrant halt

Apaga la máquina virtual de modo forzado.

vagrant destroy

Apaga la máquina virtual y la elimina por completo.

vagrant suspend

Suspende la máquina y guarda el estado actual.

vagrant resume

Reanuda una máquina suspendida previamente.

vagrant status

Te da el estado actual de la máquina virtual.

Vagrant ofrece muchas otras características que puedes leer en la documentación, tales como carpetas sincronizadas (de modo que no tienes que entrar por ssh para editar código), características especiales de redes, cajas compartidas, y mucho más. Incluso puedes configurar un Vagrantfile para crear y gestionar múltiples máquinas simultáneamente. Las complejidades del archivo de configuración pueden ser un poco difíciles - pero a continuación te voy a mostrar porqué esto no es un problema.

Presentando PuPHPet

Hasta ahora, he instalado VirtualBox y Vagrant y he usado Vagrant para automatizar la creación de máquinas virtuales. Pero todavía tengo que conseguir el software instalado en mi máquina virtual. Una vez más, hacer este paso manualmente probablemente conducirá a la inconsistencia. Afortunadamente, hay disponibles varias soluciones de automatización de infraestructuras para este propósito. Entre ellos se encuentra el proyecto de código abierto Puppet de PuppetLabs. Puppet utiliza un sistema de configuración de archivo un tanto complicado, ampliamente documentado mediante el cual se especifica que software se va a instalar, comandos de ejecución, configuración, y mucho más.

A mediados de 2013, un desarrollador de PHP llamado Juan Treminio acababa de terminar el esfuerzo de aprender exactamente cómo todas estas piezas encajan: cómo configurar Vagrant, y cómo trabajar con los complicado archivos de Puppet para construir un sistema completamente automatizado. Decidió que otros desarrolladores de PHP no deberían tener que hacer frente a ese esfuerzo, y así nació PuPHPet. PuPHPet es una interfaz gráfica de usuario en línea, construida por Treminio, con el que puedes seleccionar dónde se desplegará tu máquina, qué sistema operativo deseas, y que software deseas instalar/configurar en él. PuPHPet genera tanto un Vagrantfile como una configuración Puppet para tí. Entonces todo lo que tienes que hacer es ejecutar vagrant up, y simplemente todo funcionará.

Asumiendo que ya has instalado VirtualBox y Vagrant, dirígite a la página de inicio PuPHPet. Después de hacer clic en el enlace Get started right away. It's free!, comenzarás a pasar a través de una serie de páginas de configuración fáciles de usar. La Figura 7 muestra la página.

Página de inicio de PuPHPet
Figura 7. Página de inicio de PuPHPet

 

En cada paso del proceso, a medida que avanzas a través del menú de la izquierda, se configura algún aspecto del servidor:

Deploy Target: Aquí, eliges el proveedor de máquina virtual (VirtualBox es la selección por defecto) y el sistema operativo y la distribución que deseas utilizar, como Ubuntu Trusty.

System: Puedes especificar los paquetes para instalar, como vim , configurar usuarios/grupos/cronjobs y mucho más.

Web Servers: Puedes optar por instalar Nginx o Apache, y se puede configurar el servidor web con antelación.

Languages: Para PHP (por defecto; otras opciones incluyen Ruby, Python, y Node.js), puedes escoger no sólo la versión, sino también cambiar la configuración de PHP, según sea necesario.

Databases: MySQL es la instalación por defecto aquí. Proporciona información de configuración básica, como la contraseña de root y cualquier base de datos que te gustaría que fuera creada por tí.

Los demás elementos del menú - como Mail Tools, Work Queues y Search Servers - ofrecen opciones similares para otras herramientas que podrías necesitar para aplicaciones web avanzadas.

Después de realizar todas las opciones de configuración (la configuración predeterminada es viable para un sistema de desarrollo de PHP estándar), estarás en el elemento de menú Create Archive, que se muestra en la Figura 8.

Página de descarga de archivo personalizado PuPHPet
Figura 8. Página de descarga de archivo personalizado PuPHPet

 

Haz clic en Download your custom server config! para crear el Vagrantfile y obtener un archivo ZIP con toda su configuración.

Has creado un sistema reutilizable que puedes compartir con otros desarrolladores como un recurso repetible. El archivo ZIP descargado contiene no sólo un Vagrantfile sino también una carpeta que contiene el resto de la configuración (para Puppet). Sólo tienes que ejecutar vagrant up para iniciar el proceso de construcción del sistema de acuerdo a sus especificaciones exactas. Asegúrate de tener algo que hacer; completar todas las instalaciones necesarias puede tardar un poco. Puedes gestionar esta configuración en tu sistema de control de versiones o compartirlo como quieras con tus compañeros de trabajo. También puedes, si lo deseas, ir a los archivos de configuración en el directorio puphpet y configurar o ajustar tu sistema aún más. Y todos los comando Vagrant comandos que vimos en la sección "Presentando Vagrant" también funcionarán en esta caja Vagrant.

Fuente: PHP renewed: Creating environments with Vagrant and PuPHPet