Синхронизация DNS-зон c сервера с Plesk-панелью

Задача может возникнуть когда на сервере с Plesk-панелью имеется всего один IP-адрес. В данном случае, что-бы не заводить slave-зоны на другом сервере каждый раз вручную, можно в крон поставить скрипт, который и будет производить синхронизацию зон. Причем, не только добавлять новые зоны, но и удалять старые, а также не только основные домены,но и алиасы к ним.

Для начала нам понадобиться создать юзера в mysql на сервере с Plesk-панелью, и дать ему права на чтение из нужных таблиц.

grant select on psa.domains to dnsuser@'%' identified by 'You_paSSword';
grant select on psa.domainaliases to dnsuser@'%' identified by 'You_paSSword';

Можете вместо % использовать конкретный хост, так безопаснее, и так же не забудьте открыть для этого хоста mysql-порт(3306) на файрволе.
Все остальные действия проводятся уже на сервере где должны быть slave-зоны.
Далее создадим следующий скрипт, назовем его dnssync:

#!/bin/bash

dbuser="dnsuser"
dbpass="You_paSSword"
tmpfn="/tmp/plesk-domains.txt"
zonefn="/var/named/chroot/etc/plesk-zones.conf"
hostip="10.11.12.13" # IP машины с Plesk-ом

if [ -f $tmpfn ];then
/bin/mv -f $tmpfn $tmpfn.old
fi

/usr/bin/mysql -h $hostip -u $dbuser --password="$dbpass" -Bse \
"SELECT name from domains where status=0 UNION SELECT name from domainaliases where status=0 " \
psa >$tmpfn
OUT1=$?

if [ $OUT1 -eq 0 ];then

/usr/bin/diff -q $tmpfn $tmpfn.old > /dev/null
OUT2=$?
if [ $OUT2 -ne 0 ];then
echo "" >$zonefn
while read line
do
domain=$line
echo "zone \"$domain\" { type slave; masters {$hostip;}; file \
\"/var/named/slaves/$domain.hosts\"; };" >>$zonefn
done < "$tmpfn"

echo "" >>$zonefn
/etc/init.d/named restart > /dev/null

fi
else
if [ -f $tmpfn.old ];then
/bin/mv -f $tmpfn.old $tmpfn
fi
fi

Обратите внимание на пути, в данном примере bind запущен в chroot окружении, на CentOS 5.5. У Вас пути могут отличатся, и Вам необходимо исправить их на свои.

Осталось добавить в named.conf

include "/etc/plesk-zones.conf";

дать права на выполнение файлу dnssync,и поставить задание в cron, например, делать проверку каждый час:

0 * * * * /path_to_script/dnssync

запускаем один раз /path_to_script/dnssync
рестартуем bind
И все работает на ура.
Больше лишних телодвижений не потребуется.
Я всегда задумываюсь: все-таки именно лень заставляет нас что-то сделать, чтоб потом ничего не делать.

Удачи в настройках.
© shadow_alone