DNS сервер на локальном интерфейсе или простой путь к любви между программистами и администраторами

в 12:11, , рубрики: linux

У меня в подчиненни гетерогенная сеть из порядка 40 линукс серверов и несколько живых PHP программистов. Долгое время я просил вынести в единый конфигурационный унифицированный файл подключения к базам данных, серверам memcached, redis и sphinx. Но сегодня осенила гениальная идея. Связано это было с невзможностью быстро включить-выключить сервер из работы и отдать техподдержке на апгрейд убой. Конечно подождать пару часов когда серверов мало, попить чай и пообщаться с любимой можно, но это очень затрудняет работу с большим количеством машинок.

Идея заключается в следующем: делегировать на каждую из локальных машин зону описывающую все внутренние ресурсы, с временем жизни записей всего в несколько секунд. В случае каких-либо изменений, добавлении в кластер новых железок, выключении старых, смене адресации в существующих кластерах и так далее — достаточно отредактировать файл зоны на dns-master сервере и разлить его на слейвы то есть наши рабочие машины. Лично мне идея до сих пор кажется гениальной в своей простоте.

Техническая реализация крайне легка, я приведу пару строк конфигов, мне кажется администраторы с парой десятков серверов вполне поймут что к чему, но по первым просьбам опишу подробно.

Придумываем красивое название нашей зон и делегируем ее на сервер который будет нашим новым dns-master ом.

[root@isp4 manualzone]# cat corp.ru |grep service.noc
service.noc             NS      admin.service.noc
admin.service.noc       IN      A       AA.BB.CC.74

На новом сервере:
named.conf:

acl "trust" {
        127.0.0.1;
        AA.BB.CC.0/24;
};
options {

        check-names master ignore;
        allow-transfer { any; };
        allow-notify { any; };
        allow-query { any; };
        directory "/var/lib/named";
        dump-file "/var/log/named_dump.db";
        statistics-file "/var/log/named.stats";
        listen-on  {
                AA.BB.CC.74;
                127.0.0.1;
                 };
        query-source address * port 53;
        transfer-source * port 53;
        notify-source * port 53;
        notify yes;
    disable-empty-zone "1.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.IP6.ARPA";
};

Ну и разумеется наш файл зоны, в котором описываем все сервисы которые нас интересуют. Не забудьте подкорректировать время жизни записей в соответствии со своими нуждами:

SER34:/var/lib/named/master # cat service.noc.corp.ru
$TTL 5
@        5    IN      SOA     admin.service.noc.corp.ru.        root.service.noc.corp.ru. (
2012082004 ; serial
5s     ; refresh
15s     ; retry
7d    ; expire
5s     ; minimum ttl
)

        IN      A       AA.BB.CC.0

        IN      NS      admin.service.noc.corp.ru.
        IN      NS      W02.service.noc.corp.ru.


ADMIN   IN      A       AA.BB.CC.74
W02     IN      A       AA.BB.CC.22


;WEB
WEBNODE IN      A       AA.BB.CC.0
WEBNODE IN      A       AA.BB.CC.1
WEBNODE IN      A       AA.BB.CC.2
WEBNODE IN      A       AA.BB.CC.3
WEBNODE IN      A       AA.BB.CC.4
WEBNODE IN      A       AA.BB.CC.5
WEBNODE IN      A       AA.BB.CC.6
WEBNODE IN      A       AA.BB.CC.7


;MYSQL REPLICATE CLUSER
MYSQLCLUSTER00          IN      A       AA.BB.CC.50
MYSQLCLUSTER00          IN      A       AA.BB.CC.51
MYSQLCLUSTER00          IN      A       AA.BB.CC.52
MYSQLCLUSTER00          IN      A       AA.BB.CC.53


;MYSQL MASTER ADMIN
MYSQLCLUSTER_ADMIN             IN      A       AA.BB.CC.70

;MYSQL MASTER INTERACTIVE
MYSQLCLUSTER_INTERACTIVE       IN      A       AA.BB.CC.54

;MYSQL MASTER_ONE
MYSQLCLUSTER_ONE          IN      A       AA.BB.CC.55

;SPHINX CLUSTER01
SPHINX_CLUSTER00               IN      A       AA.BB.CC.56
SPHINX_CLUSTER01               IN      A       AA.BB.CC.57
SPHINX_CLUSTER02               IN      A       AA.BB.CC.58

Ну вот тут идем на наши слейвы, на каждом поднимаем named на локальном интерфейсе (ведь никому кроме самого сервера он и не нужен) и с минимальным конфигом.
named.conf


options {
        allow-update { AA.BB.CC.74; };
        directory "/var/lib/named";
        dump-file "/var/log/named_dump.db";
        statistics-file "/var/log/named.stats";
        listen-on port 53 { 127.0.0.1; };
        allow-query { 127.0.0.1; };
        notify no;
    disable-empty-zone "1.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.IP6.ARPA";
};

zone "service.noc.corp.ru" {
        type slave;
        file "slave/service.noc.corp.ru";
        masters { AA.BB.CC.74; };
};

После этого прописываем в /etc/resolv.conf

SRV03:/var/lib/named/slave # cat /etc/resolv.conf
search noc.corp.ru
nameserver 127.0.0.1

Ну и конечно же проверка:

SRV03:/var/lib/named/slave # nslookup
> webnode.service
Server:         127.0.0.1
Address:        127.0.0.1#53
Name:   webnode.service.noc.corp.ru
Address: AA.BB.CC.22
Name:   webnode.service.noc.corp.ru
Address: AA.BB.CC.23
Name:   webnode.service.noc.corp.ru
Address: AA.BB.CC.24
Name:   webnode.service.noc.corp.ru
Address: AA.BB.CC.25
Name:   webnode.service.noc.corp.ru
Address: AA.BB.CC.26
Name:   webnode.service.noc.corp.ru
Address: AA.BB.CC.27
Name:   webnode.service.noc.corp.ru
Address: AA.BB.CC.20
Name:   webnode.service.noc.corp.ru
Address: AA.BB.CC.21

И это проделываем это на каждой ноде в нашем небольшом но ухоженном парке серверов. Наслаждаемся жизнью без мысли о том когда же многоуважаемые программисты найдут 5 минут пробежаться по многочисленным конфигам и выключить из баланса ту или иную ноду.

PS. Не спрашивайте почему не используются балансеры и проксеры, для этого есть свои архитектурные причины.
PPS. На написание этой статьи я потратил больше времени чем на первоначальную настройку самой системы. Все IP адеса, названия хостов и конфигурациооные файлы основаны на реальных и проверены на работоспособность.

Автор: Perec007

* - обязательные к заполнению поля


https://ajax.googleapis.com/ajax/libs/jquery/3.4.1/jquery.min.js