Debian-пакеты с человеческим лицом на примере Zabbix 1.9
Кросс-пост с хабрахабра, в котором я описываю пример сборки debian-пакета с использованием CDBS.
UPD от 8 января 2012 года: статью переписал примерно наполовину. Сделал ее понятнее и актуальнее. Теперь в ней идет речь про Zabbix 1.9.8 и Ubuntu 11.10
Написать эту статью меня заставили две вещи. Во-первых, возникла необходимость поставить Zabbix на сервере, работающем под ubuntu. Заббикс – прекрасная система мониторинга, единственный значительный минус которой в моих глазах – это катастрофически неудобный интерфейс. Впрочем, от версии к версии он становится все менее ужасным, поэтому я всегда ставлю не стабильную версию, а beta или RC.
Во-вторых, появилось стойкое ощущение, что после статей вида “делаем debian-пакет на коленке”, большинство хабражителей утвердятся во мнении, что debian-пакеты придумали извращенцы для извращенцев.
Связывает два этих события то, что zabbix 1.9 пока нет в репозиториях убунты, и в ближайшее время не появится, а делать configure && make && make install на продакшн-серверах, это, конечно, недостойное джентльмена занятие. В общем, появился хороший повод продемонстрировать, что debian-пакеты – это не страшно.
Итак, приступим:
1. Инициализация
apt-get install dh-make devscripts cdbs libmysqlclient-dev libcurl4-gnutls-dev
wget http://downloads.sourceforge.net/project/zabbix/ZABBIX%20Latest%20Development/1.9.8/zabbix-1.9.8.tar.gz
tar zxvf zabbix-1.9.8.tar.gz
cd zabbix-1.9.8
dh_make -f ../zabbix-1.9.8.tar.gz --rulesformat cdbs --single
В результате будет создана дирекория zabbix-1.9.8/debian, с кучкой файлов внутри. Большинство из них нам не понадобится, и мы их удалим в конце, так что не пугайтесь :). Ключевую роль среди них играют 3-4 файла, ими мы и займемся.
Между делом, если бы мы пакетировали не zabbix, а более простую программу, которая обычно ставится с помощью ./configure; make; make install, то на этом создание пакета заканчивается. Осталось бы только собрать и установить пакет.
Но мы продолжим. Здесь и дальше я предполагаю, что вы находитесь в дирекории zabbix-1.9.8 (не в zabbix-1.9.8/debian).
2. Метаданные пакета.
Откроем файл debian/control и пропишем себя, любимого, в качестве создателя пакета, и укажем, какие пакеты должны приехать на сервер вместе с установкой zabbix. Для этого нужно найти строку ‘Depends’ (не путать с Build-Depends) и добавить в ее конец следующее: “fping, adduser, apache2, php5, php5-mysql, php5-gd”.
3. Выбор опций скрипта configure.
Обычно скрипт configure можно вызывать без параметров и он сгенерирует жизнеспособный конфиг, но для zabbix это не так – нужно отдельными опциями включать компиляцию серверной части и агента. Так как агент из репозитория ubuntu меня полностью устраивает, ограничимся сборкой только сервера. Для этого нужно дописать в конец файла debian/rules следующую строку:
DEB_CONFIGURE_USER_FLAGS := --enable-server --with-mysql --with-libcurl
4. Добавление файлов интерфейса в пакет.
Сборка пакета осуществляется следующим образом: создается временная директория (debian/имя_пакета), в которой в несколько этапов формируется его содержимое. Затем эта директория упаковывается в архив, добавляются метаданные, и все – пакет готов. Это очень грубое, но пока достаточное описание процесса. Бинарные файлы попадут в директорию debian/zabbix/usr/sbin сами собой (CDBS запустит команду make install DESTDIR=debian/zabbix), а про файлы php-интерфейса CDBS ничего не знает, поэтому нам придется указать на них самостоятельно. Для этого создадим файл debian/install вот с таким содержимым:
frontends/php/* usr/share/zabbix/
conf/zabbix_server.conf etc/zabbix
5. Создание пустых директорий.
Кроме того, для нормальной работы заббиксу нужны еще и директории для лог-файлов и локов. Они тоже являются частью пакета, поэтому создать их нужно прямо в той временной директории. Стандартный способ создания пустых директорий – перечисление их в файле debian/dirs:
/var/log/zabbix-server
/var/run/zabbix-server
6. Инит-скрипт.
В комплекте с заббиксом идет инит-сктипт (misc/init.d/debian/zabbix-server), но без обработки напильником он работать не будет. Поэтому лучше его заменить скриптом из убунты, который нужно сохранить под именем debian/init:
wget -O debian/init 'http://bazaar.launchpad.net/~ubuntu-branches/ubuntu/oneiric/zabbix/oneiric/download/head:/zabbixservermysql.za-20090719032443-40a177i6799u0z76-876/zabbix-server-mysql.zabbix-server.init'
7. Logrotate.
Мы же труЪ-админы, а не халтурщики, поэтому создаем вот такой файл debian/logrotate:
/var/log/zabbix-server/zabbix_server.log {
daily
rotate 7
compress
missingok
notifempty
create 0640 zabbix zabbix
sharedscripts
}
О том, каким образом этот конфиг попадет в нужное место после установки пакета, думать не нужно :)
8*. Конфигурирование Apache, PHP и всего прочего
Это необязательный шаг, и не всегда он уместен, хотя именно тут раскрываются все плюсы пакетирования софта для себя – можно позволить себе роскошь создавать пакеты, которые после установки не требуют никаких ручных действий.
Итак, сконфигурируем веб-сервер:
mkdir misc/apache2-vhosts
cat > misc/apache2-vhosts/zabbix
ServerName zabbix
ServerAdmin admin@example.com
DocumentRoot /usr/share/zabbix
CustomLog /var/log/apache2/zabbix_access.log combined
ErrorLog /var/log/apache2/zabbix_error_log
^D
echo "misc/apache2-vhosts/zabbix etc/apache2/sites-available" >> debian/install
Затем займемся PHP:
mkdir misc/php.conf.d
cat > misc/php.conf.d/zabbix.ini
post_max_size = 16M
max_execution_time = 300
mbstring.func_overload = 2
max_input_time = 300
date.timezone = 'Europe/Moscow'
^D
echo "misc/php.conf.d/zabbix.ini etc/php5/apache2/conf.d" >> debian/install
И напоследок исправим в conf/zabbix_server.conf путь к лог-файлу (vim conf/zabbix_server.conf +39). Нужное нам значение: /var/log/zabbix-server/zabbix_server.log.
Можно подумать, что это было довольно бездумное решение – модифицировать исходный код пакета, поскольку это усложняет повторение процесса для следующей версии заббикса – нужно будет обязательно совершить эти правки еще раз.
К счастью, за нас об этом уже позаботились: после сборки пакета все внесенныые нами изменения (за пределами директории debian – т.е. в исходном коде софта), магическим образом появятся в директории debian/patches в виде патча. Поэтому все, что мы делаем с пакетом фактически сохраняется в директории debian.
9. Ручное вмешательство.
Иногда недостаточно просто разложить файлики по файловой системе, чтобы настроить среду для исполнения программы. В таких случаях на помощь приходят preinst, postinst, prerm и postrm скрипты, которые выполняются уже на сервере, куда пакет устанавливается. Названия у них вполне понятные, пояcнить нужно только то, что ‘inst’, и ‘rm’ – это фактическая распаковка или удаление содежимого пакета (все той же временной директории debian/zabbix, в нашем случае), кроме того – каждый из этих скриптов может вызываться с разными аргументами в зависимости от ситуации. Нам интересен скрипт postinst, вызывающийся с аргументом configure – нужное место скрипта можно легко найти в шаблоне postinst.ex. Приступим:
cd debian
mv postinst.ex postinst
vim postinst
Правим секцию configure:
...
configure)
# Создадим пользователя
useradd zabbix || echo "User zabbix was not added"
# Установим права на рабочие директории
chown zabbix:zabbix /var/log/zabbix-server /var/run/zabbix-server
# В этой директории веб-интерфейс пытается сохранить конфиг-файл, предоставим ему на это права:
chown www-data /usr/share/zabbix/conf
chmod 775 /usr/share/zabbix/conf
# Настроим автозапуск сервера:
update-rc.d zabbix defaults
# Включим новый virtualhost и перезапустим апач:
a2ensite zabbix
invoke-rc.d apache2 reload
;;
abort-upgrade|abort-remove|abort-deconfigure)
11*. Удаление ненужных шаблонов
В директории debian полно шаблонных конфигов и скриптов, которые нам на этот раз не пригодились:
rm debian/*.{ex,EX} debian/README.*
12. Сборка и установка.
Финишная прямая: запускаем сборку пакета командой debuild и, пропустив ругань на отсутствие электронной подписи мимо ушей, устанавливаем его командами:
dpkg -i ../package_name.deb
apt-get install -f
Это не очень красивый способ устанавливать пакет, но зато самый простой. Первая команда завершится с ошибкой, потому что dpkg не умеет самостоятельно устанавливать зависимости пакета. В результате пакет в системе останется, но будет в состоянии ‘broken’. Вторая команда все эти ошибки исправит. В случае, если все зависимости на месте, dpkg -i отработает без ошибок, и нужды во второй команде нет.
В завершении всего, можно выполнить команду debclean, чтобы удалить с диска все объектные файлы и временную директорию.
13*. Вышла новая версия Zabbix!
Распаковываем исходники, копируем директорию debian, выполняем инструкцию заново, начиная с 12-го шага.

