Lokalne repozytorium dla YUMa
Infrastruktura serwerowa w mojej firmie w pewnym momencie zaczęła dość intensywnie rosnąć. W dodatku, wobec wszędobylskich portali i web-serwisów, znaczna część tych systemów działa pod kontrolą CentOSa (Apache wydaje mi się odrobinę bezpieczniejszy i mniej wymagający, niż IIS). Wszystko to wymaga okresowych „przeglądów” i instalowania aktualizacji (w moim przypadku głównie ze względu na bezpieczeństwo). Niby nie jest to jakoś specjalnie skomplikowane – wystarczy zalogować się na taką maszynę, uruchomić YUMa, pobrać nowe wersje pakietów i klepnąć „OK”. No właśnie, ale czy te wszystkie aktualizacje trzeba za każdym razem pobierać z Sieci? Otóż nie, i zmiana takiego stanu rzeczy nie jest nawet taka bardzo skomplikowana.
Można, na przykład, skorzystać z takiej instrukcji, ale dla mnie jest ona odrobinę za bardzo skomplikowana, poza tym nie przepadam za rsync’iem.
Alternatywny proces tworzenia własnego repozytorium pakietów w moim przypadku wyglądał tak:
Po pierwsze – w katalogu /mnt/md3 (bo akurat tutaj miałem trochę miejsca) utworzyłem odpowiednią strukturę katalogów:
[kbechler@sv ~]# tree /mnt/md3/mirror/centos/5.5 -L 2
/mnt/md3/mirror/centos/5.5
|-- addons
| |-- i386
| `-- x86_64
|-- centosplus
| |-- i386
| `-- x86_64
|-- contrib
| |-- i386
| `-- x86_64
|-- extras
| |-- i386
| `-- x86_64
|-- os
| |-- i386
| `-- x86_64
`-- updates
|-- i386
`-- x86_64
Po drugie – napisałem sobie prosty plik, o taki:
[kbechler@sv ~]$ cat /mnt/md3/mirror/centos55.lftp
open http://ftp-stud.fht-esslingen.de/pub/Mirrors/centos/5.5
lcd /home/www/html/centos/5.5
echo CENTOS_OS
mirror -e --verbose=3 --parallel=10 os/x86_64 os/x86_64
mirror -e --verbose=3 --parallel=10 os/i386 os/i386
echo CENTOS_ADDONS
mirror -e --verbose=3 --parallel=10 addons/x86_64 addons/x86_64
mirror -e --verbose=3 --parallel=10 addons/i386 addons/i386
echo CENTOS_EXTRAS
mirror -e --verbose=3 --parallel=10 extras/x86_64 extras/x86_64
mirror -e --verbose=3 --parallel=10 extras/i386 extras/i386
echo CENTOS_UPDATES
mirror -e --verbose=3 --parallel=10 updates/x86_64 updates/x86_64
mirror -e --verbose=3 --parallel=10 updates/i386 updates/i386
echo CENTOS_CENTOSPLUS
mirror -e --verbose=3 --parallel=10 centosplus/x86_64 centosplus/x86_64
mirror -e --verbose=3 --parallel=10 centosplus/i386 centosplus/i386
echo CENTOS_CONTRIB
mirror -e --verbose=3 --parallel=10 contrib/x86_64 contrib/x86_64
mirror -e --verbose=3 --parallel=10 contrib/i386 contrib/i386
exit
Po trzecie – w katalogu /etc/cron.daily utworzyłem skrypt, który wywołuje polecenie:
lftp -f /mnt/md3/mirror/centos55.lftp > /var/log/mirror_centos55.log
Po czwarte – skonfigurowałem Apache’a na ten maszynie tak, aby link „http://sv/centos” wskazywał na katalog /mnt/md5/mirror/centos.
Po piąte – poczekałem, aż skrypt z crona zrobi swoje i na lokalnym serwerze będę miał aktualną kopię wszystkich pakietów. Tutaj drobna uwaga: przy wolnym łączu do internetu trzeba albo sprytnie napisać skrypt do synchronizacji, albo uruchomić tą ostatnią „z palca”, a skrypt dopisać do crona po jej zakończeniu. W innym wypadku możemy się natknąć na race-condition, w którym kolejne wywołania „zazębią” się ze sobą (o ile pierwsza synchronizacja nie zakończy się w ciągu 24h).
Po szóste (i ostatnie) – poprosiłem wszystkie moje systemy, aby pobierały aktualizacje z nowo utworzonego repozytorium. Polegało to na tym, że wywaliłem standardową zawartość katalogu /etc/yum.repos.d i wrzuciłem tam poniższy plik:
[kbechler@sv ~]$ cat /etc/yum.repos.d/centos.repo
[base]
name=CentOS-$releasever - Base
baseurl=http://sv/centos/$releasever/os/$basearch/
gpgcheck=1
gpgkey=file:///etc/pki/rpm-gpg/RPM-GPG-KEY-CentOS-5
[updates]
name=CentOS-$releasever - Updates
baseurl=http://sv/centos/$releasever/updates/$basearch/
gpgcheck=1
gpgkey=file:///etc/pki/rpm-gpg/RPM-GPG-KEY-CentOS-5
[addons]
name=CentOS-$releasever - Addons
baseurl=http://sv/centos/$releasever/addons/$basearch/
gpgcheck=1
gpgkey=file:///etc/pki/rpm-gpg/RPM-GPG-KEY-CentOS-5
[extras]
name=CentOS-$releasever - Extras
baseurl=http://sv/centos/$releasever/extras/$basearch/
gpgcheck=1
gpgkey=file:///etc/pki/rpm-gpg/RPM-GPG-KEY-CentOS-5
#additional packages that extend functionality of existing packages
[centosplus]
name=CentOS-$releasever - Plus
baseurl=http://sv/centos/$releasever/centosplus/$basearch/
gpgcheck=1
enabled=0
gpgkey=file:///etc/pki/rpm-gpg/RPM-GPG-KEY-CentOS-5
#contrib - packages by Centos Users
[contrib]
name=CentOS-$releasever - Contrib
baseurl=http://sv/centos/$releasever/contrib/$basearch/
gpgcheck=1
enabled=0
gpgkey=file:///etc/pki/rpm-gpg/RPM-GPG-KEY-CentOS-5
I to tyle – od momentu wykonania tego powyżej, wszystkie moje maszyny instalują i aktualizują pakiety z lokalnego repozytorium. Dzięki temu zaoszczędziłem odrobinę ruchu (co akurat nie jest w moim przypadku specjalnie ważne), oraz uprościłem konfigurację samej sieci – większość z tych maszyn nie „wystaje” na zewnątrz i konfiguracja NATa stała się zbędna.