lunes, 11 de junio de 2012

Cambiando el hostname a través de un script

En esta ocasión vamos plantear una solución para un proyecto de arranque por red que tenemos entre manos. Se trata de hacer que un equipo cliente que solicita a un servidor una imagen arrancable de un sistema Linux, reciba esta imagen y que se asigne a sí mismo un nuevo nombre de host. El problema se planteaba cuando varias máquinas recibían la imágen y ésta traía preconfigurado un nombre estándar de host, ya que todas aquellas máquinas cliente que se iniciasen de este modo se llamarían exactamente igual en la red.

Para solucionarlo, se nos ocurre incrustar en la imagen que el servidor ofrece un script de arranque que lleve a cabo una modificación automática en el nombre del host, de tal forma que el nuevo nombre asignado sea totalmente diferente entre las diferentes máquinas que soliciten utilizar este servicio de arranque en red. Vamos a ver una posible solución:

#!/bin/bash

#Se analiza el valor de la variable HOSTNAME
#si no empieza por pc@ es que el nombre aún no ha sido
#actualizad al nuevo formato de nombres de hosts


echo $HOSTNAME | grep -w ^"pc@" > /dev/null
if [ $? -ne 0 ]
then
    #Generamos un código semialeatorio tomando los nanosegundos del sistema
    codigo=`date +%N`
         #Vamos a utilizar la cadena "pc@" para comenzar los nombres de nuestros equipos, esta cadena puede modificarse por la que se estime oportuna
    nombre_host="pc@"$codigo
    #Actualizamos la variable de entorno HOSTNAME       
    export HOSTNAME=$nombre_host
    #Actualizamos el contenido del archivo hostname
    echo $nombre_host > /etc/hostname
    if [ $? -ne 0 ]
    then
        echo "Error al reasignar nombre de host"
    fi
fi
  
El último if que comprueba $? podría eliminarse, ya que si buscamos que este script sea totalmente automático, no sería conveniente mostrar nada por pantalla. Hemos probado este script y cuando finaliza su ejecución el cambio de hostname se hace efectivo correctamente.

Podría ampliarse haciendo que se anote en un LOG alojado en el servidor cada nuevo nombre y su ip asociada. De este modo podríamos tener un registro de qué equipos de la red se han creado nuevos y su dirección.

Para hacer que este script se ejecute al inicio (lógicamente debe tener los permisos de ejecución adecuados y ser propiedad del root), debería colocarse en la carpeta /etc/init.d y crear un enlace a él desde las carpetas /etc/rc3.d o /etc/rc5.d, o cualquier otra asociada al nivel de ejecución de Linux donde queremos que el script se inicie.

Nota: existen algunos comandos que nos pueden generar los enlaces automáticamente. Un ejemplo puede ser el comando update-rc.d /etc/init.d/miscript defaults que podría funcionar para Ubuntu. (Asocia el script al boot de Ubuntu). Echale un vistazo a este enlace en el que puedes encontrar más información: asociar scripts a diferentes runlevels.

No hay comentarios: