Jul 20, 2009

Repositorio local de paquetes RPM por HTTP

Muchas veces puede ser necesario instalar en nuestra red un repositorio local de paquetes, ya que si por ejemplo se tienen muchas máquinas y surge una actualización, todos los equipos realizarán la misma operación (descargar la actualización de Internet) consumiendo ancho de banda para la empresa.

Otro de los motivos para instalar un repositorio local es la rapidez, ya que al encontrarse el repositorio dentro de la propia LAN, el proceso de descarga e instalación será mucho más rápido que si se trabaja sobre un servidor remoto.

Y por último, también se gana en seguridad, ya que sólo una de las máquinas (la que contenga el repositorio local) será la que tenga que tener acceso a Internet para descargar las actualizaciones, evitando de esta forma que el resto de equipos (susceptibles de instalar paquetes) tengan que salir a Internet.

Las pruebas se van a hacer en una CentOS 5.3, y para ello se va a crear un repositorio local para esta misma distribución de 64 bits, el cual será ofrecido al resto de máquinas de la LAN a través de un servidor Apache.

Lo primero que vamos a hacer es crear la estructura de directorios dentro del servidor que hará las labores de repositorio (centos01, con dirección IP 192.168.1.10).
[root@centos01 ~]# mkdir -p /var/www/mirror/CentOS/5.3/os/x86_64/CentOS

[root@centos01 ~]# mkdir -p /var/www/mirror/CentOS/5.3/updates/x86_64/RPMS

El directorio os lo utilizaremos para almacenar los paquetes base del sistema operativo, es decir, los que vienen nada más liberarse la distribución.

Si se tiene habilitado SELinux, habrá que modificar las listas de control de acceso (ACLs) de los contextos de seguridad del directorio raíz.
[root@centos01 ~]# chcon -R -u system_u /var/www/mirror/

[root@centos01 ~]# chcon -R -t httpd_sys_content_t /var/www/mirror/

Y a nivel de firewall, habrá que añadir una regla para abrir el puerto 80 (HTTP).
[root@centos01 ~]# cat /etc/sysconfig/iptables
*filter
:INPUT ACCEPT [0:0]
:FORWARD ACCEPT [0:0]
:OUTPUT ACCEPT [0:0]
:RH-Firewall-1-INPUT - [0:0]
-A INPUT -j RH-Firewall-1-INPUT
-A FORWARD -j RH-Firewall-1-INPUT
-A RH-Firewall-1-INPUT -i lo -j ACCEPT
-A RH-Firewall-1-INPUT -m state --state ESTABLISHED,RELATED -j ACCEPT
-A RH-Firewall-1-INPUT -p tcp --dport ssh -j ACCEPT
-A RH-Firewall-1-INPUT -p tcp --dport http -j ACCEPT
-A RH-Firewall-1-INPUT -p icmp -j ACCEPT
-A RH-Firewall-1-INPUT -j LOG
-A RH-Firewall-1-INPUT -j REJECT
COMMIT

El contenido del directorio os no cambiará nunca, así que lo que haremos será copiar en él los paquetes base desde un DVD.
[root@centos01 ~]# cp /media/CentOS_5.3_Final/CentOS/* /var/www/mirror/CentOS/5.3/os/x86_64/CentOS

Si se quiere comprobar la firma de los paquetes, ubicaremos la clave GPG en el directorio x86_64.
[root@centos01 ~]# ls /var/www/mirror/CentOS/5.3/os/x86_64/
RPM-GPG-KEY-CentOS-5 CentOS

A continuación tendremos que crear el directorio repodata asociado a dicho contenido base, el cual contendrá ficheros XML encargados de indexar los paquetes. Para ello necesitaremos tener instalado el paquete createrepo.
[root@centos01 ~]# yum install createrepo

[root@centos01 ~]# createrepo /var/www/mirror/CentOS/5.3/os/x86_64/

Las actualizaciones que vaya publicando CentOS las ubicaremos dentro del directorio updates. Este contenido deberá estar sincronizado con alguno de los repositorios de CentOS situados en Internet y que sean compatibles con rsync, ya que esta herramienta la utilizaremos para realizar dicha sincronización de forma periódica (definiremos una tarea en el cron para que se ejecute por ejemplo todos los días a la 01:05h - update_repo.sh).
[root@centos01 ~]# cat /etc/crontab
...
5 1 * * * /root/update_repo.sh

[root@centos01 ~]# cat /root/update_repo.sh
#!/bin/bash
rsync -at --delete rsync://mirrors.kernel.org/centos/5.3/updates/x86_64/RPMS/ /var/www/mirror/CentOS/5.3/updates/x86_64/RPMS/

if [ $(find /var/www/mirror/CentOS/5.3/updates/x86_64/RPMS/ -cmin -60 | wc -l) -gt 0 ]; then
createrepo /var/www/mirror/CentOS/5.3/updates/x86_64/
fi

[root@centos01 ~]# chmod +x /root/update_repo.sh

El script anterior lo que hace es sincronizar las actualizaciones disponibles para CentOS 5.3 en kernel.org, con nuestro directorio local, descargando únicamente los paquetes que hayan sido incorporados o modificados. A través de la línea if se comprobará si realmente ha habido alguna descarga, y en caso afirmativo, se volverá a generar nuevamente el directorio createrepo.

El siguiente paso será el de definir un virtual host para ofrecer ese contenido. También habrá que reiniciar Apache.
[root@centos01 ~]# cat /etc/httpd/conf.d/updates.conf
NameVirtualHost 192.168.1.10:80
<VirtualHost 192.168.1.10:80>
ServerName centos01
DocumentRoot /var/www/mirror
ErrorLog logs/updates-error_log
CustomLog logs/updates-acces_log combined
<Directory /var/www/mirror>
Options Indexes Includes
</Directory>
</VirtualHost>

[root@centos01 ~]# service httpd restart

Y ya por último, habrá que crear un fichero .repo en cada una de las máquinas que vayan a emplear el repositorio local. Para ello haremos una copia de un archivo ya existente (con el objetivo de salvaguardar los contextos de SELinux), lo borraremos y lo editaremos.
[root@centos02 ~]# cp /etc/yum.repos.d/CentOS-Base.repo /etc/yum.repos.d/CentOS-Local.repo

[root@centos02 ~]# >/etc/yum.repos.d/CentOS-Local.repo

[root@centos02 ~]# vim /etc/yum.repos.d/CentOS-Local.repo
[base-local]
name=CentOS-$releasever - Base Local
baseurl=http://192.168.1.10/CentOS/5.3/os/$basearch/
enabled=1
gpgcheck=1
gpgkey=http://192.168.1.10/CentOS/5.3/os/$basearch/RPM-GPG-KEY-CentOS-5

[update-local]
name=CentOS-$releasever - Updates Local
baseurl=http://192.168.1.10/CentOS/5.3/updates/$basearch/
enabled=1
gpgcheck=1
gpgkey=http://192.168.1.10/CentOS/5.3/os/$basearch/RPM-GPG-KEY-CentOS-5

No comments:

Post a Comment