miércoles, 3 de agosto de 2011

Crear repositorios locales para CentOS

Para ahorrarnos ancho de banda es conveniente crear repositorios locales de nuestras distribuciones, principalmente de las actualizaciones bases. O por que no tener un espejo de los repositorios oficiales.

En este artículo intentaré darle una pincelada de un método valido para este propósito sin entrar en muchos detalles. Para automatizarlo deberíamos de crear scripts y lo agregamos al cron para que se ejecuten a la hora que nos convenga.

Para crear repositorios necesitaremos la herramienta createrepo
yum install createrepo yum-utils
El repositorio, para que puedan ser accesibles, debería estar disponible por red, http, ftp, etc. En este ejemplo lo haremos publico por http.
Instalamos Apache
yum install httpd
Configuramos Apache para que inicie automáticamente al iniciar el sistema y iniciamos
chkconfig httpd on
service httpd start


Preparamos nuestro repositorio. Yo acostumbro alojarlo en /home/repo/REPOSITORIO, de esta manera puedo crear un enlace simbolico /var/www/repo/REPOSITORIO y /var/ftp/pub/repo/REPOSITORIO que apunten al primero.
[danispiri@repo /]$ ll /var/www/repo/
total 0
lrwxrwxrwx 1 danispiri danispiri 16 oct 15  2010 adobe -> /home/repo/adobe
lrwxrwxrwx 1 danispiri danispiri 20 jul 21  2010 alldistro -> /home/repo/alldistro
lrwxrwxrwx 1 danispiri danispiri 20 jul 21  2010 al-server -> /home/repo/al-server
lrwxrwxrwx 1 danispiri danispiri 17 jul 21  2010 atrpms -> /home/repo/atrpms
lrwxrwxrwx 1 danispiri danispiri 17 jul 21  2010 centos -> /home/repo/centos
lrwxrwxrwx 1 danispiri danispiri 17 oct 15  2010 elrepo -> /home/repo/elrepo
lrwxrwxrwx 1 danispiri danispiri 15 jul 21  2010 epel -> /home/repo/epel
lrwxrwxrwx 1 danispiri danispiri 21 sep 14  2010 jpackage50 -> /home/repo/jpackage50
lrwxrwxrwx 1 danispiri danispiri 21 jul 21  2010 kbs-centos -> /home/repo/kbs-centos
lrwxrwxrwx 1 danispiri danispiri 17 sep 14  2010 pgdg84 -> /home/repo/pgdg84
lrwxrwxrwx 1 danispiri danispiri 19 jul 21  2010 rpmforge -> /home/repo/rpmforge
lrwxrwxrwx 1 danispiri danispiri 20 oct 15  2010 rpmfusion -> /home/repo/rpmfusion
A fin de ejemplo crearemos el repositorio centos que estará disponible por http
mkdir -p /home/repo/centos
mkdir /var/www/repo
ln -s /home/repo/centos /var/www/repo/centos
Creamos un directorio virtual en Apache para repo
touch /etc/httpd/conf.d/repo.conf
Editamos repo.conf de tal manera que quede como sigue:
Alias /repo /var/www/repo

<Directory /var/www/repo>
	Options Indexes FollowSymLinks
	AllowOverride All
	Order allow,deny
	Allow from all
</Directory>
Configuramos SELinux para nuestro directorio virtual
chcon -RLt httpd_sys_content_t /var/www/repo
Dependiendo del método que utilicemos para configurar nuestro firewall, debemos permitir el acceso al puerto 80 a nuestro servidor.
iptables -A INPUT -m tcp -p tcp --dport 80 -j ACCEPT
En cada cliente tendríamos que configurar los repositorios que estamos creando para que puedan acceder a él, esto lo podemos hacer modificando /etc/yum.conf, creando un nuevo fichero de configuración /etc/yum.repos.d/centos-local.repo o incluso modificando el mismo fichero /etc/yum.repos.d/CentOS-Base.repo

Por ejemplo creamos centos-local.repo
touch /etc/yum.repos.d/centos-local.repo
Lo editamos de tal manera que quede como sigue (cambie repo.danispiri.blogspot.com por su host o IP de su servidor):
[centos-local]
name=CentOS-$releasever - Local
baseurl=http://repo.danispiri.blogspot.com/repo/centos/$releasever/local/
enabled=1
gpgcheck=0
También deberá actualizar el servidor, por lo tanto sería conveniente que configure también con el fichero centos-local.repo

Ahora solo resta descargar los paquetes y construir el repositorio con createrepo.

Un método para mantener un repositorio mínimo de solo las actualizaciones y paquetes necesarios es tener instalado en el servidor la cantidad de paquetes necesarios, ir descargando las actualizaciones periódicamente, copiarlas al depósito y construirlas.

Para éste método necesitaremos el plugin para yum que permite solo descargar rpms sin instalarlos
yum  install yum-plugin-downloadonly
Este método, aunque nos ahorra mucho espacio, es solo adecuado en caso de que dispongamos de configuranciones estándar en todos los clientes, misma distribución, misma versión, misma arquitectura, mismos software. Aunque esto se puede remediar con algunos trucos que no veremos en esta ocación.

Un ejemplo de un script sencillo para CentOS sería:
#!/bin/bash
## http://danispiri.blogspot.com
releasever=`cat /etc/redhat-release | cut -d \  -f3 | cut -d . -f1`
if [ $releasever == release ] ; then
	releasever=`cat /etc/redhat-release | cut -d \  -f4 | cut -d . -f1`
fi
basearch=`uname -m`
repodir=/home/repo/centos/$releasever
## Descargamos actualizaciones
mkdir -p $repodir/local/RPMS
yum clean all
yum -y --skip-broken --downloadonly --downloaddir=$repodir/local/RPMS update
## Construimos el repositorio
createrepo --update $repodir/local
mkdir -p /var/www/repo
ln -ns /home/repo/centos /var/www/repo/centos
chcon -RLt httpd_sys_content_t /var/www/repo
yum clean all
yum -y --skip-broken update
Agregamos una tarea al cron para que se ejecute automáticamente. A este script lo podemos llamar repolocal.sh y colocarlo en /etc/cron.daily o mejor colocarlo en donde nos parezca mas convenientes y crear en /etc/cron.d un fichero por ejemplo sincronizar
touch /etc/cron.d/sincronizar
que contenga lo siguiente (suponiendo que llamamos repolocal.sh al script y lo colocamos en /home/repo/scripts):
SHELL=/bin/bash
PATH=/sbin:/bin:/usr/sbin:/usr/bin
MAILTO=danispiri

# Descargar
15  5  *  *  * root sh /home/repo/scripts/repolocal.sh
Cambiamos los permisos de repolocal.sh para que pueda ejecutarse
chmod +x /home/repo/scripts/repolocal.sh
Fijese que este método es básico pero funcional, mas adelante veremos como crear un espejo de los repositorios oficiales para las arquitecturas i386 y x86_64.

HOLA