Написать эту статью меня заставили две вещи: во-первых, есть ощущение, что после статей типа "делаем debian-пакет на коленке", большинство хабравчан утвердятся во мнении, что debian-пакеты придумали извращенцы для извращенцев. Во-вторых, вышел zabbix 1.8 — замечательная система мониторинга, в которой, судя по новостям, наконец-то занялись проблемами юзабилити админского интерфейса.
Связывает два этих события то, что zabbix 1.8 пока нет в репозиториях убунты, а компилировать и ставить из исходников что-то на продакшн-серверах, это, конечно, недостойное джентльмена занятие. В общем, есть повод показать, как делаются debian-пакеты.
Итак, хе-хе, приступим :)
На вопрос dh_make, какого типа пакет мы хотим создать, нужно ответить «b» (cdbs). В результате будет создан шаблонный пакет, с кучей файлов в директории debian на все случаи жизни (большую часть мы потом удалим).
Создание пакетов — это все-таки немножко шаманство и магия. Дело в том, что более простые, чем zabbix, программы, уже на этом этапе можно заканчивать пакетировать. Т.е. если для установки программы нужно сделать только ./configure && make install, то все готово, можно собирать и ставить. Zabbix — несколько более сложный вариант, поэтому впереди еще несколько шагов:
Начнем с того, что откроем файл debian/control и укажем себя в качестве создателя пакета, а заодно перечислим пакеты, которые должны приехать на сервер вместе с установкой zabbix. Для этого нужно найти строку 'Depends' и добавить в ее конец следующее: «fping, adduser, apache2, php5, php5-mysql, php5-gd».
Обычно скрипт configure можно вызывать без параметров и он сгенерирует жизнеспособный конфиг, но для zabbix это не так — ему нужно отдельными опциями включать компиляцию серверной части и агента. В нашем случае это настраивается в файле debian/rules, добавим в его конец следующее:
Бинарные файлы попадут в каталоги /usr/bin и /usr/sbin сами собой, а php-интерфейс и конфиг-файлы нужно ставить вручную. Самый простой и наглядный способ это сделать — создать файл debian/install, и описать все в нем примерно так:
Кроме того, для нормальной работы заббиксу нужны еще и директории для хранения лог-файлов и локов. Создать их тоже просто — достаточно их перечислить в файле debian/dirs:
Теперь дело за инит-скриптом. В исходниках zabbix инит-скрипт есть (misc/init.d/debian/zabbix-server), но без обработки напильником он работать не будет. Поэтому лучше его заменить скриптом из убунты (вот отсюда), который нужно сохранить под именем debian/init (на конечной системе он будет называться /etc/init.d/zabbix — магия).
Чтобы настроить logrotate, нужно просто положить конфиг в нужное место:
Очень удобно, когда пакет с веб-интерфейсом сам ставит себе конфиг для апача:
Еще не все. Кто-то должен создать пользователя zabbix, прописать инит-скрипт в автозагрузку и поправить права. Проще всего это сделать в postinstall-скрипте, для этого нужно взять его шаблон:
И после строки 'configure)', но перед ';;' написать следующее:
Осталась одна деталь: при стандартных настройках PHP интерфейс заббикса не заведется, нужно править max_execution_time и еще несколько параметров. Если бы мы готовили пакет для домашнего сервера-торрентокачалки, то, конечно, проще было бы поправить php.ini напрямую. Но идеологически более правильно поместить эти настройки тоже в пакет. Сделать это можно так:
Теперь нужно поправить дефолтные конфиги, чтобы там были указаны нужные нам пути к логам и pid-файлам.
И, в общем-то, все. Можно собрать пакет с помощью команды debuild, поставить его с помощью dpkg -i <package.deb> и apt-get install -f.
Надеюсь, мне удалось продемонстрировать, что дебиан кроме всего прочего — удобная и продуманная среда для портирования приложений; создание нового пакета — вполне себе альтернатива установке программ, отсутствующих в репозитории, даже если речь идет про одну инсталляцию.
Если тема интересна, могу продолжить. На этот раз очень многое осталось за кадром — что такое dehelper-скрипты, и CDBS, как отладить зависимости пакета и почему pbuilder — один из моих любимых инструментов.
P.S. Если у вас есть свой open-source проект, то я могу помочь его пакетированием, обращайтесь.
P.P.S:Перенесите этот пост в какой-нибудь тематический блог, пожалуйста. Спасибо за карму! Перенес сам :)
UPD:: Несколько обновленный вариант статьи в моем блоге: alexey.sveshnikov.ru/blog/2010/03/29/zabbix-debianization.
Связывает два этих события то, что zabbix 1.8 пока нет в репозиториях убунты, а компилировать и ставить из исходников что-то на продакшн-серверах, это, конечно, недостойное джентльмена занятие. В общем, есть повод показать, как делаются debian-пакеты.
Итак, хе-хе, приступим :)
apt-get install dh-make devscripts cdbs libmysqlclient-dev libcurl4-gnutls-dev
wget sunet.dl.sourceforge.net/project/zabbix/ZABBIX%20Latest%20Stable/1.8/zabbix-1.8.tar.gz
tar zxvf zabbix-1.8.tar.gz
cd zabbix-1.8
dh_make --createorig
На вопрос dh_make, какого типа пакет мы хотим создать, нужно ответить «b» (cdbs). В результате будет создан шаблонный пакет, с кучей файлов в директории debian на все случаи жизни (большую часть мы потом удалим).
Создание пакетов — это все-таки немножко шаманство и магия. Дело в том, что более простые, чем zabbix, программы, уже на этом этапе можно заканчивать пакетировать. Т.е. если для установки программы нужно сделать только ./configure && make install, то все готово, можно собирать и ставить. Zabbix — несколько более сложный вариант, поэтому впереди еще несколько шагов:
Начнем с того, что откроем файл debian/control и укажем себя в качестве создателя пакета, а заодно перечислим пакеты, которые должны приехать на сервер вместе с установкой zabbix. Для этого нужно найти строку 'Depends' и добавить в ее конец следующее: «fping, adduser, apache2, php5, php5-mysql, php5-gd».
Обычно скрипт configure можно вызывать без параметров и он сгенерирует жизнеспособный конфиг, но для zabbix это не так — ему нужно отдельными опциями включать компиляцию серверной части и агента. В нашем случае это настраивается в файле debian/rules, добавим в его конец следующее:
DEB_CONFIGURE_USER_FLAGS := --enable-server --with-mysql --with-libcurl
Бинарные файлы попадут в каталоги /usr/bin и /usr/sbin сами собой, а php-интерфейс и конфиг-файлы нужно ставить вручную. Самый простой и наглядный способ это сделать — создать файл debian/install, и описать все в нем примерно так:
frontends/php/* usr/share/zabbix/
misc/conf/zabbix_server.conf etc/zabbix
Кроме того, для нормальной работы заббиксу нужны еще и директории для хранения лог-файлов и локов. Создать их тоже просто — достаточно их перечислить в файле debian/dirs:
/var/log/zabbix-server
/var/run/zabbix-server
Теперь дело за инит-скриптом. В исходниках zabbix инит-скрипт есть (misc/init.d/debian/zabbix-server), но без обработки напильником он работать не будет. Поэтому лучше его заменить скриптом из убунты (вот отсюда), который нужно сохранить под именем debian/init (на конечной системе он будет называться /etc/init.d/zabbix — магия).
Чтобы настроить logrotate, нужно просто положить конфиг в нужное место:
cat > debian/logrotate
/var/log/zabbix-server/zabbix_server.log {
daily
rotate 7
compress
missingok
notifempty
create 0640 zabbix zabbix
sharedscripts
}
^D
Очень удобно, когда пакет с веб-интерфейсом сам ставит себе конфиг для апача:
mkdir misc/apache2-vhosts
cat > misc/apache2-vhosts/zabbix
<VirtualHost *>
ServerName zabbix.example.com
ServerAdmin admin@example.com
DocumentRoot /usr/share/zabbix
CustomLog /var/log/apache2/zabbix_access.log combined
ErrorLog /var/log/apache2/zabbix_error_log
</VirtualHost>
^D
echo "misc/apache2-vhosts/zabbix etc/apache2/sites-available" >> debian/install
Еще не все. Кто-то должен создать пользователя zabbix, прописать инит-скрипт в автозагрузку и поправить права. Проще всего это сделать в postinstall-скрипте, для этого нужно взять его шаблон:
mv debian/postinst.ex debian/postinst
vim debian/postinst
И после строки '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-server defaults
# Включить виртуалхост:
a2ensite zabbix
invoke-rc.d apache2 reload
Осталась одна деталь: при стандартных настройках PHP интерфейс заббикса не заведется, нужно править max_execution_time и еще несколько параметров. Если бы мы готовили пакет для домашнего сервера-торрентокачалки, то, конечно, проще было бы поправить php.ini напрямую. Но идеологически более правильно поместить эти настройки тоже в пакет. Сделать это можно так:
mkdir misc/php.conf
cat > misc/php.conf/zabbix.ini
post_max_size = 16M
max_execution_time = 300
mbstring.func_overload = 2
^D
echo "misc/php.conf/zabbix.ini etc/php5/conf.d" >> debian/install
Теперь нужно поправить дефолтные конфиги, чтобы там были указаны нужные нам пути к логам и pid-файлам.
И, в общем-то, все. Можно собрать пакет с помощью команды debuild, поставить его с помощью dpkg -i <package.deb> и apt-get install -f.
Надеюсь, мне удалось продемонстрировать, что дебиан кроме всего прочего — удобная и продуманная среда для портирования приложений; создание нового пакета — вполне себе альтернатива установке программ, отсутствующих в репозитории, даже если речь идет про одну инсталляцию.
Если тема интересна, могу продолжить. На этот раз очень многое осталось за кадром — что такое dehelper-скрипты, и CDBS, как отладить зависимости пакета и почему pbuilder — один из моих любимых инструментов.
P.S. Если у вас есть свой open-source проект, то я могу помочь его пакетированием, обращайтесь.
P.P.S:
UPD:: Несколько обновленный вариант статьи в моем блоге: alexey.sveshnikov.ru/blog/2010/03/29/zabbix-debianization.