суббота, 31 августа 2019 г.

Создание локального репозитария CentOS7 с синхронизацией через прокси сервер SQUID.

Иногда возникает необходимость развернуть внутри организации свой репозитарий для CentOS. Это, например, необходимо для настройки и обновлений ОС находящихся в защищенном сегменте сети. В моем случае был один момент, который частенько возникает в организациях, а именно синхронизация локального репозитария должна идти через прокси сервер SQUID
Давайте разбираться как это сделать.
Поискав в интернете, я нашел достаточно подробную инструкцию
В ней все описано достаточно подробно, но у меня задача. Синхронизация должна идти через прокси сервер SQUID.
Так как сервер находился за SQUID я настроил серврер репозитария по своей же статье. Ознакомиться можно ТУТ
Обновляем его

# yum update -y

Далее я оключил SELINUX. Знаю, что это неправильно 😋

#sed -i 's/^SELINUX=.*/SELINUX=disabled/g' /etc/selinux/config

Перезагрузим 

#reboot

Теперь настроим Web сервер. Использовать будем nginx

#yum install epel-release
#yum install nginx
#systemctl enable nginx
#systemctl start nginx

Открываем браузер вводим ip адрес сервера репозитария и видим страницу приветствия и понимаем, что nginx у нас работает.

Настраиваем репозитарий

#yum install createrepo yum-utils

Создаем каталоги репозитариев

#mkdir -p /usr/share/nginx/html/repos/7/{os,updates}/x86_64

* в данном примере будет создан каталог /usr/share/nginx/html/repos/7, а внутри него каталоги os (стандартный репозиторий для установка пакетов) и updates (обновления), в каждой из которых каталог x86_64 (для систем x64 архитектуры x86).

Теперь пришло время синхронизации репозитория. но синхронизация не запустится, потому что утилита rsync не будет сейчас работать через SQUID а будет пытаться напрямую скачать файлы.  Но для этого сначала нужно настроить SQUID.
Идем на сервер где у нас установлен SQUID и прописываем порты для rsync

#mcedit /etc/squid/squid.conf

Добавляем следующие строки

acl SSL_ports port 443 563 873  # 873 - for rsync
acl Safe_ports port 873         # for rsync

Теперь снова возвращаемся к серверу репозитария. Необходимо сделать так, что бы rsync работал через прокси. Необходимо дать команду 

#export RSYNC_PROXY=proxyhost:proxyport

Но тут необходимо понимать, что после выхода из терминала ничего работать не будет.
Для того что бы все заработало как надо необходимо

#mcedit /etc/environment

и добавить следующие строки

http_proxy="http://proxyhost:proxyport/"
https_proxy="https://proxyhost:proxyport/"
ftp_proxy="ftp://proxyhost:proxyport/"
no_proxy=".domain,server1,"

Теперь можно выполнить синхронизацию

#rsync -iavrt --delete --exclude='repo*' rsync://mirror.yandex.ru/centos/7/os/x86_64/ /usr/share/nginx/html/repos/7/os/x86_64/

Ждем. После окончания синхронизации синхронизируем Updates

#rsync -iavrt --delete --exclude='repo*' rsync://mirror.yandex.ru/centos/7/updates/x86_64/ /usr/share/nginx/html/repos/7/updates/x86_64/

Ждем окончания синхронизации
Создаем репозитории

#createrepo -v /usr/share/nginx/html/repos/7/os/x86_64
#createrepo -v /usr/share/nginx/html/repos/7/updates/x86_64

Теперь настроим nginx

#mcedit /etc/nginx/nginx.conf

Находим секцию 

server {

И дописываем туда

root   /usr/share/nginx/html;
        index  index.html index.htm;
        autoindex on;

У меня секция выглядит так

  server {
        listen       80 default_server;
        listen       [::]:80 default_server;
        server_name  _;
        root         /usr/share/nginx/html;
        index  index.html index.htm;
                autoindex on;

Перезапускаем nginx:

#systemctl restart nginx

Открываем браузер и переходим по адресу http://<IP-адрес сервера>/repos/7 — мы должны увидеть список os и updates. Походив по нему, мы найдем список скачанных пакетов.


Настройка клиента

Все что приводится ниже производится на машинах, которые должны обновляться от нашего репозитария.
Чтобы гарантировать, что все пакеты будут скачиваться с локального репозитория, отключаем имеющиеся:

#find /etc/yum.repos.d -type f -exec sed -i "s/enabled=1/enabled=0/g" {} \;

* в данном примере мы во всей файлах каталога /etc/yum.repos.d нашли и заменили enabled=1 на enabled=0.
* можно также поступить радикально и удалить репозитории командой \rm /etc/yum.repos.d/*

Создаем файл с настройкой репозитория:

№vi /etc/yum.repos.d/local.repo

[local]
name=Local Yum Repo
baseurl=http://iprepo/repos/$releasever/os/$basearch/
enabled=1
gpgcheck=0

[local-update]
name=Local Yum Repo for update packages
baseurl=http://iprepo/repos/$releasever/updates/$basearch/
enabled=1
gpgcheck=0

* где local — название репозитория; name — описание; baseurl — базовый адрес http, по которому нужно искать пакеты; enabled — указание на включение или отключение репозитория; gpgcheck — включить или отключить проверку GPG сигнатур для пакетов.

Также можно задать приоритет для каждого из репозиториев:

priority=1

* 1 — наивысший приоритет.

Готово. Можно выполнить установку.

Если в процессе обновления или установки мы получим ошибку [Errno 14] PYCURL ERROR 22, выполняем команду yum clean all. Подробнее в статье Ошибка CentOS: [Errno 14] PYCURL ERROR 22 - The requested URL returned error: 404.

Посмотреть список установленных пакетов и с какого репозитория они были скачаны можно командой:

#yum list installed


Обновление репозитория
Для поддержания списка пакетов в актуальном состоянии необходимо постоянно обновлять установочные файлы в репозиториях. Это можно делать вручную и/или автоматическом режиме.

Ручное обновление
Для обновления репозитория выполняем синхронизацию с источником пакетов (также, как мы делали начальную синхронизацию):

#rsync -iavrt --delete --exclude='repo*' rsync://mirror.yandex.ru/centos/7/os/x86_64/ /usr/share/nginx/html/repos/7/os/x86_64/

И обновляем служебную информацию:

#createrepo --update /usr/share/nginx/html/repos/7/os/x86_64

Аналогично, со всеми остальными репозиториями.

Автоматическое обновление
Его суть сводится к запуску скрипта в cron. Сначала создадим папку для хранения скриптов, затем сам скрипт:

#mkdir /scripts

#mcedit /scripts/repos_update.sh

Заполняем файл следующим содержимым

#!/bin/bash
PATH=/etc:/bin:/sbin:/usr/bin:/usr/sbin:/usr/local/bin:/usr/local/sbin

rsync -iavrt --delete --exclude='repo*' rsync://mirror.yandex.ru/centos/7/os/x86_64/ /usr/share/nginx/html/repos/7/os/x86_64/
createrepo --update /usr/share/nginx/html/repos/7/os/x86_64

rsync -iavrt --delete --exclude='repo*' rsync://mirror.yandex.ru/centos/7/updates/x86_64/ /usr/share/nginx/html/repos/7/updates/x86_64/
createrepo --update /usr/share/nginx/html/repos/7/updates/x86_64


Разрешаем запуск скрипта на выполнение:

#chmod +x /scripts/repos_update.sh

Добавляем задание в cron:

#crontab -e

0 1 * * * /scripts/repos_update.sh

* в данном примере мы запускаем наш скрипт каждый день в час ночи.

Разные релизы CentOS
В одном репозитории мы можем легко хранить пакеты для различных релизов операционной системы CentOS (и не только CentOS, но и PPA). Для этого создаем каталог под новый релиз, синхронизируем его с источником и создаем из него репозиторий, например:

#mkdir -p /usr/share/nginx/html/repos/6/{os,updates}/x86_64

* в данном примере предполагается использование репозитория для релиза 6.

Синхронизируем пакеты:

#rsync -iavrt --delete --exclude='repo*' rsync://mirror.yandex.ru/centos/6/os/x86_64/ /usr/share/nginx/html/repos/6/os/x86_64/

#rsync -iavrt --delete --exclude='repo*' rsync://mirror.yandex.ru/centos/6/updates/x86_64/ /usr/share/nginx/html/repos/6/updates/x86_64/

Создаем репозитории:

#createrepo -v /usr/share/nginx/html/repos/6/os/x86_64

#createrepo -v /usr/share/nginx/html/repos/6/updates/x86_64

Epel Repo
Для Epel репозитория схема добавления похожа, кроме метода синхронизации — синхронизация с yandex выполняется с помощью wget.

Создаем отдельную ветку каталога:

#mkdir -p /usr/share/nginx/html/repos/epel/7/x86_64

Синхронизируем пакеты:

#wget -r -nH -np -nc -R index.html* https://mirror.yandex.ru/epel/7/x86_64/ -P /usr/share/nginx/html/repos/

Создаем репозитории:

#createrepo -v /usr/share/nginx/html/repos/epel/7/x86_64

При настройке клиента создаем файл с настройкой репозитория:

#vi /etc/yum.repos.d/local-epel.repo

[local-epel]
name=Local Extra Packages for Enterprise Linux 7
baseurl=http://iprepo/epel/$releasever/$basearch/
enabled=1
gpgcheck=0

По такому же принципу мы можем добавить любой репозиторий, например, rpmforge, remi, nginx и другие.

Комментариев нет:

Отправить комментарий

При обновлении VCenter 6.7 до VCenter 7.0 ошибка Host not found

 Всем доброго времени суток! При обновлении VCenter 6.7 до версии 7.0 пришлось столкнуться со следующей ошибкой при обновлении , точнее в пр...