Тема: Как передать содержимое named.conf вторичным серверам

Задача очень банальная, есть софт для управления зонами DNSManager, софт не хорогий, не плохой... не о нем речь. Это чудо инженерной мысли стоит и при установке его на все NS сервера красиво все делает сам, но! Возникает встречный вопрос, зачем на NS сервер ставить то что там в принципе не нужно, да еще и жрет ресурсы (и не мало), да еще и стоит денег...

Во общем что мы имеем. 3 NS сервера

ns1.domain.tld 111.111.111.111
ns2.domain.tld 222.222.222.222
ns3.domain.tld 333.333.333.333

и тот самый ns0.domain.tld 000.000.000.000 на котором и стоит сей замечательный продукт. Его мы не показываем наружу. Специфика софта такая что он правит именно named.conf и размещает все во view'вы. Это не хорошо, не плохо, так есть. Один view для доменов, а второй я выделил для arpa.

view "default" {                                                               
        allow-transfer { 127.0.0.1; 000.000.000.000; 111.111.111.111; 222.222.222.222; 333.333.333.333 };
        match-destinations { 000.000.000.111; };
        transfer-source 000.000.000.111;
        include "/etc/named/zone.delegation";
        zone "0.1.1.in-addr.arpa" {
                type master;
                file "/var/named/0.1.1.in-addr.arpa";
        };
        zone "0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.ip6.arpa" {
                type master;
                file "/var/named/default/0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.ip6.arpa";
        };
};
view "cp" {
        allow-transfer { 127.0.0.1; 000.000.000.000; 111.111.111.111; 222.222.222.222; 333.333.333.333 };
        match-destinations { 000.000.000.000; };
        transfer-source 000.000.000.000;
        zone "domain2.com" {
                type master;
                file "/var/named/cp/domain2.com";
        };
        zone "domain1.com" {
                type master;
                file "/var/named/cp/domain1.com";
        };
};

теперь задача, парсить конфиг и из него сделать конфиг пригодный для ns[1-3].domain.tld.

bind_master2slave

#!/usr/bin/awk -f
# Copyright (c) 2014, BSD license, Alan Vezhbitskis, http://www.alan.lt.
# NO LIABILITY ACCEPTED WHATSOEVER. USE AT YOUR OWN RISK.
# Changelog:
# 2014-08-27 - added arpa ipv6 support
BEGIN {
MASTER_DNS_IP="000.000.000.000;"
ARPA_DNS_IP="000.000.000.111;"
SLAVE_TEMPLATE="zone \"_ZONE_\" IN { type slave; file \"/var/named/slaves/_ZONE_\"; masters { _MASTERDNS_ }; };"
print "\n\n// Do not touch!"
print "// Zone's generated from "MASTER_DNS_IP
print "// Last generation time: " strftime("%Y-%m-%d %H:%M:%S") "\n\n"
# Internal variables
COUNTRECORDS=0
TMP_ZONE=0
TMP_SLAVE=0
} # End of BEGIN statement
# MAIN LOOP: 
{
#print "DEBUG["COUNTRECORDS"] ZONE-"TMP_ZONE" SLAVE-"TMP_SLAVE"  1: "$1" 2: "$2" 3: "$3
if (tolower($1) == "zone") {
    if (TMP_ZONE == 1) print MYTEMPLATE 
    TMP_SLAVE=0
    TMP_ZONE=1
    ZONE=tolower($2)
    gsub(/"/,"",ZONE)
    if (ZONE == "") {
    } else {
    MYTEMPLATE=SLAVE_TEMPLATE
        gsub(/_ZONE_/,ZONE,MYTEMPLATE)
    if (ZONE ~ /.in-addr.arpa/ || ZONE ~ /.ip6.arpa/) {
        gsub(/_MASTERDNS_/,ARPA_DNS_IP,MYTEMPLATE)
    } else {
        gsub(/_MASTERDNS_/,MASTER_DNS_IP,MYTEMPLATE)
    }
    }
}
if (tolower($1) == "type" && tolower($2) == "slave;") TMP_SLAVE=1
if (TMP_SLAVE == 1 && tolower($1) == "masters" && $3 ~ /[0-9].[0-9].[0-9].[0-9]/) {
    gsub(MASTER_DNS_IP,$3,MYTEMPLATE)
    TMP_SLAVE=0
}
#COUNTRECORDS=COUNTRECORDS+1
} # End of MAIN LOOP
END {
    if (TMP_ZONE == 1) print MYTEMPLATE 
    print "\n"
} # End of END statement

скрипт на выходе дает конфиг:

cat /etc/named.conf | bind_master2slave

zone "1.1.1.in-addr.arpa" IN { type slave; file "/var/named/slaves/1.1.1.in-addr.arpa"; masters { 000.000.000.111; }; };
zone "0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.ip6.arpa" IN { type slave; file "/var/named/slaves/0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.ip6.arpa"; masters { 000.000.000.111; }; };
zone "domain1.tld" IN { type slave; file "/var/named/slaves/domain1.tld"; masters { 000.000.000.000; }; };
zone "domain2.tld" IN { type slave; file "/var/named/slaves/domain3.tld"; masters { 000.000.000.000; }; };

осталось правильно подать

# cat /etc/cron.d/ns-update

HOME=/var/named/deploy/
*/9 * * * * root /var/named/deploy/deploy.sh 2>&1 1>/dev/null

# cat /var/named/deploy/deploy.sh

#!/bin/sh
cnf=$(/bin/find /etc/named.conf -type f -mmin -10| grep named.conf)
if [ -s "${cnf}" ]; then
    cat /etc/named.conf | /var/named/deploy/bind_master2slave > /var/named/deploy/named.zones
    # ns1
    echo "ns1 named.zones"
    scp -i /var/named/deploy/id_rsa /var/named/deploy/named.zones [email protected]:/etc/named/
    ssh -i /var/named/deploy/id_rsa [email protected] "/usr/sbin/rndc reload"
    # ns2
    echo "ns2 named.zones"
    scp -i /var/named/deploy/id_rsa /var/named/deploy/named.zones [email protected]:/etc/named/
    ssh -i /var/named/deploy/id_rsa [email protected] "/usr/sbin/rndc reload"
    # ns3
    echo "ns3 named.zones"
    scp -i /var/named/deploy/id_rsa /var/named/deploy/named.zones [email protected]:/etc/named/
    ssh -i /var/named/deploy/id_rsa [email protected] "/usr/sbin/rndc reload"
fi

Очень важный момент смотреть, а изменился ли /etc/named.conf, чтобы не дёргать каждый раз named.