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.
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
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
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