Repositorio interno de actualizaciones totalmente transparente para CentOS

Dados los múltiples problemas de ancho de banda que tienen nuestros clientes de actualizaciones simultáneas de las versiones de CentOS, en donde la línea dedicada sucumbe ante tanto ancho de banda requerido, dado que todos los servidores y estaciones de trabajo se ponen a actualizar.

 

CentOS

 

La solución para este problema es crear un propio repositorio de actualizaciones y que funcione totalmente transparente el yum para efectuar las actualizaciones.

De aqui siempre encontrábamos algunos problemas:

  • Cuando se instala una máquinas o un servidor nuevo, siempre se tenía que instalar los archivos del yum con la configuración personalizada para actualizarlo. Si la máquina es de algún cliente y habia que llevarla a su empresa, se tenáa que regresar a los archivos originales
  • El ser tedioso el estar cambiando los archivos mencionados en el párrafo anterior.
  • Muchas veces se tenia la maquina recien instalada y se iba a actualizar a los repositorios default, por lo que igual consume ancho de banda, asi sea un olvido por parte nuestra de este pequeño detalle de los archivos del Yum
  • Manejo de una configuración total de la red, en donde todos los procesos se hagan totalmente transparentes

Bueno pues, la solución fue de hacer un Repositorio interno de actualizaciones totalmente transparente para CentOS, al comienzo dió bastante trabajo pero al final resultó algo sencillo, que pasamos a detallar los pasos seguidos en esta implementación.

 

Requerimientos

  • Servidor DNS con bind.
  • Servidor DHCP
  • Servidor de archivos con Apache y PHP instalado, con por lo menos unos 50GB disponibles en donde vas a guardar el repositorio.


Configuración

DHCP

Este es el primer paso, la red debe ser por DHCP y asignando los IPs en forma automática, obviamente apuntando como unico servidor DNS a tu DNS propio como se detalla a continuación

option domain-name-servers 192.168.1.1;

DNS

Esta es la parte mas importante del truco. Como todas tus maquinas apuntan a un único DNS de consultas, todo lo que se le ponga al DNS, va a hacer que los servidores le hagan caso.

Entonces en el archivo named.rfc1912.zones

// Dominio mirrorlist.centos.org
zone "mirrorlist.centos.org"{
        type master;
        file "db.mirrorlist.centos.org";
};

y en el directorio /var/named crean el archivo db.mirrorlist.centos.org con el siguiente contenido

; localhost.
$TTL 3600
@               in      soa     localhost. hostmaster.localhost. (
                                2012052500      ;serial
                                3600            ;refresh
                                1800            ;retry
                                604800          ;expiration
                                3600 )          ;minimum
@                                       in      ns      localhost.
mirrorlist.centos.org.                  in      ns      localhost.
mirrorlist.centos.org.                  IN      A       192.168.1.20

en donde estamos haciendo que el dominio mirrorlist.centos.org apunte y resuelva al IP 192.168.1.20 que es donde vamos a tener el Apache + PHP y el contenido del respositorio.

APACHE Y PHP

En el servidor de Apache con PHP que tiene la IP 192.168.1.20 (pueden cambiarle y usar el IP que requieran), en el httpd.conf se le configura un par de dominios virtuales

<virtualhost 192.168.1.20:80>
    ServerAdmin Esta dirección de correo electrónico está protegida contra spambots. Usted necesita tener Javascript activado para poder verla.
    DocumentRoot /home/repositorio
    ServerName repo.cipher.pe
    Options Indexes FollowSymLinks MultiViews
    ErrorLog logs/repo.cipher.pe-error.log
    CustomLog logs/repo.cipher.pe-access.log common
</virtualhost>

<virtualhost 192.168.1.20:80>
    ServerAdmin Esta dirección de correo electrónico está protegida contra spambots. Usted necesita tener Javascript activado para poder verla.
    DocumentRoot /home/repositorio/mirrorlist.centos.org
    ServerName mirrorlist.centos.org
    ErrorLog logs/mirrorlist.centos.org-error.log
    CustomLog logs/mirrorlist.centos.org-access.log common
</virtualhost>


En donde quedaron listos 2 dominios virtuales, el mirrorlist.centos.org y el repo.cipher.pe

Como le estamos haciendo creer a CentOS que ese es el mirrorlist público, aqui debemos ponerle un archivo que de el mismo output. Creamos los directorios

mkdir -p /home/repositorio
mkdir -p /home/repositorio/mirrorlist.centos.org

Y en el /home/repositorio/mirrorlist.centos.org ponemos el siguiente archivo index.php

< ?php
if ($_GET['release'] == 6) { $wrelease = "6.2";  } // para indicar cual es la ultima version, cambienlo cuando lo requieran
$wruta ="";
$valor ="/".$wrelease."/".$_GET['repo']."/".$_GET['arch'].$wruta;
header ("Content-Type: text/plain");
echo "http://repo.cipher.pe/centos".$valor;
?>

En donde con esto se le esta indicando que a cualquier petición que se haga, siempre apunte a directorios internos del repositorio interno, es mas, repo.cipher.pe lo tenemos publicado como dominio interno, no resuelve desde el internet, y con eso es seguro que nadie de afuera encuentre el repositorio privado. Con esto nunca va a volver a salir cualquier CentOS de la red LAN a buscar algun repositorio externo.

 

Creación del Repositorio

Bueno, hasta aqui ya se tienen la operatividad de los repositorios internos, pero no nos podemos olvidar de ponerle contenido al repositorio. Siguiendo con esto, aqui ponemos un script que hace que sincronice toda las noches con los repositorios oficiales. Tomamos en cuenta una lista de repositorios por si es que alguno se pone lento, pero en nuestro caso el preferido es el de rsync.gtlib.gatech.edu que es el que mas velocidad de descarga nos da. Cualquier cosa, pueden verificar la lista de mirrors disponible y comparar cual es la que les da los mejores tiempos de descargas.

Deberán instalar el programa createrepo desde RPMFORGE, esto es sencillo para ustedes.

En archivo de configuración /etc/crontab ponen

1 1 * * * root /bin/sh /usr/local/bin/actualiza.sh

Y el archivo para que actualice /usr/local/bin/actualiza.sh contiene lo siguiente


#!/bin/sh

REPOSITORIO=rsync.gtlib.gatech.edu
# REPOSITORIO=mirrors.kernel.org
# REPOSITORIO=rsync.arcticnetwork.ca
# REPOSITORIO=mirror.astate.edu
# REPOSITORIO=mirror.stanford.edu/mirrors
# REPOSITORIO=mirrors.usc.edu::pub
# REPOSITORIO=mirror.anl.gov
# REPOSITORIO=pubmirrors.reflected.net
# REPOSITORIO=mirrors.rit.edu
# REPOSITORIO=mirrors.cat.pdx.edu
# REPOSITORIO=mirror.chpc.utah.edu/pub

/usr/bin/rsync -av --exclude debug  rsync://$REPOSITORIO/centos/6.2/updates/i386/RPMS/* /home/repositorio/centos/6.2/updates/i386/RPMS/
/usr/bin/createrepo /home/repositorio/centos/6.2/updates/i386/

/usr/bin/rsync -av --exclude debug  rsync://$REPOSITORIO/centos/6.2/updates/x86_64/RPMS/* /home/repositorio/centos/6.2/updates/x86_64/RPMS/
/usr/bin/createrepo /home/repositorio/centos/6.2/updates/x86_64/

/usr/bin/rsync -av --exclude debug  rsync://$REPOSITORIO/centos/6.2/os/i386/CentOS/* /home/repositorio/centos/6.2/os/i386/CentOS/
/usr/bin/createrepo /home/repositorio/centos/6.2/os/i386/

/usr/bin/rsync -av --exclude debug  rsync://$REPOSITORIO/centos/6.2/os/x86_64/CentOS/* /home/repositorio/centos/6.2/os/x86_64/CentOS/
/usr/bin/createrepo /home/repositorio/centos/6.2/os/x86_64/

/usr/bin/rsync -av --exclude debug  rsync://$REPOSITORIO/centos/6.2/addons/i386/RPMS/* /home/repositorio/centos/6.2/addons/i386/RPMS/
/usr/bin/createrepo /home/repositorio/centos/6.2/addons/i386/

/usr/bin/rsync -av --exclude debug  rsync://$REPOSITORIO/centos/6.2/addons/x86_64/RPMS/* /home/repositorio/centos/6.2/addons/x86_64/RPMS/
/usr/bin/createrepo /home/repositorio/centos/6.2/addons/x86_64/

/usr/bin/rsync -av --exclude debug  rsync://$REPOSITORIO/centos/6.2/extras/i386/RPMS/* /home/repositorio/centos/6.2/extras/i386/RPMS/
/usr/bin/createrepo /home/repositorio/centos/6.2/extras/i386/

/usr/bin/rsync -av --exclude debug  rsync://$REPOSITORIO/centos/6.2/extras/x86_64/RPMS/* /home/repositorio/centos/6.2/extras/x86_64/RPMS/
/usr/bin/createrepo /home/repositorio/centos/6.2/extras/x86_64/

Es probable que tengan que generar el arbol de directorios en /home/repositorio/centos/* pero con el comando mkdir -p van a ver que es bastante sencillo crearlo.

Y listo, con esto conseguirán un repositorio privado de CentOS en su LAN, totalmente transparente, usándose los mismos archivos default del Yum que vienen instalados en CentOS y sin tener problemas de línea dedicada y de actualizaciones múltiples. En nuestro caso solo conservamos las últimas versiones pero si es que desean (y tienen la capacidad en discos duros) pueden conservar todas las versiones que deseen, solamente deben cambiar la info en el archivo PHP.

Espero que sea de su ayuda para tan importante "dolor de cabeza" con los temas de ancho de banda