jueves 8 de abril de 2010

Creación de servidores virtuales (I)

¿Cansado de crear a mano los servidores virtuales del Apache para cada proyecto con sus correspondientes entradas DNS en el servidor de desarrollo local? Yo lo estaba, así que decidí resolverlo con este script.

Recapitulando

El modus operandi en mi empresa a la hora de trabajar un proyecto es el siguiente: en el servidor de desarrollo, en la carpeta home de cada usuario, se crea una carpeta para cada proyecto, de la forma nombreDeUsuario.nombreDeProyecto.it7, por ejemplo ejosafat.ciu2010.it7; esa es la copia de trabajo subversion de cada uno.

Cada usuario visualiza su trabajo con el navegador accediendo a la url http://nombreDeUsuario.nombreDeProyecto.it7 correspondiente. Para que esto sea posible, se deben dar dos condiciones:

  1. Que haya un servidor DNS que reconozca la url y encamine el navegador hacia el servidor de desarrollo.
  2. Que haya creado un servidor virtual en el Apache que responda a esa dirección sirviendo los archivos de la carpeta correspondiente.

Primero veremos como sería la forma manual de hacerlo (incluyendo la configuración del servidor DNS en el servidor de desarrollo local) y después el script para automatizar dicha generación.

Dada la extensión de este artículo, lo dividiré en dos partes. En ésta hablaré de la configuración DNS, y en el siguiente la configuración de los virtual host en el apache y el script que automatiza la generación.

Objetivos

  • Configurar servidor DNS
  • Crear un script que automatice tanto la creación de la entrada DNS correspondiente a cada proyecto como la generación del servidor virtual en el Apache.

Paso a Paso

DNS

Para configurar el servidor DNS, hay un buen artículo al respecto en la guía del servidor de la Ubuntu 9.10. Resumiré aquí lo que me interesa para la configuración de mi servidor de desarrollo.

Lo primero de todo es configurar cuales serán los servidores DNS que consultará el propio servidor. Hay que editar el fichero /etc/resolv.conf, y sustituir lo que haya por la dirección IP del propio servidor, ya que será el que tenga que resolver las direcciones de los proyectos que trabajamos en el entorno local. A continuación, en caso de que el servicio DNS falle, ponemos la de otros servidores conocidos (en mi caso uso los de Telefónica generalmente).


nameserver 192.168.50.53
nameserver 194.179.1.100
nameserver 194.179.1.101

El primer paso es configurar el servidor de desarrollo como forwarder de DNS. Es decir, que cuando le llegue una petición de resolución de nombres, si él no puede resolverla (cosa que pasará con cualquier dominio que no sea de los que usaremos para el desarrollo local), haga la petición a otro servidor DNS y cachee la respuesta, de tal manera que en sucesivas peticiones al mismo dominio externo obtengamos la respuesta de nuestro propio servidor, que ya conocerá la ip a la que resuelve el nombre, por haberla buscado anteriormente.

Lo primero es configurar para que reconozca el dominio personalizado que usaremos para conectar con el servidor de desarrollo en general, al margen de cualquier proyecto, bien sea por ssh o via web para utilizar el phpmyadmin, por ejemplo.

Hay que editar el fichero /etc/bind/named.conf.local y añadir lo siguiente (el nombre local de la máquina es goldberg, y el sufijo que usaremos para todos los dominios es it7):


zone "goldberg" {
type master;
file "/etc/bind/db.goldberg.it7";
};

y su resolución inversa correspondiente:


zone "50.168.192.in-addr.arpa" {
type master;
notify no;
file "/etc/bind/db.192";
};

Hay que crear los dos ficheros referenciados, ambos en la carpeta /etc/bind. Para crear el fichero db.192, lo más cómodo es copiar uno que se habrá creado en la instalación del servidor, db.127, y modificarlo para dejarlo así:


$TTL 604800
@ IN SOA .goldberg.it7. ejosafat.it7.info. (
1 ; Serial
604800 ; Refresh
86400 ; Retry
2419200 ; Expire
604800 ) ; Negative Cache TTL
;
@ IN NS .
53 IN PTR .goldberg.it7.

Para crear db.goldberg.it7, lo más sencillo también es copiar otro que ya existirá, db.local y modificarlo, para dejarlo de la siguiente manera:


;
; BIND data file for local loopback interface
;
$TTL 604800
@ IN SOA ns.goldberg.it7. ejosafat.it7.info. (
2 ; Serial
604800 ; Refresh
86400 ; Retry
2419200 ; Expire
604800 ) ; Negative Cache TTL
;
@ IN NS ns.goldberg.it7
@ IN A 192.168.50.53
@ IN AAAA ::1
ns IN A 192.168.50.53

posteriormente, para cada proyecto que se vaya a emprender, hay que crear también la correspondiente entrada en /etc/bind/named.conf.local, de la misma manera. Por ejemplo, para un proyecto denominado prueba:


zone "prueba.it7" {
type master;
file "/etc/bind/db.prueba.it7";
};

Y hay que crear db.prueba.it7, para ello se puede copiar el fichero db.golberg.it7 y realizar los siguientes cambios:

  • sustituir goldberg por prueba
  • Añadir debajo de la línea @ IN A 192.168.50.53 una línea para cada subdominio (desarrollador que va a trabajar en el proyecto) de la forma <nombre de usuario> IN A 192.168.50.53. Por ejemplo, para eddy, usaríamos eddy IN A 192.168.50.53

Conclusión

De esta manera se pueden ir creando todos los dominios que necesite para el desarrollo de los diversos proyectos. Más de un administrador de sistemas se tirará manos a la cabeza leyendo lo anterior, ya que no hablo del incremento del número Serial, y probablemente haya otra forma más elegante de hacerlo, pero soy programador, no sysadmin, a mí así me vale!

En el próximo artículo configuraré el Apache para responder a esas direcciones y utilizaré un script para automatizar tan tediosa tarea.

0 comentarios:

Publicar un comentario en la entrada