Repositorio interno de actualizaciones totalmente transparente para CentOS

Hace mas o menos una año y medio tuve problemas de actualizaciones simultáneas de las versiones de CentOS en donde mi línea dedicada se fue “al techo” porque todos mis servidores y estaciones de trabajo se pusieron a actualizar. La solución en ese entonces fue crear mi propio repositorio de actualizaciones y meterle mano a los archivos del yum para actualizarlo.

De aqui salian algunos problemas:

  • Cuando instalabas una máquinas nueva o un servidor nuevo, siempre tenias que instalarle los archivos del yum con tu configuración para actualizarlo. Si la máquina habia que llevarla a algún cliente, tenias que regresar a los archivos originales
  • La ociosidad de estar cambiando los archivos arriba mencionados
  • Muchas veces tenias una maquina recien instalada y se iba a actualizarse a los repositorios default, por lo que igual te consumia ancho de banda asi tu no quisieras si es que te olvidabas de este pequeño detalle de los archivos del Yum
  • Manejo de una configuración total de tu 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 funal fué algo sencillo, que paso a detallarlo.

Requerimientos

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

Configuración

DHCP

Este es el primer paso, tu red debe ser por DHCP y asignando los IPs en forma automática, obviamente apuntando como unico servidor DNS a tu DNS propio como lo detallo 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 tu DNS como único DNS de consultas, todo lo que tu le pongas a tu DNS, va a hacer que tus 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. (
2008021300 ;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, en el httpd.conf le configuramos un par de dominios virtuales


ServerAdmin alex@linux.org.pe
DocumentRoot /home/repositorio
ServerName centos.cipher.com.pe
Options Indexes FollowSymLinks MultiViews
ErrorLog logs/centos.cipher.com.pe-error.log
CustomLog logs/centos.cipher.com.pe-access.log common



ServerAdmin alex@linux.org.pe
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

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

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

/home/repositorio
/home/repositorio/mirrorlist.centos.org

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

< ?php if ($_GET['release'] == 5) { $wrelease = "5.2"; } $wruta =""; $valor ="/".$wrelease."/".$_GET['repo']."/".$_GET['arch'].$wruta; header ("Content-Type: text/plain"); echo "http://centos.cipher.com.pe/centos".$valor; ?>

En donde con esto le estamos indicando que a cualquier petición que se haga, siempre apunte a directorios internos de tu repositorio, es mas, centos.cipher.com.pe lo tengo publicado como dominio interno, no resuelve desde la calle, y con eso me aseguro que nadie de afuera encuentre mi repositorio privado. Con esto nunca va a volver a salir cualquier CentOS de mi red a buscar algun repositorio externo.

Repositorio

Bueno, hasta aqui todo bien , pero nos olvidamos de ponerle contenido al repositorio. Siguiendo con esto, aqui les pongo mi script que hace que sincronice toda las noches con los repositorios oficiales. Puse una lista de repositorios por si es que alguno se pone lento, pero mi preferido es el de rsync.gtlib.gatech.edu que es el que mas velocidad de descarga me da.

En /etc/crontab ponen

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

Y el archivo actualizar /usr/local/bin/actualiza.sh es 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/5.2/updates/i386/RPMS/* /home/repositorio/centos/5.2/updates/i386/RPMS/
/usr/bin/createrepo /home/repositorio/centos/5.2/updates/i386/

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

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

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

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

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

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

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

Y listo, con esto van a tener un repositorio privado de CentOS en su LAN, totalmente transparente, usándose los mismos archivos default del Yum que vienen con el CentOS y sin tener problemas de línea dedicada y de actualizaciones múltiples. Yo solo lo dejo para las últimas versiones, pero si es que desean pueden conservar todas las versiones que quieran, solamente deben cambiar la info en el archivo PHP.

Espero algun comentario si es que lo prueban y si es que les funcionó tan bien como a mi.

Alex Celi

20 Responses to “Repositorio interno de actualizaciones totalmente transparente para CentOS”

  1. eduardo says:

    hola estoy probando tu método, me parece interesante. Como haría si quisiera trabajar con varias versiones de centos?

  2. eduardo says:

    Te comento que tuve problemas al reconocer el repositorio, hice un cambio. A continuación detallo:

  3. narf says:

    eduardo, tira el dato, acá tampoco funciona.

Leave a Reply