Реализация
На docs.cacti.net лежит, судя по всему выложенный пользователями, набор скриптов для мониторинга BIND9. Вот что нужно знать о том, как оно работает (или должно работать):
- Для опроса запускается скрипт
bind-stats.sh
- Скрипт запускает
snmpget
- По SNMP-запросу через
extend
запускается скриптrunstats.sh
- Он удаляет файл со статистикой
/var/cache/bind/named.stats
(путь захардкожен) - Запускает
rndc stats
- Выполняет команду
cat /var/cache/bind/named.stats | /root/bin/dnsstats.pl
(пути захардкожены) - Скрипт
dnsstats.pl
получает на вход вывод файла статистики, а на выходе печатает всё в одну строку, которая и отправляется как ответ на SNMP-запрос
- Он удаляет файл со статистикой
- Ответ пропускается через
sed
- После чего разбирается на части и сохраняется в RRD
Вот так выглядит ответ перлового скрипта:
a:5741 a6:0 aaaa:1560 any:0 cname:0 mx:0 naptr:0 ns:245 ptr:233 soa:55 spf:0 srv:6 txt:47 rsnx:19 rsfail: rserr:4 rsipv4qs:3459 rsipv4rr:3398 rsmismatch: rsqr:674 rsqt:668 rsrtt10: rsrtt100500:630 rsrtt10100:2755 rsrtt1600: rsrtt500800:13 rsrtt8001600: sockopen:3513 sockclosed:3505 sockbf: consest:3439 recverr:
У любого адекватного человека волосы встанут дыбом от такого перформанса. Но если вы всё-таки решили настроить это именно так - то вот пара советов.
Проблемы
Права на запуск rndc stats
Запускать эту команду будет демон snmpd
запущенный от пользователя snmp
. И всё бы хорошо, но ей для выполнения нужен файл /etc/bind/rndc.key
, который в целях безопасности доступен только пользователю bind
. Неправильное решение - запускать эту команду через sudo
. Правильное решение - добавить пользователя snmp
в группу bind
(это пригодится и в следующем совете):
Права на файл /var/run/named/named.stats
Демон snmpd
запускается от пользователя snmp
, а всё, связанное с биндом - от пользователя bind
. Поэтому удалять файл /var/run/named/named.stats
скрипт не сможет. Решение простое:
- Создаем файл
/var/run/named/named.stats
любым способом - Отдаём его пользователю
bind
:chown bind:bind /var/run/named/named.stats
- Даём права записи в него группе:
chmod 660 /var/run/named/named.stats
- Вместо удаления файла каждый раз - просто чистим его:
truncate --size=0 /var/run/named/named.stats
Запуск cat
каждый раз - не нужен
Зачем каждый раз запускать cat
, если перловый скрипт может сам читать файл? Добавим пару строк:
my $filename = $ARGV[0];
open my $file, "<:encoding(utf8)", $filename or die "$filename: $!";
...
while(my $line = <$file>) {
Ненужный runstats.sh
Еще один скрипт runstats.sh
- не нужен, это просто лишний процесс bash
. Вместо этого просто напишите в snmpd.conf
:
extend-sh .1.3.6.1.4.1.18689.0.1 dnscache-stats /usr/bin/truncate --size=0 /var/run/named/named.stats ; /usr/sbin/rndc stats ; /etc/snmp/scripts/bind9/dnsstats.pl /var/run/named/named.stats
bind-stats.sh
В серверном скрипте bind-stats.sh
захардкожено использование SNMP v2 с community. Если вы используете SNMP v3 - его придется переписать.
Завершение
Учитывая всё вышесказанное - такой путь мониторинга сервиса в корне неправилен. Используйте правильные решения и никогда не городите костыли.