Собираем статистику named (bind-8) в Zabbix
Постановка задачи
Есть DNS-сервер, необходимо собирать статистику по запросам/рисовать графики.
Для решения задачи будем по cron запускать rndc stats, после чего парсить файл named.stats и отдавать статистику через zabbix_sender.
Дополнительно, скриптом с отдельного сервера (можно с zabbix-сервера) будем удаленно опрашивать наш named (при помощи dig) и сохранять время, за которое сервер дал ответ. + настроим триггер на случай таймаута.
Идея и скрипты взяты на форуме zabbix в теме Linux DNS Server monitoring
Внимание! приведенный ниже скрипт работает для Bind < 9.6.X !!!
Реализация
На DNS-сервере:
Создаем скрипт /etc/zabbix/scripts/zabbix-bind
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 | #!/bin/sh export PATH=/usr/local/sbin:/usr/local/bin:/sbin:/bin:/usr/sbin:/usr/bin:/root/bin ZAB_CONF=/etc/zabbix/zabbix_agentd.conf ZAB_BIN=/usr/bin/zabbix_sender RNDC_BIN='/usr/sbin/rndc' STATS='/var/named/chroot/var/run/named/named.stats' FTMP1=`mktemp` #FTMP1='/tmp/zabbix' if $RNDC_BIN stats ; then if [ -s ${STATS} ] ; then tail -n12 ${STATS} 2>/dev/null | grep -A12 '^+++' | grep '^[a-z]' | sed 's/.*/- named_&/' >${FTMP1} if tty >/dev/null ; then $ZAB_BIN -vv -c ${ZAB_CONF} -i ${FTMP1} else $ZAB_BIN -c ${ZAB_CONF} -i ${FTMP1} >/dev/null fi elif tty >/dev/null ; then echo "${STATS} does not exist!" >&2 fi fi rm -f ${FTMP1} |
Не забываем установить права на запуск
chmod +x /etc/zabbix/scripts/zabbix-bind
Далее создаем cron-job:
echo '*/1 * * * * root /etc/zabbix/scripts/zabbix-bind > /dev/null 2>&1' > /etc/cron.d/zabbix
На отдельном сервере (там должен быть установлен zabbix-sender) устанавливаем скрипт удаленного опроса dns-сервера.
Скрипт принимает в качестве обязательного аргумента IP нашего DNS сервера. В качестве необязательного (второго параметра) принимает доменное имя, которое будет использовано в запросе dns.
/etc/zabbix/scripts/dnschk.sh
!!!Cкрипт использует команду dig из пакета bind-utils
!!!
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 | #!/bin/bash COMM="/usr/bin/dig" ZAB_CONF="/etc/zabbix/zabbix_agentd.conf" ZAB_BIN="/usr/bin/zabbix_sender" ZABBIX_SERVER="192.168.77.142" MONITORED_HOST_NAME="NS1" MONITORED_KEY="named_replay-speed" if test -z "$1" ; then echo "You need to supply a DNS server to check. Quitting" exit; fi SERVER=$1 if test -n "$2" ; then Q=$2 else Q="examlpe.com" fi QUERY_TIME=`$COMM @$SERVER $Q | grep "Query time" | awk '{print $4}'` if [ $QUERY_TIME ]; then $ZAB_BIN -z $ZABBIX_SERVER -s $MONITORED_HOST_NAME -k $MONITORED_KEY -o $QUERY_TIME else $ZAB_BIN -z $ZABBIX_SERVER -s $MONITORED_HOST_NAME -k $MONITORED_KEY -o "-10" fi |
Не забываем установить права на запуск
chmod +x /etc/zabbix/scripts/dnschk.sh
Далее создаем cron-job:
echo '*/1 * * * * root /etc/zabbix/scripts/dnschk.sh 192.168.1.81 > /dev/null 2>&1' >> /etc/cron.d/zabbix
На ZABBIX-сервере:
Импортируем шаблон zabbix_App_named.xml , и подключаем его к хосту.
<?xml version="1.0" encoding="UTF-8"?> <zabbix_export> <version>2.0</version> <date>2015-10-23T13:06:37Z</date> <groups> <group> <name>Name servers</name> </group> <group> <name>Templates</name> </group> </groups> <templates> <template> <template>Template App Named</template> <name>Template App Named</name> <groups> <group> <name>Name servers</name> </group> <group> <name>Templates</name> </group> </groups> <applications> <application> <name>Named</name> </application> </applications> <items> <item> <name>Number of process named</name> <type>0</type> <snmp_community/> <multiplier>0</multiplier> <snmp_oid/> <key>proc.num[named]</key> <delay>60</delay> <history>90</history> <trends>365</trends> <status>0</status> <value_type>3</value_type> <allowed_hosts/> <units/> <delta>0</delta> <snmpv3_securityname/> <snmpv3_securitylevel>0</snmpv3_securitylevel> <snmpv3_authpassphrase/> <snmpv3_privpassphrase/> <formula>1</formula> <delay_flex/> <params/> <ipmi_sensor/> <data_type>0</data_type> <authtype>0</authtype> <username/> <password/> <publickey/> <privatekey/> <port/> <description/> <inventory_link>0</inventory_link> <applications> <application> <name>Named</name> </application> </applications> <valuemap/> </item> <item> <name>Tcp-Service DNS</name> <type>3</type> <snmp_community/> <multiplier>0</multiplier> <snmp_oid/> <key>net.tcp.service[dns,,53]</key> <delay>60</delay> <history>90</history> <trends>365</trends> <status>0</status> <value_type>3</value_type> <allowed_hosts/> <units/> <delta>0</delta> <snmpv3_securityname/> <snmpv3_securitylevel>0</snmpv3_securitylevel> <snmpv3_authpassphrase/> <snmpv3_privpassphrase/> <formula>1</formula> <delay_flex/> <params/> <ipmi_sensor/> <data_type>0</data_type> <authtype>0</authtype> <username/> <password/> <publickey/> <privatekey/> <port/> <description/> <inventory_link>0</inventory_link> <applications> <application> <name>Named</name> </application> </applications> <valuemap/> </item> </items> <discovery_rules/> <macros/> <templates/> <screens/> </template> </templates> <triggers> <trigger> <expression>{Template App Named:proc.num[named].last(0)}=0</expression> <name>named is not running on {HOST.NAME}</name> <url/> <status>0</status> <priority>5</priority> <description/> <type>0</type> <dependencies/> </trigger> <trigger> <expression>{Template App Named:net.tcp.service[dns,,53].max(#5)}=0</expression> <name>Tcp-Service DNS on {HOST.NAME}</name> <url/> <status>0</status> <priority>5</priority> <description/> <type>0</type> <dependencies/> </trigger> </triggers> </zabbix_export>
Готово!