Oh My God!
Aunqué hablé a grandes rasgos del entorno del que parto a la hora de automatizar mía día a día, vamos a detallarlo un poco más.
Cuando llegué a la empresa donde trabajo actualmente, me encontré con el siguiente entorno de desarrollo:
2 PC haciendo de servidores:
- (Serv1) Windows 2003 Server: Exchange, carpetas compartidas, Oracle, Copias de seguridad.
- (Serv2) Windows XP Profesional: WAMP (Apache, MySQL, PHP), carpetas web.
Todas las máquinas cliente corriendo Windows XP Profesional SP2. Los proyectos web se alojaban en Serv2, en carpetas compartidas, y todo el mundo trabajaba directamente sobre ellos.
Esta configuración presentaba varios problemas:
- Serv2, al estar basado en un Windows XP no es muy estable, y cada vez que la máquina se reinicia por una actualización automática del sistema operativo hay que acceder físicamente a la máquina e iniciar sesión para que arranque el WAMP.
- Los servidores de producción usados generalmente están basados en sistemas Linux, por lo que era más fácil encontrarse con sorpresas desagradables a la hora de realizar los despliegues por las diferencias entre ambos sistemas operativos.
- Al trabajar sobre los mismos archivos, no pueden haber dos personas tocando lo mismo simultáneamente, además del riesgo de machacar el trabajo realizado por otro en ese mismo día sin darnos cuenta.
- Al carecer de control de versiones, cada vez que se realizaba un cambio se corría el riesgo de estropear alguna parte del sistema (...y como tampoco realizaban TDD -Test Driven Development-) y luego no poder volver a retroceder sin problemas al no recordar que partes de la aplicación se habían tocado. Por otro lado esto siempre produce la proliferación de archivos tipo "miarchivo.php.bak", "miarchivo.php.old", "miarchivo.old2.php", etc... Habitual conglomerado de copias que no se sabe muy bien que pintan ahí ni cual es la razón de su existencia.
- Todo el entorno de red, a nivel de DNS y demás, estaba pensado para máquinas cliente con Windows, pero yo uso Mac OS X, y posteriormente entró otro programador que usa Ubuntu, y ninguno de los dos teníamos ganas de pelearnos con el Active Directory de Microsoft, el Exchange y demás.
- La información sobre los proyectos y el código se encontraban diseminadas en un amplio conjunto de ubicaciones distintas, siendo bastante complejo en ocasiones encontrar cualquier dato necesario.
- Los desarrollos estaban basados en código propio, sin el uso de ningun framework estándar. Aunque el código cumplía su función (más o menos) era dificil de ampliar.
- Se perdía mucho tiempo en tareas rutinarias, restando tiempo a profesionales veteranos para realmente concentrarse en las cosas importantes.
Primeras medidas a tomar
En vista de la situación me formé un esquema a rasgos generales (comentado a grandes rasgos en el anterior artículo) y decidí que los primeros pasos serían:
- Instalar un servidor de desarrollo basado en Linux.
- Implantar el control de versiones en el flujo de trabajo habitual.
- Concentrar la información de los proyectos en un único punto para facilitar su disponibilidad.
- Comenzar a usar Rails para los proyectos con libertad de elección en cuanto a tecnología, y CakePHP (clon del rails) para aquellos donde estábamos limitados a usar PHP.
- Contratar un servidor dedicado para el despliegue de las aplicaciones y tener mayor control sobre la tecnología usada. El alojamiento compartido está bien para el típico proyecto web, pero para temas más avanzados mejor tener toda la capacidad de decisión.
En este artículo nos centraremos en el primer punto, aunque algunas de las decisiones a la hora de instalar el servidor vienen motivadas por las reflexiones y descubrimientos que veremos en próximos artículos donde abordaremos los otros objetivos.
Instalar un servidor de desarrollo basado en Linux
Los nombres de dominios y direcciones IP dependerán de cada caso. Yo utilizaré los usados en la empresa donde trabajo actualmente, IT7 (aunque también colaboro con SAC y K-Nábora), aunque cambiando las direcciones IP para no revelar la configuración exacta de la red interna.
Para la instalación inicial partimos de una Ubuntu 8.04 server LTS, aunque se puede elegir alguna posterior. Tras arrancar el PC con el cd de la Ubuntu dentro, los pasos son:
- Seleccionar idioma español.
- Seleccionar instalar Ubuntu server.
- Seleccionar España.
- Seleccionar Sí ante la pregunta por el layout del teclado.
- Presionar todas las teclas que va pidiendo y responder a las preguntas que hace sobre la presencia de determinadas teclas en el teclado.
- Cuando pregunta nombre de la máquina, introducir goldberg
- Seleccionar zona horaria.
- En el particionado de discos, para no complicar la vida, seleccionar la opción Guiado - utilizar todo el disco
- Elegir Si cuando pregunta si se desea escribir los cambios en el disco (formateado)
- Crear cuenta de usuario. Introducir nombre completo, nombre de usuario y contraseña. Dejar la opción por defecto de No crear directorio cifrado.
- Dejar en blanco la opción de usar proxy para obtener la información de paquetes.
- Dejar opción por defecto de no realizar actualizaciones automáticas.
A continuación y por comodidad, el programa de instalación nos permite instalar varios conjuntos de paquetes preseleccionados en función de nuestras necesidades.
Seleccionaremos los siguientes:
- LAMP server: Apache 2, MySQL 5 y PHP 5.
- Mail server: necesario para que nuestras aplicaciones y scripts de mantenimiento puedan enviar correos.
- OpenSSH server: para poder acceder al sistema desde cualquier máquina cliente de la oficina.
- DNS server: como veremos en próximos artículos, para acceder desde el navegador a los proyectos en los que trabajamos, usaremos direcciones del tipo nombre de usuario.nombre de proyecto.it7 (por ejemplo eddy.laaldea.it7, dcabrera.laaldea.it7, etc...). Para ello las máquinas clientes tienen que conectarse a un servidor DNS que resuelva dichas direcciones, para lo cual usaremos este mismo servidor.
- Samba file server: tras probar varias configuraciones de trabajo se encontró que la más cómoda era aquella donde los usuarios trabajaban sobre carpetas situadas en el propio servidor. Para clientes linux utilizaremos NFS, pero para máquinas Windows y Mac OS X accederemos por Samba.
- Introducir contraseña root de mysql.
- Dejar opción por defecto de correo denominada Sitio de Internet.
- En la configuración del correo, cuando pregunta por el nombre del host, usar goldberg.it7
Tras esto nos pide que retiremos el CD y reiniciemos. Una vez reiniciado, entramos con la cuenta creada y ejecutamos:
sudo apt-get update
para actualizar la información de paquetes disponibles en los repositorios, y
sudo apt-get upgrade
para actualizar los paquetes instalados. Es posible que se haya actualizado la imagen del kernel, por lo que ante la duda reiniciaremos el servidor.
Por comodidad utilizaremos el phpMyAdmin para gestionar el servidor MySQL, por lo que lo instalamos con
sudo apt-get install phpmyadmin
En la instalación del phpmyadmin, pregunta para que servidor ha de realizarse. Seleccionaremos apache2.
Como veremos cuando hablemos de la implantación del control de versiones, usaremos el servidor Subversion de Dreamhost, pero para mayor seguridad y en caso de no disponer de conexión a éste, vamos a configurar un repositorio que replique el principal en esta máquina. Para ello instalaremos los paquetes necesarios:
sudo apt-get install subversion libapache2-svn
Ahora hay que configurar la red. Durante la instalación, el programa habrá utilizado la opción de coger una dirección IP proporcionada por el router (DHCP). Aunque generalmente para una configuración de máquinas estable todas acabarán adoptando siempre las mismas direcciones, es mejor asegurarnos proporcionando una dirección IP fija al servidor. Para ello hay que editar el fichero donde se definen las interfaces de red. En mi caso, uso el editor vi.
sudo vi /etc/network/interfaces
Si como hemos dicho, durante la instalación se usó DHCP para configurar la red, veremos algo como esto:
# The primary network interface
auto eth0
iface eth0 inet dhcp
Esta última línea se sustituye para asignar una ip fija dentro del rango asignado para esto dentro de la red interna. La configuración actual de Goldberg queda como sigue (en sustitución de la línea mencionada):
iface eth0 inet static
address 192.168.50.63
netmask 255.255.255.0
gateway 192.168.50.20
A continuación guardamos el fichero y editamos el fichero donde se indican los servidores de direcciones de nombre que utilizará Goldberg. Éste va a ser el servidor DNS de la red interna, forwardeando las solicitudes de direcciones externas.
Como servidores adicionales DNS suelo usar los de Telefónica, por nada en especial, sencillamente porque de tanto configurar internet para familiares y amigos acabé aprendiéndome esas direcciones en concreto.
sudo vi etc/resolv.conf
Aquí pondremos (sustituyendo lo que haya)
nameserver 192.168.50.63
nameserver 194.179.1.100
nameserver 194.179.1.101
Ahora hay que crear los usuarios del sistema. Para cada uno de ellos haremos:
sudo adduser
Introducir contraseña, nombre y una vez creado procedemos con:
sudo adduser nombre de usuario www-data
(por ejemplo sudo adduser eddy www-data).
Con esto hemos añadido el usuario al grupo del servidor apache. Para los usuarios avanzados (generalmente los programadores) que requieran privilegios administrativos sobre el servidor, ejecutaremos
sudo adduser nombre de usuario admin
(por ejemplo sudo adduser eddy admin).
En un sistema Ubuntu, se crea una carpeta home de la que cuelga una carpeta para cada usuario del sistema (eddy, dcabrera, etc.). Además, se crea un grupo de usuarios con el mismo nombre de usuario para cada uno de ellos.En el sistema de permisos de Linux, por defecto se establece como propietario de la carpeta el usuario, y como grupo al que pertenece el grupo del usuario. Hay que cambiar el grupo e indicar que pertenece al grupo www-data, que es el grupo al que pertenece el servidor Apache y así éste no tenga problemas a la hora de acceder a los archivos de trabajo de cada usuario. Además hay que fijar este grupo automáticamente para las nuevas carpetas y ficheros que se creen. Para ello, con cada usuario (utilizaré el usuario eddy para el resto de ejemplos):
sudo chgrp -R www-data /home/eddy
sudo chmod -R g+s /home/eddy
Añadimos parámetros globales de permisos de ficheros, para ello editaremos los ficheros /etc/profile y /etc/apache2/envvars y en ambos incluiremos la línea
umask 002
Y para finalizar por ahora, crearemos las carpetas para los scripts de automatización del día a día:
sudo mkdir /etc/scripts
sudo mkdir /usr/local/bin/scripts
Esta estructura es la utilizada a lo largo de los artículos, aunque tras terminar de leer Everyday Scripting With Ruby decidí que más adelante y a medida que desarrolle scripts más complejos utilizaría una estructura más estándar tal como se propone en el capítulo 19 (A Polished Script).
Donde estamos y hacia donde vamos
Por el momento ya tenemos un servidor instalado, aunque tal como está configurado en este momento aún no podemos alojar ningún proyecto web.
En el próximo artículo, prepararemos el servidor para conectar con el de Dreamhost y para compartir las carpetas home de cada usuario por la red (vía Samba y NFS) y acceder a ellas desde las máquinas cliente.

Buen artículo, enhorabuena.
ResponderSuprimir