среда, 21 января 2015 г.

Развёртывание своего YUM-репозитория

Мотивация

Для управления набором ПО в диспетчерском центре, который должен быть отключен от Internet, предлагается развернуть свой YUM-репозиторий. Программное обеспечение, необходимое для организации работы диспетчерского центра хранится в этом репозитории в виде rpm-пакетов.

Плюсы данного подхода видятся следующие:

  • легко отслеживать версию установленного ПО ( от разработчиков не требуется встраивать механизм поддержки версий в само ПО - версия в обязательном порядке указывается для RPM-пакета ).
  • легко обновлять ПО до новой версии ( делается одной командой с клиентской машины, на которую можно зайти удалённо по ssh ).
  • легко откатить ПО к старой версии, если с обновлённой версией заметны проблемы.
  • легко устанавливать ПО на ЗИП-машину, в соответствии с той ролью, для которой её настраивают.

Развёртывание

Предполагается, что компьютер, на котором организуется репозиторий, отключен от сети Internet, и все необходимые нам rpm-пакеты имеются на сменном носителе, подключенном к папке /media/disk.

Доступ к репозиторию осуществляется либо по http, либо ftp протоколу с анонимным доступом. Ниже будет рассмотрен способ с доступом по http протоколу. Соответственно будет кратко рассмотрена установка и настройка httpd ( Web сервер Apache ), в объёме, необходимом для работоспособности локального репозитория.

Установка httpd

[root@grinvb ~]# cd /media/disk
[root@grinvb disk]# yum install httpd-2.2.15-39.0.1.el6.i686.rpm httpd-tools-2.2.15-39.0.1.el6.i686.rpm openssl-1.0.1e-30.el6_6.4.i686.rpm
Обращаю ваше внимание, что при установке пакета из rpm-файла, а не из репозитория, необходимо указать полное имя файла. В примере выше путь к файлу не указан, т.к. мы перешли в директорию, где расположен файл ( cd /media/disk ).

Корневая директория для httpd записана в файле /etc/httpd/conf/httpd.conf в параметре DocumentRoot.
[root@grinvb disk]# cat /etc/httpd/conf/httpd.conf | grep "^DocumentRoot"
DocumentRoot "/var/www/html"

Как видно из вывода команды, корневая директория: /var/www/html.
Эта директория будет использована в описании создания репозитория.

Добавляем сервис в автозагрузку
[root@grinvb disk]# chkconfig --add httpd
[root@grinvb disk]# chkconfig --level 3 httpd on
[root@grinvb disk]# chkconfig --level 5 httpd on

Запустим сервис httpd
[root@grinvb disk]# service httpd start

По умолчанию httpd "слушает" подключения на 80 порт с любого IP адреса. Пропишем в iptables доступ из вне к этому порту.
[root@grinvb disk]# iptables -I INPUT -p tcp -m tcp --dport 80 -j ACCEPT

Также добавим эту запись в /etc/rc.local, что бы разрешение осталось после перезагрузки системы.
[root@grinvb disk]# echo "iptables -I INPUT -p tcp -m tcp --dport 80 -j ACCEPT" >> /etc/rc.local

Для проверки работоспособности httpd рекомендуется в браузере другого компьютера, в данной локальной сети набрать IP адрес данного компьютера. Мы должны увидеть картинку наподобие нижеприведенной.

Создание репозитория

Нам потребуется установить пакеты: createrepo, python-deltarpm, deltarpm.
[root@grinvb ~]# cd /media/disk
[root@grinvb disk]# yum install createrepo-0.9.9-22.el6.noarch.rpm python-deltarpm-3.5-0.5.20090913git.el6.i686.rpm deltarpm-3.5-0.5.20090913git.el6.i686.rpm

Создадим папку репозитория (repo), внутри корневой папки httpd.
[root@grinvb disk]# mkdir /var/www/html/repo

Далее копируем в данную директорию rpm-файлы, которые будет предоставлять наш репозиторий. После того как файлы скопированы, необходимо выполнить команду createrepo, входным параметром для которой, будет папка со скопированными rpm-файлами.
[root@grinvb disk]# createrepo /var/www/html/repo

В дальнейшем, при добавлении/изменении/удалении пакетов из репозитория надо будет заново выполнять команду createrepo. А на клиентах, что бы они видели изменения в репозитории, надо будет выполнять команду yum clean all. Эти операции можно автоматизировать через cron - добавив туда соответствующие записи.

Для упрощения подключения клиентов к нашему репозиторию, создадим файл /var/www/html/repo/local.repo и заполним его следующим текстом.

[local]
name=Local YUM repository
baseurl=http://192.168.0.198/repo
enabled=1
gpgcheck=0

IP адрес 192.168.0.198 следует заменить на IP адрес машины, на которой расположен локальный репозиторий. Соответственно этот адрес должен быть статичным. Также вместо адреса можно ввести доменное имя, если в локальной сети настроен dns-сервер. Детальное объяснение параметров можно найти тут. Проверку подписи мы отключили, для упрощения. Это менее безопасно, особенно если в репозиторий добавляются стронние пакеты. Для включении проверки потребуется:
  1. создать gpg-ключ
  2. подписывать/переподписывать пакеты, помещённые в данный репозиторий, этим ключом.
  3. выложить в общедоступное место открытую часть ключа.
  4. указать в данном файле дополнительным параметром gpgkey путь к открытой части ключа.
Указанные выше шаги требуют отдельного программного обеспечения и отдельного, более детального объяснения. Поэтому тут они описываться не будут.

Подключение к репозиторию

Описанные в данном разделе действия выполняются на клиентской машине ( которая будет подключена к репозиторию ).
Необходимо скопировать файл local.repo с локального репозитория на клиентскую машину.
Проще всего это сделать так:

[root@grinvb ~] curl http://192.168.0.198/repo/local.repo >> /etc/yum.repos.d/local.repo
[root@grinvb ~] yum clean all

Всё, репозиторий подключен!

Эксплуатация

Добавление, и замена пакетов осуществляются локальным копированием rpm-файла в папку репозитория ( в нашем примере /var/www/html/repo ). При необходимости удалить пакет из репозитория, его нужно просто удалить из этой папки.
Для того, что бы клиенты могли узнать об изменениях в репозитории, необходимо заново выполниться команду createrepo <path_to_repository>. Пользователь, который будет выполнять эту команду, должен иметь права на запись в директорию репозитория. В нашем примере это должен делать root.
[root@grinvb ~] createrepo /var/www/html/repo

На клиентах, для того, что бы увидеть изменения в репозитории, необходимо выполнить команду yum clean all ( тоже из под root-a )
[root@grinvb ~] yum clean all

Примечания:

  • Как видно из статьи, для развёртывание локального репозитория на Oracle Linux Server 6.4 потребуется предварительно скачать несколько rpm-пакетов. Для web-сервера Apache: httpd, httpd-tools, openssl. Для создания репозитория: createrepo, python-deltarpm, deltarpm. Данные пакеты можно скачать из официального репозитория при помощи yumdownloader.
  • Если при установке пакета из локального репозитория, в лог выводится ошибка 403, значит на машине репозитория у пользователя, из-под которого работает httpd, нет прав на чтение данного файла. Следует, на машине репозитория, разрешить данному пользователю чтение данного файла, а после этого заново сделать createrepo /var/www/html/repo.
  • Все действия, в данном примере  выполняются из под пользователя root. Это сделано для упрощения. С точки зрения безопасности это не верно. Правильнее будет сделать владельцем папки /var/www/html/repo непривилегированного пользователя, и заливать туда rpm-пакеты из-под него. Соответственно другие пользователи должны иметь право заходить в данную папку и читать файлы в ней (права доступа 755 для папки /var/www/html/repo, и 644 для для файлов в ней, за исключением создаваемой папки /var/www/html/repo/repodata ). 
  • Для добавления репозитория, можно использовать команду yum-config-manager --add-repo, но при проверке примера она выдала ошибку, подробнее эта ошибка yum-а описана тут. Поэтому использовал более надёжный способ, описанный в примере.
  • Список включенных репозиториев выдаёт команда yum repolist. Для отключения Internet-репозиториев можно использовать команду yum-config-manger --disable <reponame>. Например: yum-config-manager --disable ol6_latest. Это даст более быстрое выполнение операций, т.к. yum не будет пытаться опрашивать недоступные ему Internet-репозитории.
  • Все указанные примеры тестировались на Oracle Linux Server 6.4 ( которые были запущены в Virtual Box ).





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

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