Tener dos instancias OpenLDAP en el mismo servidor RHEL5

OpenLDAP es una implementación Open Source del protocolo Lightweight Directory Access Protocol (LDAP). LDAP es el protocolo de red que nos permite hacer consultas a un directorio (consultas de lectura y escritura, aunque está optimizado para soportar muchísimas lecturas en poco tiempo). Un directorio es una base de datos de objetos organizada jerárquicamente en forma de árbol, y hace tiempo ya que los usamos para guardar objetos que representan recursos de una red: un equipo, una impresora, un concesión del DHCP, un nombre de hosts, una cuenta de correo, un cuenta de usuario con su contraseña y datos personales, etc. Al final resulta muy cómodo y fácil decirle a nuestras aplicaciones y servicios de red, que busquen las cuentas de acceso y las contraseñas en un directorio central, en vez de mantener cada uno su propia gestión de usuario.
OpenLDAP es una implementación que podemos usar en cualquiera de las distribuciones de Linux modernas, además de BSD, HP-UX, AIX, MacOsX, Windows, etc, pero por alguna razón que desconozco, en RHEL5 no resulta nada fácil tener dos instancias de OpenLDAP en distintos puertos en el mismo equipo. ¿Para qué podemos necesitar algo así?: Para tener un maestro y un esclavo en el mismo equipo, garantizando que no hay cortes de red en la replicació o para poder clusterizar en activo-pasivo varias instancias aprovechando la misma infraestructura de cluster de los equipos. Estos han sido los escenarios en los que yo he necesitado tener dos instancias en el mismo equipo, y que voy a contaros como hacer, aunque sea un poco artesanal.
Para ilustrar el procedimiento consideraremos que ya tenemos un maestro que tiene la configuración en /etc/openldap/slapd.conf, la base de datos en /var/lib/ldap y el demonio de arranque y parada en /etc/init.d/ldap. También supondremos que este maestro escucha conexiones en el puerto 389.
Ahora supondremos que queremos levantar una segunda instancia que llamaremos de respaldo en el puerto 3890. Los pasos que tendremos realizar son los siguientes:

  1. Lo primero sera parar el ldap maestro.
    /etc/init.d/ldap stop
  2. Ahora crearemos el usuario que ejecutará la instancia de respaldo:
    useradd ldap-respaldo -c "LDAP User backup" -s /bin/false -d /var/lib/ldap-respaldo
    No es casualidad que el usuario se llame ldap-respaldo: nos será mucho más rápido y rentable añadir el sufijo -respaldo a las ocurrencias de ldap, que sustituir por completo las ocurrencias por otra cadena más apropiada.
  3. Copiar los directorios y ejecutables del usuario ldap al usuario ldap-respaldo.
    cp  /etc/init.d/ldap  /etc/init.d/ldap-respaldo
    cp /usr/sbin/slapd /usr/sbin/slapd-respaldo
    chmod 755 /usr/sbin/slapd-respaldo

    mkdir -m 777 /var/run/openldap-respaldo

    cp /etc/openldap -R /etc/openldap-respaldo
    cp /var/lib/ldap -R /var/lib/ldap-respaldo

    chown -R ldap-respaldo.ldap-respaldo \
    /etc/openldap-respaldo \
    /var/run/openldap-respaldo \
    /var/lib/ldap-respaldo
  4. Editar el fichero de configuracion (/etc/openldap-respaldo/slapd.conf) de la nueva instancia y cambiar las líneas
    pidfile  /var/run/openldap/slapd.pid
    argsfile /var/run/openldap/slapd.args
    directory /var/lib/ldap
    ...por estas otras...
    pidfile  /var/run/openldap-respaldo/slapd.pid
    argsfile /var/run/openldap-respaldo/slapd.args
    directory /var/lib/ldap-respaldo
  5. Por último, tendremos que editar el demonio de arranque y parada del nuevo servicio (/etc/init.d/ldap-respaldo), y aplicar las siguientes diferencias:
    12a13,16
    >
    > # Sufijo...
    > export lsfx="-respaldo"
    >
    29c33
    < slapd=/usr/sbin/slapd
    ---
    > slapd=/usr/sbin/slapd${lsfx}
    94c98
    < user=ldap
    ---
    > user=ldap${lsfx}
    98,99c102,103
    < slaptestflags=
    < for dbdir in `LANG=C egrep '^directory[[:space:]]+[[:print:]]+$' /etc/openldap/slapd.conf | sed s,^directory,,` ; do
    ---
    > slaptestflags=" -f /etc/openldap${lsfx}/slapd.conf "
    > for dbdir in `LANG=C egrep '^directory[[:space:]]+[[:print:]]+$' /etc/openldap${lsfx}/slapd.conf | sed s,^directory,,` ; do
    116,117c120
    < # Unaccessible TLS configuration files.
    < tlsconfigs=`LANG=C egrep '^(TLS_CACERT|TLSCACertificateFile|TLSCertificateFile|TLSCertificateKeyFile)[[:space:]]' /etc/openldap/slapd.conf /etc/openldap/ldap.conf | awk '{print $2}'`
    ---
    > tlsconfigs=`LANG=C egrep '^(TLS_CACERT|TLSCACertificateFile|TLSCertificateFile|TLSCertificateKeyFile)[[:space:]]' /etc/openldap${lsfx}/slapd.conf /etc/openldap${lsfx}/ldap.conf | awk '{print $2}'`
    124,134c127,138
    < if ! action $"Checking configuration files for $prog: " /sbin/runuser -m -s "$slaptest" -- "$user" $slaptestflags; then
    < if /sbin/runuser -m -s "$slaptest" -- "$user" "-u" > /dev/null 2> /dev/null ; then
    < dirs=`LANG=C egrep '^directory[[:space:]]+[[:print:]]+$' /etc/openldap/slapd.conf | awk '{print $2}'`
    < for directory in $dirs ; do
    < if test -r $directory/__db.001 ; then
    < echo -n $"stale lock files may be present in $directory" ; warning ; echo
    < fi
    < done
    < fi
    < exit 1
    < fi
    ---
    >
    > # if ! action $"Checking configuration files for $prog: " /sbin/runuser -m -s "$slaptest" -- "$user" $slaptestflags; then
    > # if /sbin/runuser -m -s "$slaptest" -- "$user" "-u" $slaptestflags > /dev/null 2> /dev/null ; then
    > # dirs=`LANG=C egrep '^directory[[:space:]]+[[:print:]]+$' /etc/openldap${lsfx}/slapd.conf | awk '{print $2}'`
    > # for directory in $dirs ; do
    > # if test -r $directory/__db.001 ; then
    > # echo -n $"stale lock files may be present in $directory" ; warning ; echo
    > # fi
    > # done
    > # fi
    > # exit 1
    > # fi
    140c144
    < user=ldap
    ---
    > user=ldap${lsfx}
    147c151
    < if grep -q ^TLS /etc/openldap/slapd.conf || test x$SLAPD_LDAPS = xyes ; then
    ---
    > if grep -q ^TLS /etc/openldap${lsfx}/slapd.conf || test x$SLAPD_LDAPS = xyes ; then
    152a157,158
    > harg="ldap://0.0.0.0:3890/ "
    > export SLAPD_OPTIONS=" -F /etc/openldap${lsfx} -f /etc/openldap${lsfx}/slapd.conf "
    168c174
    < if grep -q "^replogfile" /etc/openldap/slapd.conf; then
    ---
    > if grep -q "^replogfile" /etc/openldap${lsfx}/slapd.conf; then
    179c185
    < [ $RETVAL -eq 0 ] && touch /var/lock/subsys/ldap
    ---
    > [ $RETVAL -eq 0 ] && touch /var/lock/subsys/ldap${lsfx}
    191c197
    < if grep -q "^replogfile" /etc/openldap/slapd.conf; then
    ---
    > if grep -q "^replogfile" /etc/openldap${lsfx}/slapd.conf; then
    199c205
    < [ $RETVAL -eq 0 ] && rm -f /var/lock/subsys/ldap /var/run/slapd.args
    ---
    > [ $RETVAL -eq 0 ] && rm -f /var/lock/subsys/ldap${lsfx} /var/run/slapd${lsfx}.args
    219c225
    < if grep -q "^replogfile" /etc/openldap/slapd.conf ; then
    ---
    > if grep -q "^replogfile" /etc/openldap${lsfx}/slapd.conf ; then
    232c238
    < if [ -f /var/lock/subsys/ldap ] ; then
    ---
    > if [ -f /var/lock/subsys/ldap${lsfx} ] ; then

Ahora ya se puede probar a arrancar los directorios, ejecutando:
/etc/init.d/ldap start
/etc/init.d/ldap-respaldo start
Si ahora ejecutamos ps aux, deberían aparecernos dos entradas para slapd. Si después de esto, necesitáramos crear una tercera instancia, podríamos usar un nuevo sufijo que fuera por ejemplo -tercera, tendríamos que aplicar los 4 primeros pasos cambiando en -respaldo por -tercera, y en el quinto paso, bastaría con hacer una copia de /etc/init.d/ldap-respaldo en /etc/init.d/ldap-tercera y luego editar este último para cambiar la línea 16, y en vez de poner:
export lsfx="-respaldo"
...pusiera el nuevo sufijo...
export lsfx="-tercera"
Bueno aunque sea una solución un poco aventurera, y a mí ha servido. Espero a que vosotros también.
La foto la he sacado del album de vertigogen en flickr

No hay comentarios: