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

_Автор выбрал Electronic Frontier Foundation, чтобы получить пожертвование как часть Write для DOnations программа.

Вступление

OctoDNS - это инструмент infrastructure-as-code, который позволяет развертывать и управлять зонами DNS с использованием стандартных принципы разработки программного обеспечения, включая контроль версий, тестирование и автоматическое развертывание. OctoDNS был создан GitHub и написан на Python.

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

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

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

Предпосылки

Прежде чем начать это руководство, вам понадобится следующее:

  • Один сервер Ubuntu 18.04, настроенный по адресу Initial Server Setup с Ubuntu 18.04, включая sudo Пользователь root и включенный межсетевой экран для блокировки несущественных портов. «» и «» относятся к IP-адресам сервера, на котором вы размещаете свой сайт или домен.

  • Полностью зарегистрированное доменное имя с DNS-сервером, размещенное у поставщика supported. В этом руководстве будет использоваться ++ повсеместно, а DigitalOcean в качестве поставщика услуг.

  • Ключ API DigitalOcean (токен личного доступа) с разрешениями на чтение и запись. Чтобы создать его, посетите страницу How для создания токена личного доступа.

Как только они будут готовы, войдите на свой сервер как пользователь без полномочий root, чтобы начать.

Шаг 1 - Установка OctoDNS

OctoDNS распространяется как пип-пакет Python и работает в виртуальной среде Python (https://virtualenv.pypa.io/en/latest/ [+ 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 - изолированную среду Python с собственными библиотеками и конфигурацией для запуска OctoDNS в:

virtualenv

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

source /bin/activate

Это выведет что-то похожее на следующее:

OutputRunning 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@digitalocean:~/octodns$

Если вы хотите выйти из + virtualenv +, вы можете использовать команду + deactivate + в любое время. Тем не менее, вы должны остаться в вашем + virtualenv +, чтобы продолжить изучение этого урока.

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

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

pip install octodns

После этого вы можете проверить установленную версию, чтобы убедиться, что все работает:

octodns-sync --version

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

OutputoctoDNS

Если вы видите ошибку + octodns-sync: command not found, перепроверьте, что вы все еще находитесь в вашем` + virtualenv`.

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

Шаг 2 - Настройка OctoDNS

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

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

Формат + config.yaml + немного отличается в зависимости от используемого вами провайдера DNS. Обратитесь к Supported списка провайдеров в официальной документации OctoDNS, чтобы найти конфигурацию для вашего собственного провайдера. При просмотре этой гиперссылки сведения о конфигурации представлены в виде комментария к коду в фактическом коде Python для вашего провайдера, который связан в столбце «Провайдер» таблицы. Как только вы нашли код Python для своего провайдера, такой как + cloudflare.py + или + route53.py +, соответствующий комментарий кода можно найти непосредственно под + class + + Provider +. Например:

Выдержка из 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. Если вы используете DigitalOcean в качестве поставщика DNS, вы можете использовать следующее:

~ / Octodns / конфигурации / config.yaml

---
providers:
 config:
   class: octodns.provider.yaml.YamlProvider
   directory: ./config
   default_ttl: 300
   enforce_order: True
 digitalocean:
   class: octodns.provider.digitalocean.DigitalOceanProvider
   token:

zones:
 .:
   sources:
     - config
   targets:
     - digitalocean

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

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

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

~ / Octodns / конфигурации / config.yaml

token: env/DIGITALOCEAN\_OAUTH\_TOKEN

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

export DIGITALOCEAN\_OAUTH\_TOKEN=

Если вы используете DigitalOcean в качестве провайдера DNS, вы можете использовать требуемый токен OAuth https://cloud.digitalocean.com/settings/applications в настройках учетной записи DigitalOcean], который вы сгенерировали как часть предварительных условий.

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

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

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

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

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

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

cd ~/octodns/config

Затем создайте и откройте + .yaml + для редактирования:

nano .yaml

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

~ / Octodns / конфигурации / ваш-domain.yaml

---
'':
 - type: A
   value:

www:
 - type: A
   value:

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

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

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

Шаг 4 - Заполнение вашего файла конфигурации DNS

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

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

Ключом верхнего уровня обычно является + 'name' +, который по сути является идентификатором записи. + www,` + поддомен 1` и + mail + - все это примеры DNS + 'name' +. В OctoDNS есть два специальных имени, которые + '' +, для корневой записи (обычно называемые + @ +), и + '*' +, для записей с подстановочными знаками. Обязательным значением каждого ключа (записи DNS) является + type +. Это определяет, какой тип записи DNS вы определяете в этом ключе верхнего уровня YAML. + Type + существует для каждого из стандартных типов записей DNS, включая + A +, + AAAA,` + MX + , + TXT`, + N +, + CNAME и так далее. Полный список доступных типов записей доступен в разделе Records документации OctoDNS.

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

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

~ / Octodns / конфигурации / ваш-domain.yaml

'www':
 type: A
 value: 203.0.113.1

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

~ / Octodns / конфигурации / ваш-domain.yaml

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

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

+ A + записи:

Цель: указать на адрес IPv4.

Синтаксис:

'':
 type: A
 value:

Пример:

'':
 type: A
 value:
+ AAAA + records:

Цель: указать на адрес IPv6.

Синтаксис:

'':
 type: AAAA
 value:

Пример:

'':
 type: AAAA
 value:

+ CNAME + records:

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

Синтаксис:

'':
 type: CNAME
 value:

Пример:

'':
 type: CNAME
 value:

+ MX + записи:

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

Синтаксис:

'':
 type: MX
 value:
   exchange:
   preference:

Обратите внимание, что завершающий +. + * Должен * быть включен, если в значении MX есть какие-либо точки.

Пример:

'':
 type: MX
 value:
   exchange: .
   preference:

+ TXT + records:

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

Синтаксис:

'':
 type: TXT
 value:

Пример:

'':
 type: TXT
 value:

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

cd ~/octodns/config
nano .yaml

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

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

~ / Octodns / конфигурации / ваш-domain.yaml

---
'':
 - type: A
   value:

 - type: AAAA
   value:

 - type: MX
   value:
     exchange: mail..
     preference: 10

 - type: TXT
   value: v=spf1 -all

_dmarc:
 type: TXT
 value: v=DMARC1\; p=reject\; rua=mailto:abuse@\; aspf=s\; adkim=s\;

mail:
 - type: A
   value:

 - type: AAAA
   value:

www:
 - type: A
   value:

 - type: AAAA
   value:

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

На этом этапе вы настраиваете исходный файл конфигурации DNS, содержащий ваши записи DNS. Далее вы протестируете конфигурацию и развернете ее.

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

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

Сначала перейдите в каталог + octodns +:

cd ~/octodns

Дважды проверьте, что вы все еще работаете в Python + virtualenv +, посмотрев его имя перед приглашением Bash:

(env) user@digitalocean:~/octodns$

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

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

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

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

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

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

Это должно привести к выводу, подобному следующему:

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

Наконец, вы можете отправить изменения в ваш живой DNS-провайдер:

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

На этом шаге вы увидите вывод, подобный пробному запуску ранее, но с добавлением чего-то похожего на следующее:

Output2019-07-07T23:17:27 INFO  DigitalOceanProvider[digitalocean] apply: making changes
2019-07-07T23:17:30 INFO  Manager sync:   9 total changes

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

image: https: //assets.digitalocean.com/articles/dnscontrols1804/step5.png [Снимок экрана панели управления DigitalOcean, показывающий некоторые изменения DNS, внесенные OctoDNS.]

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

dig +short

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

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

Заключение

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

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

Если вы хотите продолжить работу с OctoDNS, в следующих статьях DigitalOcean представлены некоторые интересные следующие шаги, которые помогут интегрировать OctoDNS в рабочие процессы управления изменениями и развертывания инфраструктуры:

Related