Skip to end of metadata
Go to start of metadata

Типа микрогайд...

Для настройки автоматической синхронизации ДНС нам предстоит посетить несколько весьма увлекательных мест. Исходить будем из условия, что ДНС-сервер и сервер NOC - это разные сервера. Не важно, будут это разные виртуалки, или это будут разные железки.

Настраивать будем домен sample.com

Начиная с (не помню какого) патча появился новый механизм синхронизации. Его достоинство заключается в том, что он не пытается сразу весь репозиторий влить на ДНС, чтобы там уже mercurial разгребал изменения. Также не требуется хранение конфигов в локальном репозитарии - это сильно ускоряет процесс discovery с автопрописыванием соответствий IP-DNS в базу IPAM(это можно сделать или отдельной периодической pyrule или извратиться с помощью interface classification rule).

Для выполнения синхронизации надо:

  1. иметь заполненную базу IPAM(хотя бы один адрес в домене sample.com, например - 192.168.0.1 = host.sample.com)
  2. зайти на сервер с NOC.
  3. Запустить скрипт ./noc clone -v3 --out=/tmp/ sync. Этот скрипт требует  параметр для запуска - путь в место, куда сложить копию noc-sync.
  4. Взять склонированый noc-sync, скопировать его на сервер ДНС. Разместить в удобной папке. Пусть это будет /usr/local/noc
  5. На сервере ДНС настраиваем noc-synс (подробности будут ниже)
    Суть метода синхронизации заключается в том, что демон синхронизации цепляется к демону noc-stomp, подписывается на определенный канал информации/обновлений. Дальше периодически синхронизатор спрашивает список объектов в своем канале и их версии. Сравнивает с теми, что имеет у себя локально, те, для который версии отличаются - просит передать детально. Noc-stomp может вобщем-то отказать клиенту, направив его получать полный список. Таким образом, большую часть времени клиент получает только отдельные зоны, в которых были изменения. Синхронизация работает быстрее.
    Как же настраивается этот самый noc-sync?
    Конечно же есть noc-sync.defaults - в этом файле содержится основное. Лучше его скопировать в файл noc-sync.conf, после чего уже в нем ковыряться. Его содержимое: 

    ## WARNING: Do not edit this file directly!!!
    ## Override settings using etc/noc-sync.conf
    ##
    [main]
    logfile  = /var/log/noc/noc-sync.log
    loglevel = info
    logsize  = 0
    logfiles = 0
    syslog_host =
    pidfile  = /var/run/noc/noc-sync.pid
    heartbeat= false
    [stomp]
    host = 127.0.0.1
    port = 19705
    client_id = noc-sync
    
    

    не думаю, что секции [main] и [stomp] вызовут какие-то сложности, достаточно упомянуть, что в секции stomp надо указать правильный Ip сервера NOC. А на самом сервере NOC надо объяснить демону stomp на каких адресах он должен слушать.
    Переходим к самому интересному - секции, описывающей каналы. В новой схеме синхронизации тип ДНС-сервера задается не в веб-интерфейсе, а в конфиге noc-sync. Поддерживаются bind v9/file, powerdns/SQL.
    Примеры конфигов выглядят так: 

        [dns/zone/ch1]
        type = bind/file
        enabled = true
        root = <zone files directory>
        on_reload = rndc reload
        on_reload_zone = rndc reload {{ zone }}
    
    
        [dns/zone/ch1]
        type = powerdns/mysql
        enabled = true
        database = db=dns user=user host=127.0.0.1 passwd=pass
    
    
        [dns/zone/ch1]
        type = powerdns/pgsql
        enabled = true
        database = dbname=dns user=user
    
    

    Естественно, выше приведены три настройки одного канала для разных типов серверов. Выбираем то, что нам нравится, меняем под себя.

  6. ВАЖНО! Нельзя давать один канал нескольким серверам. Будет жопа!
  7. Для запуска сервиса необходимо настроить virtualenv. В общем случае это сводится к

    virtualenv /path/to/dir/for/noc/sync
    # В нашем случае:
    virtualenv /usr/local/noc
  8. Также необходимо в эту виртуальныю среду поставить python-cjson. Тут все просто:

    /usr/local/noc/bin/pip install python-cjson
  9. Теперь можно пытаться запустить. Для начала cd /usr/local/noc && ./scripts/noc-sync.py -f start
  10. Если все завелось - достаем из кармана rc-скрипт нока, кидаем его на ДНС сервер, запускаем как службу.
  11. Проверяем по логам, видим, что sync авторизовался на noc-stomp, запрашивает информацию, а в ответ можно сказать нифига. Правильно. В канал синхронизации ничего еще не успело попасть. Исправляем.
  12. Заводим в веб-интерфейсе ДНС-сервер(только обязательные поля), профиль зон ДНС. Добавляем зону sample.com, которую надо автогенерировать, мастером в ней наш ДНС.
  13. Все готово для включения синхронизации. Заходим в свойства ДНС-сервера. Смотрим внимательно на поле Sync channel. Это название канала, с которым работает stomp/sync. В конфиге есть префикс, указывающий тип канала "dns/zone", а дальше идет имя канала. У нас в примере в sync объявлен dns/zone/ch1 - это значит, что серверу DNS в поле Sync channel надо вписать "ch1". Именно по этому каналу будет идти синхронизация.
  14. Применяем изменения. Возможно нужно будет дернуть Noc-stomp, чтоб он понял, что есть еще один канал. Можно для гарантии перезапустить NOC.

Смотрим на результат. Тут все зависит от того, какой тип ДНС используется. Для Bind достаточно посмотреть в каталог, сколько и каких там файлов, потом подправить named.conf, т.к. старый файл для include не совпадает с новым и перезапустить bind/ Для PowerDNS можно посмотреть выборкой из БД, или спросить напрямую PowerDNS про свою зону.

В заключение, хочу предупредить - не стоит запускать sync сразу в эксплуатацию. Лучше запустить, оттестить, потом менять конфиг своего рабочего DNS.

Сам noc-sync будет требовать специфические модули. Как минимум потребуется c-json, для PowerDNS еще нужно будет питоновские драйвера/модули подключения к СУБД.

 

7 Comments

  1. Unknown User (alexm)

    Лайкнул, как и обещал)

     

  2. Unknown User (zi)

    первое нормальное описание работы с новым синхронизатором

    тема клонирования и развертывания демона на другом сервере не раскрыта, или нужна ссылка на статью или документацию, где этот процесс описан подробнее

     

  3. kk

    из модулей поставил только python-django.

    1. Unknown User (mikevlz) AUTHOR

      видимо, он содержит необходимые библиотеки json.

  4. Unknown User (dv)

    django sync'у не нужен, только cjson

  5. Unknown User (mikevlz) AUTHOR

    Нельзя на один канал вешать несколько серверов. Получается жопа с ручкой - сервера друг у друга тырят данные.