Первый ингредиент - библиотека zlib, написанная двумя программистами- Jean-loup Gailly и Mark Adler. Она проектировалась как API общего назначения для сжатия данных без потерь. Как ни странно, но в нашем проекте она будет использоваться по своему прямому назначению, то есть для сжатия изображений. Берем новейшую версию http://www.gzip.org/zlib. На момент написания это была весрия 1.1.4. Распаковываем и компилируем.
# tar zvxf zlib-1.1.4.tar.gz
# cd zlib-1.1.4
# ./configure
# make test
# make install
Как Вы могли бы предположить, LibPng служит для создания изображений в формате PNG. Я использовал версию 1.2.5. Взять ее можно тут:
Собирается LibPng довольно-таки странным и нестандартным путем.
# tar zxvf libpng-1.2.5.tar.gz
# cd libpng-1.2.5
Ориентируясь на тип операционной системы, из директории scripts выбираем нужный нам makefile и копируем его в коневую директорию с исходными файлами. Для нашего случая исходный файл называется makefile.freebsd.
# cp ./scripts/makefile.freebsd Makefile
Затем создаем директорию zlib и кладем в нее из дистрибутива zlib все файлы с расширением *.h
# mkdir zlib
Вот теперь можно проводить компилляцию. Что мы с радость выполняем.
# make all
# make test
В результате на экране вы должны увидеть что-то вроде этого:
Testing pngtest.png:
Pass 0: rwrwrwrwrwrwrwrwrw
Pass 1: rwrwrwrwrwrwrwrwrw
Pass 2: rwrwrwrwrwrwrwrw
Pass 3: rwrwrwrwrwrwrwrwrwrwrwrwrwrwrwrwrwrw
Pass 4: rwrwrwrwrwrwrwrwrwrwrwrwrwrwrwrwrwrw
Pass 5: rwrwrwrwrwrwrwrwrwrwrwrwrwrwrwrwrwrwrwrwrwrwrwrwrwrwrwrwrwrwrwrwrwrw
Pass 6: rwrwrwrwrwrwrwrwrwrwrwrwrwrwrwrwrwrwrwrwrwrwrwrwrwrwrwrwrwrwrwrwrwrwrw
PASS (9782 zero samples)
Filter 0 was used 21 times
Filter 1 was used 15 times
Filter 2 was used 52 times
Filter 3 was used 10 times
Filter 4 was used 33 times
tIME = 7 Jun 1996 17:58:08 +0000
Current memory allocation: 0 bytes
Maximum memory allocation: 337346 bytes
Total memory allocation: 1023516 bytes
Number of allocations: 198
libpng passes test
Создаем директорию /usr/local/include/libpng/
# mkdir /usr/local/include/libpng
И наконец пришло время инсталляции. Тут уж все должно пройти легко и просто.
# make install
Теперь берем по адресу http://www.ijg.org/files/ библиотеку jpeg версии 6b. Я надеюсь, самые догадливые читатели уже поняли, что она понадобится нам для создания изображений в формате jpeg. Поверив моим заявлениям о том, что процедура установки довольно проста, начнем ее выполнение.
# tar zxvf jpegsrcv6b.tar.gz
# cd jpeg-6b
# ./configure
# make
После тестовой сборки должны увидеть такую картину:
# make test
rm -f testout*
./djpeg -dct int -ppm -outfile testout.ppm ./testorig.jpg
./djpeg -dct int -bmp -colors 256 -outfile testout.bmp ./testorig.jpg
./cjpeg -dct int -outfile testout.jpg ./testimg.ppm
./djpeg -dct int -ppm -outfile testoutp.ppm ./testprog.jpg
./cjpeg -dct int -progressive -opt -outfile testoutp.jpg ./testimg.ppm
./jpegtran -outfile testoutt.jpg ./testprog.jpg
cmp ./testimg.ppm testout.ppm
cmp ./testimg.bmp testout.bmp
cmp ./testimg.jpg testout.jpg
cmp ./testimg.ppm testoutp.ppm
cmp ./testimgp.jpg testoutp.jpg
cmp ./testorig.jpg testoutt.jpg
Следующей командой устанавливаем библиотеку jpeg.
# make install
Наконец, после всех этих мытарств можно заняться инсталляцией библиотеки GD. Скачиваем исходные тексты с сайта проекта http://www.boutell.com/gd/. Как всегда, распаковываем и конфигурируем дистрибутив.
# tar zxvf gd-2.0.6.tar.gz
# cd gd-2.0.6
# ./configure --x-includes=/usr/local/include --x-libraries=/usr/local/lib
Ключи --x-includes и --x-libraries указывают скрипту конфигурации, где у нас находятся заголовочные и библиотечные файлы всех установленных ранее библиотек.
# make all
Если компиляция завершилась с ошибками, то нам необходимо удалить временные файлы, созданные в процессе работы команды make.
# make devclean
Для верси1 библиотеки GD выше 2.0.11 нужно делать вот так.
# make distclean
После выполнения чистки нужно принять меры к устранению причин возникновения ошибок. При необходимости подправьте ключи команды configure, а затем проведите повторную компиляцию. И если предыдущие шаги завершились нормально, запускаем инсталляцию.
# make install
Теперь давайте обсудим второй способ установки. При наличии устойчивого соединения с Интернетом можно попытаться установить библиотеки GD, zlib, LibPng и jpeg с помощью механизма портов. Мы запустим установку GD, а она, в свою очередь, автоматически выполнит скачивание, компиляцию и установку всех необходимых библиотек на основе зависимостей между ними.
# cd /usr/ports/graphics/gd
# make install
Третий способ установки не требует подключения к сети Интернет. Скорее всего, он является самым простым и, видимо, лучше всего подходит для начинающих администраторов. Как и во втором способе, все необходимое будет автоматически установлено из пакетов, поставлявшихся вместе с операционной системой FreeBSD. По аналогии со вторым способом за удобство придется заплатить свежестью устанавливаемого программного обеспечения. В CD привод кладем компакт диск с пакетами и запускаем программу sysinstall.
# /stand/sysinstall
А затем, последовательно пройдя через все перечисленные ниже меню, выполняем инсталляцию.
Аналогичного эффекта можно добиться, используя команду pkg_add. Посмотрим, куда у нас все это установилось. Файлы библиотек лежат в /usr/local/lib, а заголовочные файлы в /usr/local/include/gd. Не стоит огорчаться, если, несмотря на все попытки, библиотеку не удалось установить ни одним из трех способов. Хотя я с трудом представляю, как такое возможно. Отложите установку до лучших времен. Наличие вышеназванных библиотек необходимо только для правильной работы модулей построения графиков и генерирования сетевой карты. Nagios работает стабильно и остается очень полезным инструментом даже без этих модулей.
Пришло время детально разобраться с архитектурой системы мониторинга. Обычно комплекс на основе Nagios состоит из двух частей - главной программы, в документации чаше всего называемой core program, и подключаемых модулей соответственно plugins. Модульный дизайн позволяет отделить логику основной программы от процесса выполнения проверок. Это в свою очередь дает возможность всем желающим без особых усилий расширять область применения Nagios через написание собственных подключаемых модулей.
Скачиваем последнюю версию главной программы и подключаемых модулей с официального сайта проекта http://www.nagios.org/download/. На момент написания статьи были доступны версии nagios-1.0b6 и nagiosplug-1.3-beta1. Засучив рукава, приступим к установке главной программы.
# tar zxvf nagios-1.0b6.tar.gz
# cd nagios-1.0b6
Теперь нужно решить, в какой каталог мы хотим инсталлировать Nagios. По умолчанию предполагается каталог /usr/local/nagios/. Думаю, нам тоже стоит придерживаться его, потому что в прилагающейся к дистрибутиву документации указан именно этот каталог. При последующем устранении ошибок или проблем с конфигурированием будет гораздо проще читать документацию. Создаем каталог, куда мы впоследствии будем проводить инсталляцию. Не совсем понятно, почему ее должен создавать администратор, а не программа инсталляции. Надеюсь, в следующих версиях этот недочет будет исправлен.
# mkdir /usr/local/nagios
С помощью скрипта adduser либо каким-нибудь другим способом создаем пользователя nagios, состоящего в группе nagios.
Давайте быстренько разберемся с назначением используемых при конфигурировании ключей.
--prefix=/usr/local/nagios - Сюда мы будем устанавливать файлы после компиляции. Вот и пригодилась созданная вручную директория /usr/local/nagios.
--with-cgi-url=/nagios/cgi-bin - URL с помощью которого мы будем обращаться к CGI скриптам web-интерфейса nagios. В конце URL символ "/" добавлять не нужно. В качестве примера для вымышленного сайта somesite.ru можно привести абсолютный URL одного из CGI скриптов httt://somesite.ru/nagios/cgi-bin/statusmap.cgi.
--with-html-url=/nagios/ - URL где будут находиться html файлы, в которых хранятся главное меню web-интерфейса и документация.
--with-nagios-user=nagios - пользователь, которому будут принадлежать файлы инсталляции.
--with-nagios-grp=nagios - соответственно группа этого пользователя.
--with-gd-lib=/usr/local/lib - тут у нас лежит библиотека GD
--with-gd-inc=/usr/local/include/gd - а здесь находятся ее заголовочные файлы.
Осмыслив все прочитанное и разобравшись с опциями команды configure, проводим сборку и инсталляцию.
# make all
# make install
Следующий шаг является необязательным, но желательно его все же выполнить. С помощью команды make install-init можно создать скрипт, который будет выполнять запуск Nagios после перезагрузки системы. Вдобавок к этому у нас появится возможность управлять работой процесса Nagios с помощью команд stop, reload, start, restart, reload, force-reload. Давайте подробнее рассмотрим каждую из этих команд.
start - запускает процесс Nagios.
stop - останавливает текущий процесс Nagios.
restart - останавливает выполняющийся процесс Nagios и запускает новый
reload - отправляет процессу Nagios сигнал SIGHUP, заставляя его перечитать конфигурационные файлы, а затем продолжить мониторинг
force-reload - производит принудительную перезагрузку конфигурационных файлов
status - показывает статус работающего процесса
Для FreeBSD файл скрипта должен располагаться в директории /usr/local/etc/rc.d и называться nagios.sh. В зависимости от типа операционной системы, инсталлятор должен сам выбрать подходящие права доступа, местоположение и имя скрипта. Например, для систем на основе Slackware должны получить соответственно /etc/rc.d/init.d и rc.nagios. Ну что же давайте, попытаемся выполнить установку скрипта.
Жаль, но установка с наскоку не удалась. Ну и ладно, вот исправим ошибки программистов, писавших скрипт, и все заработает как надо. С помощью любимого текстового редактора начинаем редактировать файл Makefile.
Идем на строку 32 и ищем символы
INIT_OPTS=-o root -g root
Обдумав увиденную строку, понимаем, что под FreeBSD пользователь root входит в группу wheel. Вносим изменения.
Правильно задаем имя файла nagios.sh вместо nagios. Не стоит давать общий доступ на чтение для файла скрипта. Вполне хватит режима доступа 100. Измененная строка будет выглядеть так:
Сохраняем файл и снова выполняем команду инсталляции.
# make install-init
Итак, скрипт автозапуска создан, но он все еще не готов к работе. Все дело в том, что при перезагрузке файл nagios.sh будет выполнен без единого параметра командной строки, а для безукоризненной работы нужно запускать его с параметром start. Сейчас мы это исправим. Открываем файл для редактирования и выполняем поиск строки:
Внесенными изменениями мы заставляем nagios.sh, запущенный без обязательных параметров, рекурсивно выполнить самого себя с параметром start. Для FreeBSD версии 4.6.2 и выше данные ухищрения уже не нужны скрипт должен работать с установками по умолчанию.
Еще одна ошибка - это путь к файлу, в котором будут храниться внешние команды, переданные на выполнение процессу Nagios. После инсталляции подразумевается, что файл должен располагаться в /usr/local/nagios/var/rw/nagios.cmd. Но, к сожалению, директория /usr/local/nagios/var/rw/ автоматически не создается. К тому же, не совсем понятен смысл создания отдельной директории для единственного файла nagios.cmd. Чтобы исправить вышеуказанную ошибку, ищем строку
NagiosCmd=${prefix}/var/rw/nagios.cmd
и заменяем ее на такую:
NagiosCmd=${prefix}/var/nagios.cmd
Теперь файл nagios.cmd будет создаваться в директории /usr/local/nagios/var/.
К сожалению, это не последняя проблема, связанная с файлом nagios.cmd. При каждом перезапуске процесса Nagios файл внешних команд сначала удаляется, а затем создается вновь. Беда в том, что создается nagios.cmd с правами процесса. Соответственно, он принадлежит пользователю nagios и группе nagios. На первый взгляд, здесь нет никакой проблемы. Поразмышляв некоторое время, мы понимаем, что главным поставщиком внешних команд для процесса Nagios будет web-интерфейс. Сервер Apache обычно запускается с правами пользователя nobody группы nogroup. А это значит, что процесс web-сервера не сможет вносить новые данные в файл nagios.cmd. Самым простым решением было бы дать доступ на запись всем, но с точки зрения безопасности такое решение выглядит довольно неприглядно. Вторым способом разрешения конфликта могло бы стать введение пользователя nobody в группу nagios. Но с безопасностью опять возникают неувязки. Самым лучшим выходом из этой ситуации является частичная передача прав на файл пользователю nobody. В результате такой операции файлом должен владеть пользователь nobody и группа nagios. Таким образом, доступ к файлу получат и процесс nagios, и web-сервер. Ищем в файле nagios.sh вот такие строки
sleep 1
status_nagios nagios
и добавляем сразу за ними команды
touch $NagiosCmd
chown nobody $NagiosCmd
Покончив с файлом nagios.sh, можно быть уверенным, что уж теперь - то он будет работать, как положено.
С помощью команды make install-config создаем файлы конфигурации, заполняем их значениями по умолчанию и помещаем в директорию /usr/local/nagios/etc/.
# make install-config
Заглянув в директорию /usr/local/nagios/, мы видим, что после инсталляции внутри нее образовалось еще 5 директорий.
# ls /usr/local/nagios
bin etc sbin share var
Опишем, для чего нужна каждая из этих директорий.
bin - здесь находится выполняемый файл основной программы. Он же демон Nagios.
etc - конфигурационные файлы
sbin - тут лежат файлы CGI для web-интерфейса
share - здесь находятся html файлы web-интерфейса и документация
var - файлы протоколов и данные о состоянии проверяемых объектов
Можете себя поздравить с окончанием установки главной программы Nagios. Можно было сделать все то же самое с помощью портов или пакетов. К сожалению, на такой способ установки времени у меня не хватило. Поэтому сказать об удобстве или подводных камнях такого пути ничего не могу. Есть подозрение, что возможно возникновение проблем с конфигурированием, да и свежесть установленного программного обеспечения будет весьма сомнительна. Еще одной причиной не использовать порты стало желание заняться русификацией системы. Подробнее о результатах этого эксперимента будет рассказано в следующей статье. Несмотря на то, что инсталляция главной программы закончена, толку нам от этого пока никакого. Без установленных модулей Nagios совершенно бесполезен, так как не имеет возможности взаимодействовать с объектами, за которыми нужно наблюдать. Настало время приняться за инсталляцию этих самых модулей. С помощью make, поставляющегося вместе с операционной системой, собрать их не удалось. Посему для компиляции будем пользоваться gmake.
# tar zxvf nagiosplug-1.3-beta1.tar.gz
# cd nagiosplug-1.3-beta1
# ./configure --prefix=/usr/local/nagios --with-nagios-user=nagios --with-nagios-grp=nagios
Значение ключей конфигурации аналогично тем, что мы использовали при компиляции главной программы. Почитать детальные объяснения о назначении каждого ключа можно с помощью команды ./configure help.
# gmake all
# gmake install
После компиляции подключаемые модули устанавливаются в директорию /usr/local/nagios/libexec. Некоторые из них написаны на С, другие на perl. В принципе, модуль может быть написан на любом языке. Каждый модуль является выполняемым файлом. Это дает возможность использовать модули не только в комплексе с Nagios, но и с другими программами. Можно выполнять проверки даже из командной строки. Каждый модуль должен поддерживать опцию help или -h, иначе он не может считаться совместимым с Nagios. Такие жесткие требования позволяют легко разобраться с любым модулем. Давайте посмотрим, какие параметры командной строки должен получать модуль check_dns.
# check_dns -h
check_dns (nagios-plugins 1.3.0-alpha1) 1.1.1.1
The nagios plugins come with ABSOLUTELY NO WARRANTY. You may redistribute
copies of the plugins under the terms of the GNU General Public License.
For more information about these matters, see the file named COPYING.
Copyright (c) 1999 Ethan Galstad ()
Usage: check_dns -H host [-s server] [-t timeout]
check_dns --help
check_dns --version
-H, --hostname=HOST The name or address you want to query
-s, --server=HOST
Optional DNS server you want to use for the lookup
-t, --timeout=INTEGER
Seconds before connection times out (default: 10)
-h, --help
Print detailed help
-V, --version
Print version numbers and license information
This plugin uses the nslookup program to obtain the IP address
for the given host/domain query. A optional DNS server to use may
be specified. If no DNS server is specified, the default server(s)
specified in /etc/resolv.conf will be used.
Прочитав и обдумав вывод предыдущей команды, можно понять, что модуль check_dns принимает один обязательный параметр H и два необязательных параметра -s, -t. Итак, по порядку H имя или адрес проверяемого хоста. В параметре -s определяется адрес сервера DNS, используемого для перевода имени в адрес, если в первом параметре вместо адреса передано имя хоста. Затем -t устанавливает таймаут, по истечении которого служба считается нефункционирующей. Для проверки сервиса DNS машины с адресом 192.168.10.254 нужно выполнить следующую команду.
# check_dns -H 192.168.10.254
DNS ok - 0 seconds response time, Address(es) is/are 192.168.10.254
Интуиция странным образом подсказывает мне, что DNS работает нормально.
Закончив установку и разобравшись с механизмом работы подключаемых модулей, прейдем к настройке Nagios.