Развертывание и управление DNS с помощью OctoDNS в Ubuntu 18.04

OctoDNS – это инструмент, основанный на подходе «инфраструктура как код», который позволяет развертывать и управлять DNS-зонами. Для этого он использует стандартные принципы разработки программного обеспечения, в том числе контроль версий, тестирование и автоматическое развертывание. OctoDNS был создан GitHub и написан на Python.

OctoDNS позволяет устранить многие недостатки управления DNS вручную, так как файлы зон хранятся в структурированном формате (YAML). Он может развертывать зоны нескольких провайдеров DNS одновременно, находить синтаксические ошибки, автоматически активировать конфигурацию DNS, снижая риск человеческой ошибки. OctoDNS также часто используется для синхронизации конфигураций DNS между различными провайдерами, такими как система тестирования и производства, или между действующей средой и средами восстановления после отказа.

OctoDNS похож на DNSControl – это аналогичный инструмент, созданный Stack Exchange и написанный на Go. В отличие от OctoDNS, для определения зон DNSControl применяет язык конфигурации, основанный на JavaScript, что позволяет использовать передовые программные характеристики, такие как петли, и указывать несколько подобных записей в пределах одной зоны.

Читайте также: Развертывание и управление DNS с помощью DNSControl в Ubuntu 18.04

В этом мануале вы научитесь устанавливать и настраивать OctoDNS. Вы создадите базовую конфигурацию DNS и начнете развертывать DNS-записи действующего провайдера. В рамках этого мануала мы будем использовать условный DNS-провайдер, а вам нужно будет указать данные своего провайдера. В результате вы получите возможность управлять DNS и проверять конфигурацию в надежной оффлайн-среде, а затем автоматически развернуть ее в производство.

Требования

  • Сервер Ubuntu 18.04, настроенный по этому мануалу. В мануале мы будем использовать условные IP-адреса your-server-ipv4-address и your-server-ipv6-address.
  • FRDN и DNS от поддерживаемых провайдеров. Полный список таких провайдеров вы найдете здесь.
  • API ключ (токен доступа) вашего провайдера с правом на чтение и запись.

1: Установка OctoDNS

OctoDNS распространяется как pip-пакет для Python и работает в виртуальной среде (virtualenv), поэтому мы начнем с установки зависимостей. Virtualenv – это изолированная среда Python, которая позволяет устанавливать индивидуальные библиотеки и конфигурацию, при этом никак не влияя на общесистемную установку Python. Python и virtualenv доступны в стандартных репозиториях Ubuntu, что позволяет устанавливать их с помощью обычных инструментов управления пакетами.

Начните с обновления локального индекса пакетов, чтобы загрузить все новые версии:

sudo apt update

Затем установите пакеты python и virtualenv:

sudo apt install python virtualenv

После подтверждения установки apt загрузит и установит Python, virtualenv и все необходимые им зависимости.

Затем нужно создать необходимые каталоги для OctoDNS, где будут храниться настройки DNS и программы. Начните с создания каталогов ~/octodns и ~/octodns/config:

mkdir ~/octodns ~/octodns/config

Перейдите в ~/octodns:

cd ~/octodns

Затем нужно создать виртуальную среду Python – изолированную среду с индивидуальными библиотеками и конфигурацией. Она понадобится для запуска OctoDNS.

virtualenv env

Включите среду с помощью этой команды:

source env/bin/activate

Вы получите такой вывод:

Running virtualenv with interpreter /usr/bin/python2
New python executable in /home/user/octodns/env/bin/python2
Also creating executable in /home/user/octodns/env/bin/python
Installing setuptools, pkg_resources, pip, wheel...done.

В командной строке оболочки Bash теперь появится префикс с именем виртуальной среды. Это показывает, что в настоящее время вы работаете в рамках virtualenv:

(env) user@myserver:~/octodns$

Если вы хотите выйти из virtualenv, вы можете использовать команду deactivate. Но пока вы работает с этим мануалом, не выходите из virtualenv.

Вы установили и настроили Python и virtualenv, теперь вы можете установить OctoDNS. OctoDNS распространяется в виде pip-пакета Python. Инструмент pip является стандартным менеджером пакетов и библиотек Python.

Вы можете установить pip-пакет OctoDNS в virtualenv с помощью следующей команды:

pip install octodns

Запросите установленную версию, чтобы убедиться, что все работает:

octodns-sync --version

Вывод будет выглядеть примерно так:

octoDNS 0.9.6

Если вы видите ошибку:

octodns-sync: command not found

убедитесь, что вы находитесь в virtualenv.

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

2: Настройка OctoDNS

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

Примечание: В этом мануале мы сосредоточимся на базовой настройке OctoDNS; однако в среде производства рекомендуется хранить конфигурацию OctoDNS в системе управления версиями (VCS), например, в Git. Так вы получите полный контроль версий, интеграцию с CI/CD для тестирования, плавный откат развертываний и много других преимуществ.

Для начала нужно настроить файл config.yaml, который определяет DNS зоны для OctoDNS и позволяет ему пройти аутентификацию у DNS провайдера и вносить изменения.

Формат config.yaml немного отличается в зависимости от DNS провайдера. Пожалуйста, проверьте список поддерживаемых провайдеров в официальной документации OctoDNS, чтобы найти конфигурацию для вашего провайдера. По этой ссылке сведения о конфигурации представлены в виде комментариев в фактическом коде Python для вашего провайдера, а ссылка на этот код находится в столбце Provider. Найдя код Python для своего провайдера, вы можете найти и соответствующий комментарий к коду – он находится непосредственно под class ProviderNameProvider. Например:

class Route53Provider(BaseProvider):
'''
AWS Route53 Provider
route53:
class: octodns.provider.route53.Route53Provider
# The AWS access key id
access_key_id:
# The AWS secret access key
secret_access_key:
# The AWS session token (optional)
# Only needed if using temporary security credentials
session_token:

Перейдите в каталог ~/octodns/config:

cd ~/octodns/config

Создайте файл config.yaml:

nano config.yaml

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

---
providers:
config:
class: octodns.provider.yaml.YamlProvider
directory: ./config
default_ttl: 300
enforce_order: True
digitalocean:
class: octodns.provider.digitalocean.DigitalOceanProvider
token: your-digitalocean-oauth-token
zones:
your-domain.:
sources:
- config
targets:
- digitalocean

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

Этот файл помогает OctoDNS понять, к каким DNS-провайдерам вы хотите подключиться и какими DNS-зонами этих провайдеров он должен управлять.

Затем вам нужно настроить аутентификацию для вашего DNS-провайдера. Обычно для этого используется ключ API или токен OAuth.

Если вы не хотите хранить свой токен доступа в виде простого текста в конфигурационном файле, вы можете передать его как переменную среды при запуске программы. Чтобы сделать это, нужно использовать следующую строку token: в config.yaml:

token: env/MYPROVIDER\_OAUTH\_TOKEN

Затем перед запуском OctoDNS установите в соответствующей переменной среды ваш токен доступа, и OctoDNS прочитает его оттуда при запуске:

export MYPROVIDER\_OAUTH\_TOKEN=your-oauth-token

Важно! Этот токен предоставит доступ к учетной записи вашего DNS-провайдера, поэтому вы должны защищать его так же, как и пароль. Если вы используете систему контроля версий, убедитесь, что файл, содержащий токен, игнорируется ей (например, с помощью .gitignore), либо каким-либо образом надежно зашифрован.

Если у вас несколько разных DNS провайдеров – например, для нескольких доменных имен или делегированных зон DNS – вы можете определить их все в одном файле config.yaml.

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

3: Создание конфигурационного файла DNS

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

Каждая DNS-зона, которой вы хотите управлять с помощью OctoDNS, будет иметь свой собственный файл, например, your-domain.yaml. В этом файле определяются DNS записи зоны в формате YAML.

Для начала перейдите в каталог ~/octodns/config:

cd ~/octodns/config

Затем создайте файл your-domain.yaml и откройте его в редакторе:

nano your-domain.yaml

Добавьте следующие конфигурации в файл:

---
'':
- type: A
value: your-server-ipv4-address
www:
- type: A
value: your-server-ipv4-address

Этот файл определяет зону DNS с двумя записями A, указывающими на адрес IPv4, на котором вы размещаете свой домен или веб-сайт. Одна запись A предназначена для корневого домена (например, your-domain), а вторая – для субдомена с префиксом www (например, www.your-domain).

Сохраните и закройте файл.

Только что вы настроили базовый файл зоны DNS для OctoDNS с двумя основными записями A, указывающими на IPv4-адрес вашего домена или веб-сайта. Давайте расширим файл некоторыми полезными записями DNS.

4: Добавление других DNS-записей

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

В отличие от традиционных файлов зон BIND, куда записи DNS вносятся в простом построчном формате, записи DNS в OctoDNS определяются как ключи и подключи YAML с рядом связанных значений (как показано в разделе 3).

Ключом верхнего уровня обычно является ‘name’,  что по сути представляет идентификатор записи. Примеры DNS ‘name’: www, subdomain1 и mail. В OctoDNS есть два специальных имени: пара одинарных кавычек ” – для корневой записи (обычно обозначается как «@»);’*’ – для групповых записей. Обязательным значением каждого ключа (записи DNS) является type. Он определяет тип записи DNS в этом ключе верхнего уровня YAML. type поддерживает все стандартные типы записей DNS, включая A, AAAA, MX, TXT, NS, CNAME. Полный список доступных типов вы найдете здесь.

Значения для ваших записей DNS определяются либо в ключах верхнего уровня (если у вас только одно значение), либо в виде списка (если у вас есть несколько значений, например, несколько IP- или MX-адресов).

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

'www':
type: A
value: 203.0.113.1

Чтобы определить несколько значений для одной записи, используйте:

'www':
type: A
values:
- 203.0.113.1
- 203.0.113.2

Синтаксис настройки DNS-записей немного отличается для каждого типа. Ниже мы приведем примеры некоторых наиболее распространенных типов.

Записи А

Цель: направить на адрес IPv4.

Синтаксис:

'name':
type: A
value: ipv4-address

Пример:

'www':
type: A
value: your-server-ipv4-address

Записи АААА

Цель: направить на адрес IPv6.

Синтаксис:

'name':
type: AAAA
value: ipv6-address

Пример:

'www':
type: AAAA
value: your-server-ipv6-address

Записи CNAME

Цель: Сделать домен/поддомен алиасом другого домена.

Синтаксис:

'name':
type: CNAME
value: fully-qualified-domain-name

Пример:

'www':
type: CNAME
value: www.example.org

Записи MX

Цель: направить электронную почту на определенные серверы/адреса.

Синтаксис:

'name':
type: MX
value:
exchange: mail-server
preference: priority-value

Обратите внимание, если в значении MX присутствуют точки, нужно обязательно поставить точку в конце.

Пример:

'':
type: MX
value:
exchange: mail.your-domain.
preference: 10

Записи TXT

Цель: добавить произвольный простой текст (часто используется для конфигураций без собственного выделенного типа записи).

Синтаксис:

'name':
type: TXT
value: content

Пример:

'':
type: TXT
value: This is a TXT record.

Чтобы добавить DNS записи для вашего домена или делегированной зоны DNS, откройте конфигурационный файл DNS в редакторе:

cd ~/octodns/config
nano your-domain.yaml

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

Для справки приводим следующий блок кода. Он содержит полный список конфигураций для базовой настройки DNS:

---
'':
- type: A
value: your-server-ipv4-address
- type: AAAA
value: your-server-ipv6-address
- type: MX
value:
exchange: mail.your-domain.
preference: 10
- type: TXT
value: v=spf1 -all
_dmarc:
type: TXT
value: v=DMARC1\; p=reject\; rua=mailto:abuse@your-domain\; aspf=s\; adkim=s\;
mail:
- type: A
value: your-server-ipv4-address
- type: AAAA
value: your-server-ipv6-address
www:
- type: A
value: your-server-ipv4-address
- type: AAAA
value: your-server-ipv6-address

После завершения начальной настройки DNS сохраните и закройте файл.

Теперь давайте протестируем конфигурацию и развернем ее.

5: Тестирование и развертывание конфигурации DNS

Пора запустить локальную проверку синтаксиса DNS, а затем развернуть изменения на работающем DNS-сервере/провайдере.

Перейдите в каталог octodns:

cd ~/octodns

Убедитесь, что вы все еще находитесь в virtualenv, посмотрев на префикс в командной строке:

(env) user@myserver:~/octodns$

Далее, используйте команду octodns-validate, чтобы проверить синтаксис конфигурационных файлов. В команде необходимо указать путь к файлу:

octodns-validate --config=./config/config.yaml

Если синтаксис YAML вашего конфигурационного файла DNS правильный, OctoDNS не вернет никакого вывода. Если вы увидите сообщение об ошибке или предупреждение, в нем OctoDNS предоставит подробную информацию о том, где находится ошибка в файле.

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

octodns-sync --config=./config/config.yaml

Вы должны получить примерно такой вывод:

********************************************************************************
* your-domain.
********************************************************************************
* myprovider (MyProvider)
*   Create <ARecord A 300, mail.your-domain., ['your-server-ipv4-address']> (config)
*   Create <AaaaRecord AAAA 300, mail.your-domain., ['your-server-ipv6-address']> (config)
*   Create <TxtRecord TXT 300, your-domain., ['v=spf1 -all']> (config)
*   Create <AaaaRecord AAAA 300, your-domain., ['your-server-ipv6-address']> (config)
*   Create <ARecord A 300, your-domain., ['your-server-ipv4-address']> (config)
*   Create <ARecord A 300, www.your-domain., ['your-server-ipv4-address']> (config)
*   Create <MxRecord MX 300, your-domain., [''10 mail.your-domain.'']> (config)
*   Create <TxtRecord TXT 300, _dmarc.your-domain., ['v=DMARC1\; p=reject\; rua=mailto:abuse@your-domain\; aspf=s\; adkim=s\;']> (config)
*   Create <AaaaRecord AAAA 300, www.your-domain., ['your-server-ipv6-address']> (config)
*   Summary: Creates=9, Updates=0, Deletes=0, Existing Records=2
********************************************************************************

Примечание: Следующая команда внесет изменения в ваши записи DNS и, возможно, в другие настройки. На всякий случай сделаете резервную копию существующей конфигурации DNS, а также убедитесь, что у вас есть возможность откатить настройки, если это будет необходимо.

Наконец, вы можете загрузить изменения:

octodns-sync --config=./config/config.yaml --doit

Примечание: В некоторых случаях OctoDNS откажется от внесения изменений, если их будет очень много. Это функция автоматической защиты от случайных неправильных настроек. Если вы столкнулись с таким отказом, вы можете повторно запустить octodns-sync, используя опцию –force, но убедитесь, что вы готовы к этому.

Вы увидите вывод, подобный тому, что видели при пробном прогоне, но с новым фрагментом:

2019-07-07T23:17:27 INFO  MyProvider[myprovider] apply: making changes
2019-07-07T23:17:30 INFO  Manager sync:   9 total changes

Если сейчас вы проверите настройки DNS своего домена в панели управления провайдера, вы увидите все свои изменения.

Вы также можете проверить создание записи, запустив DNS-запрос для вашего домена или делегированной зоны с помощью команды dig.

dig +short your-domain

В выводе будет IP-адрес и соответствующая запись DNS из зоны, развернутой с помощью OctoDNS. На обновление записей DNS может уйти некоторое время, поэтому вам, возможно, придется подождать и запустить эту команду позже.

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

Заключение

Теперь вы умеете устанавливать и настраивать OctoDNS, а также выполнять настройку DNS для вашего провайдера.

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

Если вы хотите продолжить изучение этого вопроса, попробуйте интегрировать OctoDNS в конвейер CI/CD, что позволит вам проводить углубленные тесты и лучше контролировать развертывание в рабочей среде. Вы также можете изучить интеграцию OctoDNS в процессы сборки и развертывания инфраструктуры, что позволит вам развертывать серверы и автоматически добавлять их в DNS.

Читайте также:

Tags: , , , ,

Добавить комментарий