Table of Contents
*Автор выбрал фонд Electronic Frontier Foundation для получения пожертвований в рамках программы Write for DOnations.*
Введение
OctoDNS — это инструмент, созданный по принципу «инфраструктура как код», который поддерживает развертывание и управление зонами DNS с использованием стандартных принципов разработки программного обеспечения, включая контроль версий, тестирование и автоматизированное развертывание. OctoDNS был разработан GitHub и написан на языке Python.
Использование OctoDNS помогает избавиться от многих сложностей ручного управления DNS, поскольку файлы зон хранятся в структурированном формате (YAML). Инструмент позволяет одновременно развертывать зоны для нескольких поставщиков DNS, определять ошибки синтаксиса и автоматически извлекать конфигурации DNS, за счет чего снижается риск человеческой ошибки. Также OctoDNS часто используется для синхронизации конфигурации DNS разных провайдеров, в частности между тестовыми и производственными системами или между работающими и резервными средами.
Инструмент OctoDNS аналогичен инструменту DNSControl, созданному Stack Exchange и написанному на Go. В отличие от OctoDNS, в DNSControl для определения зон DNS используется язык конфигурации на базе JavaScript, что позволяет использовать различные функции программирования (например циклы) для определения нескольких похожих записей в одной зоне. Статья Развертывание и управление DNS с помощью DNSControl в Debian 10 рассказывает об основах настройки и конфигурации DNSControl.
В этом обучающем руководстве мы научимся устанавливать и настраивать OctoDNS, создадим базовую конфигурацию DNS и начнем развертывание записей DNS на рабочем провайдере. Для этого обучающего руководства мы используем the cloud provider в качестве примера провайдера DNS. Если вы хотите использовать другого провайдера, настройки будут выглядеть очень похоже. После завершения работы вы сможете управлять своей конфигурацией DNS и тестировать ее в безопасной среде, отключенной от сети, а затем автоматически развертывать в производственной среде.
Предварительные требования
Для прохождения этого обучающего руководства вам потребуется следующее:
- Один сервер Debian 10, настроенный в соответствии с указаниями материала Начальная настройка сервера Debian 10, включая пользователя sudo без привилегий root и активированный брандмауэр для блокировки ненужных портов.
<^>your-server-ipv4-address<^>и<^>your-server-ipv6-address<^>означают IP-адреса сервера, где будет размещаться ваш сайт или домен.
- Полностью зарегистрированное доменное имя с хостингом DNS у поддерживаемого провайдера. В этом обучающем модуле мы используем доменное имя
<^>your-domain<^>и the cloud provider как провайдера услуги.
- Ключ cloud provider API (персональный токен доступа) с разрешениями чтения и записи. Его создание описано в материале Создание персонального токена доступа.
Подготовив все вышеперечисленное, войдите на сервер без привилегий root, чтобы начать подготовку.
Шаг 1 — Установка OctoDNS
OctoDNS распространяется как пакет Python pip и выполняется в виртуальной среде Python (virtualenv), так что мы начнем этот шаг с установки необходимых пакетов. virtualenv — это изолированная среда Python, которая может иметь собственные библиотеки и конфигурацию, отдельные от основной версии Python в системе. Python и virtualenv доступны в репозиториях программного обеспечения Debian по умолчанию, и поэтому их можно установить с помощью стандартных инструментов управления пакетами.
Для начала мы обновим указатель локальных пакетов, чтобы отразить последние изменения на предыдущих уровнях:
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. Это изолированная среда Python с собственными библиотеками и конфигурацией, где будет работать OctoDNS:
virtualenv <^>env<^>
Активируем среду с помощью следующей команды:
source <^>env<^>/bin/activate
Будет выведен текст следующего вида:
[secondary_label Output]
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@the cloud provider:~/octodns$
Если мы захотим выйти из virtualenv, мы можем использовать команду deactivate в любой момент. Однако нам необходимо оставаться в среде virtualenv, чтобы продолжить выполнение этого обучающего руководства.
Теперь вы установили и настроили Python и среду virtualenv и можете выполнить установку OctoDNS. OctoDNS распространяется как пакет Python pip (стандартный инструмент управления пакетами и библиотеками Python).
Мы можем установить пакет OctoDNS pip с помощью команды в среде virtualenv:
pip install octodns
После этого мы можем проверить установленную версию и убедиться, что все работает правильно:
octodns-sync --version
Экран результатов должен выглядеть примерно следующим образом:
[secondary_label Output]
octoDNS <^>0.9.9<^>
Если будет выведено сообщение об ошибке octodns-sync: command not found, необходимо повторно убедиться, что мы находимся в среде virtualenv.
Итак, мы установили OctoDNS и можем создавать требуемые файлы конфигурации для подключения OctoDNS к провайдеру DNS для предоставления возможности изменения записей DNS.
Шаг 2 — Настройка OctoDNS
На этом шаге мы создадим требуемые файлы конфигурации OctoDNS и подключимся к провайдеру DNS, чтобы иметь возможность внести изменения в записи DNS.
Примечание. В этом обучающем руководстве мы рассматриваем начальную настройку OctoDNS, но для использования в производственной среде рекомендуется хранить конфигурацию OctoDNS в системе контроля версий (VCS), такой как Git. Это дает преимущества полного контроля версий, интеграции с CI/CD для тестирования, удобства откатов при развертывании и т. д.
Вначале нам нужно настроить файл config.yaml, который определит зоны DNS для управления OctoDNS и позволит проводить аутентификацию у провайдера DNS и вносить изменения.
Формат файла config.yaml может немного отличаться в зависимости от используемого провайдера DNS. Ознакомьтесь со списком поддерживаемых провайдеров в официальной документации OctoDNS, чтобы найти конфигурацию для вашего провайдера. При просмотре этой гиперссылки детали конфигурации выводятся как комментарий к коду в фактическом коде Python нашего провайдера, привязанного в столбце Provider в таблице. Когда мы найдем код Python нашего провайдера, например cloudflare.py или route53.py, соответствующий комментарий к коду можно будет найти в классе <^>ProviderName<^>Provider. Например:
[label Excerpt of octodns/provider/route53.py]
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
Добавьте в файл образец конфигурации config.yaml для вашего провайдера DNS. Если вы используете the cloud provider в качестве своего провайдера DNS, вы можете использовать следующее:
[label ~/octodns/config/config.yaml]
---
providers:
config:
class: octodns.provider.yaml.YamlProvider
directory: ./config
default_ttl: 300
enforce_order: True
the cloud provider:
class: octodns.provider.the cloud provider.the cloud providerProvider
token: <^>your-the cloud provider-oauth-token<^>
zones:
<^>your-domain<^>.:
sources:
- config
targets:
- the cloud provider
Этот файл сообщает OctoDNS, к каким провайдерам DNS требуется подключаться и какими зонами DNS нужно управлять для этих провайдеров.
Необходимо указать форму аутентификации для провайдера DNS. Обычно это ключ API или токен OAuth.
Если вы не хотите хранить токен доступа в текстовой форме в файле конфигурации, вы можете передать его в переменную среды при запуске программы. Для этого нужно использовать следующую строку token: в файле config.yaml:
[label ~/octodns/config/config.yaml]
token: env/the cloud provider\_OAUTH\_TOKEN
Перед запуском OctoDNS необходимо задать следующую переменную среды для токена доступа, и OctoDNS будет считывать ее в месте запуска:
export the cloud provider\_OAUTH\_TOKEN=<^>your-the cloud provider-oauth-token<^>
[warning]
Предупреждение. Этот токен предоставляет доступ к учетной записи провайдера DNS, так что его следует защитить паролем. Также необходимо убедиться, что если вы используете систему контроля версий, файл с токеном исключен (например, с помощью .gitignore) или зашифрован.
Если в качестве провайдера DNS используется the cloud provider, можно использовать требуемый токен OAuth в параметрах учетной записи the cloud provider, сгенерированных при выполнении предварительных требований.
Если вы используете нескольких провайдеров 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
Добавим в файл следующий образец конфигурации:
[label ~/octodns/config/your-domain.yaml]
---
'':
- type: A
value: <^>your-server-ipv4-address<^>
www:
- type: A
value: <^>your-server-ipv4-address<^>
В этом файле образца определяется зона DNS для <^>your-domain<^> с двумя записями A, указывающими на адрес IPv4, на котором размещен домен или сайт. Одна запись A предназначена для корневого домена (например, <^>your-domain<^>), а другая — для субдомена www (например, www.<^>your-domain<^>).
После завершения следует сохранить и закрыть файл.
Мы настроили базовый файл конфигурации зоны DNS для OctoDNS с двумя базовыми записями A, указывающими на адрес IPv4 вашего домена или сайта. Далее мы заполним файл полезными записями DNS.
Шаг 4 — Заполнение файла конфигурации DNS
Теперь мы можем заполнить файл конфигурации DNS практическим набором записей DNS для нашего сайта или сервиса, используя струткурированный язык конфигурации YAML.
В отличие от традиционных файлов зоны BIND, где записи DNS записаны в необработанном построчном формате, записи DNS в OctoDNS определены как ключи и подключи YAML с рядом связанных значений, как кратко показано на шаге 3.
Ключ 'name' обычно является ключом верхнего уровня, то есть идентификатором записи. Ключи www, subdomain1 и mail являются примерами ключа name службы DNS. В OctoDNS имеется два имени специального назначения: " для корневой записи (обычно @), и '*' для записей с подстановочными символами. Для каждого ключа (записи DNS) требуется значение type. Оно определяет, какой тип записей DNS мы определяем ключом YAML верхнего уровня. Значение type существует для каждого из стандартных типов записей DNS, в том числе A, AAAA, MX, TXT, NS, CNAME и т. д. Полный список доступных типов записей можно найти в разделе Записи в документации по OctoDNS.
Значения записей DNS определяются напрямую как значения ключей верхнего уровня (если используется только одно значение) или в форме списка (если используется несколько значений, например несколько IP-адресов или адресов MX).
Например, для определения одного значения можно использовать следующую конфигурацию:
[label ~/octodns/config/your-domain.yaml]
'www':
type: A
value: 203.0.113.1
Также можно определить несколько значений для одной записи:
[label ~/octodns/config/your-domain.yaml]
'www':
type: A
values:
- 203.0.113.1
- 203.0.113.2
Синтаксис настройки записей DNS немного отличается для каждого типа записей. Далее приведены несколько примеров наиболее распространенных типов записей:
Записи A:
Назначение: указывают на адрес IPv4.
Синтаксис:
'<^>name<^>':
type: A
value: <^>ipv4-address<^>
Пример:
'<^>www<^>':
type: A
value: <^>your-server-ipv4-address<^>
Записи AAAA:
Назначение: указывают на адрес 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, предназначенный для справочных целей:
[label ~/octodns/config/your-domain.yaml]
---
'':
- 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 следует сохранить и закрыть файл.
На этом шаге мы можем настроить начальный файл конфигурации DNS, содержащий наши записи DNS. Далее нам нужно будет протестировать конфигурацию и развернуть ее.
Шаг 5 — Тестирование и развертывание конфигурации DNS
На этом шаге мы проведем проверку локального синтаксиса нашей конфигурации DNS, а затем внесем изменения на рабочий сервер/провайдер DNS.
Вначале мы перейдем в директорию octodns:
cd ~/octodns
Еще раз проверим, что мы работаем в среде Python virtualenv, посмотрев на имя перед Bash в командной строке:
(env) user@the cloud provider:~/octodns$
Затем используем команду octodns-validate для проверки синтаксиса файла или файлов конфигурации. Также необходимо указать путь к файлу конфигурации:
octodns-validate --config=./config/config.yaml
Если синтаксис YAML конфигурации DNS правильный, OctoDNS не выводит никаких результатов. Если вы увидите предупреждение об ошибке в составе результатов, OctoDNS даст дополнительные данные о сущности ошибки и ее местонахождении в файле YAML.
Далее можно выполнить пробную установку конфигурации DNS. При этом будет показано, какие будут произведены изменения, но выполняться они не будут:
octodns-sync --config=./config/config.yaml
Результат должен выглядеть примерно так:
[secondary_label Output]
********************************************************************************
* <^>your-domain<^>.
********************************************************************************
* the cloud provider (the cloud providerProvider)
* 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
********************************************************************************
[warning]
Предупреждение. Следующая команда вносит изменения в рабочие записи DNS и, возможно, в другие параметры. Необходимо убедиться, что мы готовы к этому. В частности, следует сделать резервную копию существующий конфигурации DNS на случай, если потребуется произвести откат.
В заключение мы можем передать изменения на рабочий провайдер DNS:
octodns-sync --config=./config/config.yaml --doit
Примечание. В некоторых случаях OctoDNS может отказаться применять изменения, если количество модификаций значительно. Это функция автоматической защиты, которая позволит предотвратить случайные ошибки конфигурации. В случае такого отклонения можно повторно запустить octodns-sync с опцией --force, но при этом нужно быть уверенным в правильности этого шага.
Вы увидите результаты, похожие на показанные при пробном запуске, однако при этом будет добавлено примерно следующее:
[secondary_label Output]
2019-07-07T23:17:27 INFO the cloud providerProvider[the cloud provider] apply: making changes
2019-07-07T23:17:30 INFO Manager sync: 9 total changes
Если теперь мы проверим параметры DNS нашего домена на панели управления the cloud provider, мы увидим изменения.
Также мы можем проверить создание записи, отправив запрос DNS для нашего домена или делегированной зоны с помощью команды dig.
Если команда dig не установлена, необходимо установить пакет dnsutils:
sudo apt install dnsutils
После установки команды dig мы сможем использовать ее для запроса DNS нашего домена. Мы увидим, что записи обновлены соответствующим образом:
dig +short <^>your-domain<^>
В результатах выводится IP-адрес и запись DNS из вашей зоны, которая была развернута с помощью OctoDNS. Распространение записей DNS может занять некоторое время, поэтому можно подождать и запустить команду чуть позже.
На этом заключительном шаге мы выполнили проверку локального синтаксиса файла конфигурации DNS, развернули его на рабочем провайдере DNS и убедились, что изменения были внесены успешно.
Заключение
В этом обучающем руководстве мы выполнили настройку OctoDNS и развертывание конфигурации DNS на рабочем провайдере. Теперь мы можем управлять изменениями конфигурации DNS и тестировать их в безопасной автономной среде, прежде чем внедрять их в рабочую среду.
Если вы хотите узнать об этом больше, OctoDNS предусматривает интеграцию с конвейером CI/CD, что позволяет проводить детальные испытания и обеспечивает дополнительный контроль над развертыванием в производственной среде. Также можно интегрировать OctoDNS в процессы сборки и развертывания инфраструктуры, что позволит развертывать серверы и добавлять их в службу DNS в полностью автоматическом режиме.
Если вы хотите узнать больше о возможностях OctoDNS, в следующих статьях the cloud provider вы найдете интересную информацию о следующих шагах по интеграции OctoDNS в рабочие процессы управления изменениями и развертывания инфраструктуры: