lunes, 14 de marzo de 2011

COMO hacer un Servidor Espejo a nivel de Archivos


Hola a todos, este es el primer post de este blog, aqui le mostrare como hacer un servidor espejo (mirrors), a nivel de archivo en GNU / Linux.

ALGUNOS EJEMPLOS, para lo cuales le puede servir este -COMO-:

1. Digamos que desea sincronizar todos los usuarios automaticamente de un servidor padre a otros servidores.

2. Tiene un servidor de archivo con samba en la principal y en la sucursales quieres instalar localmente servidores de archivos pero que esten todo sincronizados.

3. Desea hacer backup automatico de archivos a nivel diferencial.

4. Desea hacer migraciones de un servidor mas antiguo a uno nuevo mas potente.

* Podriamos enumerar otros ejemplos, pero la idea fundamental de este -COMO- es sincronizar todos los usuarios de un servidor padre a otros hijos.



QUE NECESITAMOS:

1. Tener instalado GNU / Linux (No importa que distribuccion sea: RED HAT, SUSE, CENTOS, DEBIA, UBUNTU, SLACKWARE, etc...)

2. Tener rsync instalado en tus Servidores o PCs.

3. Antes de realizar este COMO hacer un backup (home, root, passwd, shadow y group) del servidor y los espejos.


INSTALANDO RSYNC.


En CENTOS (Sirve para cualquier distribuccion basada en .rpm que tenga yum).


 $ sudo yum install rsync 

En el caso de Red Hat (RHEL).

 $ up2date rsync



En DEBIAN (Sirve para cualquier Distribuccion basada en .deb que tenga apt).

 $ sudo apt-get install rsync 




CONFIGURACION DEL SERVIDOR


Entramos al Servidor padre y como vamos a ejecutar a rsync a partir del xinetd,  debemos asegurarnos de que está asociado al puerto 873/tcp dentro del archivo /etc/services. Para ello hay que comprobar que el archivo contiene un línea como la siguiente:

  rsync 873/tcp           #
  rsync 873/udp           #


Verificamos con:


 cat /etc/services |grep rsync

Ahora debemos activar el servicio dentro de xinetd (Editando el archivo de rsync en /etc/xinetd.d/rsync):

 # vim /etc/xinetd.d/rsync 

Deberia quedar de esta manera: 

# default: off
# description: The rsync server is a good addition to an ftp server, as it \
#       allows crc checksumming etc.
services rsync
{
         disable = no
         socket_type     = stream
         wait            = no
         user            = root
         server          = /usr/bin/rsync
         server_args     = --daemon
         log_on_failure  += USERID
}

* Si el archivo no existe debe crearlo en /etc/xinetd.d/ con el nombre de rsync y copiar el contenido anterior.

Ahora vamos a configurar el servicio de rsync, para esto necesitamos editar dos archivos (/etc/rsyncd.conf y /etc/rsyncd.secrets), sino existen debemos crearlos.

    rsyncd.conf: sirve para la configuracion.
    rsyncd.secrets: sirve para especificar cuales usuarios pueden sincronizar.

/etc/rsyncd.conf
gid = nobody
uid = nobody
read only = true
use chroot = no
hosts allow = 192.168.x.x,192.168.x.x  #IP_DE_LOS_SERVIDORES HIJOS
hosts deny = *
max connections = 2
syslog facility = daemon
transfer logging = true
log format = %h %o %f %l %b
log file = /var/log/rsyncd.log


exclude=/usr/ \
exclude=/boot/ \
exclude=/ \
exclude=/etc/ \

[usuarios]
path=/opt/script/sincronizacion/usuarios
comment = "Este directorio contiene una copia de los usuarios del sistema"

[home]
path=/home
comment = "Archivos home de los usuarios".

[root]
path=/root
comment = "Archivos del root"


/etc/rsyncd.secrets
 nombre_usuario:password

Para mejor seguridad le cambiamos los permisos a estos archivos:

  #chmod 644 /etc/rsyncd.conf
  #chmod 700 /etc/rsyncd.secrets

Para mas seguridad podemos retringir las conexiones de los hosts.

  # vim /etc/hosts.deny

Lo dejamos como este:
#
# hosts.deny    This file describes the names of the hosts which are
#               *not* allowed to use the local INET services, as decided
#               by the '/usr/sbin/tcpd' server.
#
# The portmap line is redundant, but it is left to remind you that
# the new secure portmap uses hosts.deny and hosts.allow.  In particular
# you should know that NFS uses portmap!
ALL:ALL:DENY

Luego agregamos los equipos que se conectan:

  # vim /etc/hosts.allow

Lo dejamos como este:

#
# hosts.allow   This file describes the names of the hosts which are
#               allowed to use the local INET services, as decided
#               by the '/usr/sbin/tcpd' server.
rsync:192.168.x.x:allow
rsync:192.168.x.x:allow

* Si deseamos que utilice cualquier servicio debemos colocar "ALL" en vez del rsync.
* Recuerde cambiar la IP por la que lleva su red.


PREPARANDO LO QUE SE VA A COPIAR.

Ya que tenemos el servidor configurado, ahora como indicamos al principio nos enfocaremos en sincronizar los usuarios del sistemas con los servidores espejos.

* Le Recomiendo tener la misma distribuccion, version e instalacion de servicios en todos los servidores, ya que el manejo de los UID y GID segun cada distribuccion.

Vamos a crear un carpeta, la cual compartimos en el /etc/rsyncd.conf (si revisan su archivo de rsyncd.conf veran que ya la agregamos anteriolmente.)

 # mkdir -p /opt/script/sincronizacion/usuarios

Para evitar tener que mover grandes informaciones del home de cada usuario, ademas de no estar complicandolo con copias diferenciar local y dejar que rsync se encargue de esta parte diferenciar, vamos a crear un link del home en "/opt/script/sincronizacion/usuarios".



 # vim /opt/script/script_copia_archivos_usuarios.sh

Aqui esta el contenido:
#!/bin/bash
# Angel J. Reynoso
# Tel.: 809-997-4870
# - kp01 -
# - GTS - Green Tecnology Services
# Creado: 30/01/2006
# Modficado: 09/03/2011
#######################################


# Este archivo se utiliza para copiar los archivos relacionado a las cuentas de cada usuarios.
# Variables.
RUTA1="/opt/script/sincronizacion"

RUTA2="/etc"


# Preparando los Logs.
echo "Fecha de Inicio: $(date)" 2>> $RUTA1/log.log
echo "------------------------------------------------------" 2>> $RUTA1/log.log

# Proceso.
cp -rp $RUTA2/passwd $RUTA1/usuarios/ 2>> $RUTA1/log.log
cp -rp $RUTA2/shadow $RUTA1/usuarios/ 2>> $RUTA1/log.log
cp -rp $RUTA2/group $RUTA1/usuarios/ 2>> $RUTA1/log.log

echo "FIN de Proceso" >> $RUTA1/log.log

Le damos permiso de ejecuccion:

 #chmod +x /opt/script/script_copia_archivo_usuario.sh


Bien, si lo desean podemos hacer una prueba ejecuntado el sript:

 #/opt/script/script_copia_archivo_usuario.sh

Ya tenemos todo casi listo, solo falta programa este script en el CRONTAB para que la realice cada X tiempo.



CONFIGURACION DE LOS CLIENTES (Servidores HIJOS):
Estos es mas sencillo, la idea es crear un script que programemos para que sincronice con el servidor los directorios "home, root y usuarios" a X horas y luego otro script que copie los archivos "passwd, group y shadows".


Recuerda que los archivos del home y root se sincronizan solo, osea que el segundo script solo copiara los archivos "passwd, group y shadow".



Vamos a crear el directorio donde estaran los scripts.

 # mkdir -p /opt/script/sincronizacion

Ahora creamos el script que sincroniza con el servidor.

 # vim /opt/script/sincronizacion/sinc_automatica.sh


Aqui esta el contenido:

#!/bin/bash
# Angel J. Reynoso
# Tel.: 809-997-4870
# - kp01 -
# - GTS - Green Tecnology Services
# Creado: 30/01/2006
# Modficado: 09/03/2011
#######################################


# Este archivo se utiliza para sincronizar del directorio usuario creado en /opt/script/sincronizacion en el servidor.

# Variables.
SERVIDOR="192.168.x.x" #Coloque aqui la ip de su servidor
COMANDO=$(whereis rsync | cut -d" " -f2)
RUTA1="/opt/script/sincronizacion"




# Sincronizacion de la carpeta usuario.

echo "Fecha de Inicio: $(date)" >> $RUTA1/log.log
echo "---------------------------------------" >> $RUTA1/log.log

# USUARIOS
$COMANDO --force --delete -azvpogLt $SERVIDOR::usuarios $RUTA1/usuarios 2>> $RUTA1/log.log

# HOME
$COMANDO --force --delete -azvpogLt $SERVIDOR::home $RUTA1/usuarios 2>> $RUTA1/log.log

# ROOT
$COMANDO --force --delete -azvpogLt $SERVIDOR::root $RUTA1/usuarios 2>> $RUTA1/log.log



echo "Fecha Final" >> $RUTA1/log.log
echo "***************************************" >> $RUTA1/log.log


Luego creamos el script que copiara los archivos "passwd, group y shadow".
 
 # vim /opt/script/sincronizacion/copiar_automatica.sh

Aqui esta el contenido:
#!/bin/bash
# Angel J. Reynoso
# Tel.: 809-997-4870
# - kp01 -
# - GTS - Green Tecnology Services
# Creado: 30/01/2006
# Modficado: 09/03/2011
#######################################

# Este archivo se utiliza para copiar del directorio /opt/script/sincronizacion/usuarios/ los archivos passwd, group y shadow que fueron sincronizado del servidor al /etc.

#Variables
RUTA1="/opt/script/sincronizacion/usuarios"
RUTA2="/etc/"

#Proceso.
echo "Fecha inicio de la Copia: $(date)" >> $RUTA1/../log.log
cp -rp $RUTA1/* $RUTA2 2>> $RUTA1/../log.log


Listo.

Si necesitan ayuda pueden dejar sus comentarios o comunicarce conmigo.

Saludos.-

Angel J. Reynoso
kp01 
Tel.: 829-997-4870
kp01aj@gmail.com

7 comentarios:

  1. Holaaa muchas gracias x compartirlo!! Pero tengo una duda, yo en realidad necesito mantener la copia de un servidor samba, la pregunta es existe la forma de tener una copia espejo de samba osea si el servidor principal se cae, que el secundario levante solo??? Saludos y muchas gracias!!

    ResponderEliminar
  2. Claro hermano... tienes muchas opciones para resolver ese problema, puedes crear un servidor BDC, asi podras respaldar tu dominio... entra a este link y hasme saber si te sirve: http://dns.bdat.net/documentos/validacion_ldap/x498.html.

    ResponderEliminar
  3. Buena tu explicación, pero aun leyendo tengo una duda, si esto se refiere tambien a el caso que yo tengo:
    Manejo un servidor con Centos 5.6 x64 en el cual estan dos discos instalados uno con todo el sistema Centos y una BD la cual deseo se sincronice con el segundo disco pero lo que no se es:
    1. que comando utilizo para saber si esta o no activo el segundo disco. Si no, entonces como activarlo
    2. como configurar el segundo disco para que sea un espejo del primero.
    Es posible esto o tiene que ser siempre entre 2 servidores

    Saludos Angel

    ResponderEliminar
  4. Hola hermano,

    Esta pequeña GUIA esta orientada a trabajar con archivos entre servidores o localmente, puede servirte pero entiendo que para lo que deseas hacer no es lo optimo.

    Espero ayudarte con las siguientes repuestas:

    1. Para saber si los discos están reconocido en el sistema, a mi en lo personal me gusta usar este comando: "cat /proc/partitions", luego veo si están montado con "mount", Pero me gustaría saber si en la instalación usaste LVM, RAID o disco separados, para poder ayudarte mejor.

    2. Hacer espejo entre discos, claro que es posible, lo único que la forma como lo haga depende del Hardware que tengas, ya que algunos servidores vienen con tarjetas que te hacen la replicación entre discos, si tu hardware trae este soporte solo tienes que entrar al BIOS o software manejador de esa tarjeta y programar tu arreglo, sino tiene un hardware con estas cualidades puede hacerlo tu mismo a nivel de software en tu instalación inicial o si ya instalaste desde el sistema, puedes hacerlo también con script que te hagan esta replicación automática. También hay algunos software que hacen esto.

    Aquí puede encontrar mas información.

    http://es.wikipedia.org/wiki/RAID
    http://lamaquinadiferencial.wordpress.com/2009/02/22/raid-1-por-software-en-ubuntu-debian-discos-en-espejo/
    http://es.wikipedia.org/wiki/Logical_Volume_Manager
    http://iie.fing.edu.uy/ense/asign/admunix/discos.htm
    http://www.monografias.com/trabajos14/discosraid/discosraid.shtml

    Saludos.

    ResponderEliminar
  5. Buen dia, si lo que requiero es tener un servidor espejo de mi www en caso de que se caiga levante el servidor hijo? gracias

    ResponderEliminar