Инструменты торговли: Декларативный DNS с dnscontrol


💡 Немного контекста

Недавно я перенес хостинг своего сайта с DigitalOcean на fly.io. И тогда я понял, что уже много лет меняю DNS-записи вручную: захожу в панель Cloudflare, меняю записи, повторяю-повторяю…

Как программиста и самопровозглашенного фанатика автоматизации, меня это не устраивало, поэтому я решил что-то с этим сделать. Появился DNSControl.

🤔 Подождите, что это такое?

DNSControl — это платформа для беспрепятственного управления конфигурацией DNS на любом количестве DNS-хостов, как в облаке, так и в собственной инфраструктуре.

Она была создана StackOverflow для управления собственными доменами, а затем стала открытой для всех остальных (спасибо StackOverflow!).

Он позволяет объявлять записи DNS, используя DSL (язык доменов), похожий на JavaScript; например:

Хорошо, почему я должен переходить?

Переход на новый инструмент может быть пугающим, но вот несколько причин, которые делают DNScontrol непревзойденным (на мой взгляд):

  • Поддерживает 10+ DNS-провайдеров, включая BIND, AWS Route 53, Google DNS, Cloudflare и name.com.
  • Включение/отключение проксирования Cloudflare (кнопка «оранжевое облако») непосредственно из файлов DNSControl.
  • Примените принципы CI/CD к DNS: Unit-тесты, системные тесты, автоматическое развертывание.
  • Супер расширяемость! Архитектура подключаемых модулей позволяет легко добавлять новых DNS-провайдеров и регистраторов!
  • Устранение привязки к поставщику. Меняйте DNS-провайдеров легко, в любое время, с полной верностью.
  • Все преимущества Git (или любой другой VCS) для данных зоны DNS. Просмотр истории. Принимайте PR.

И многое другое!

🤨 Подождите! Я слышал мнение?

Все верно. DNSControl имеет свое мнение о том, как управлять DNS. Однако в этом нет ничего плохого. Давайте рассмотрим их мнения и посмотрим, какие из них действительно влияют на нас.

  1. С DNS следует обращаться как с кодом:Код пишется на языке высокого уровня, контролируется по версиям, комментируется, тестируется и проверяется третьей стороной… и все это происходит до того, как он попадает в производство.
  2. Неспециалисты должны иметь возможность безопасно вносить изменения в DNS.
  3. В языках, где есть такая концепция, все DNS пишутся в нижнем регистре.
  4. Пользователи должны указать, чего они хотят, а DNSControl должен сделать все остальное.
  5. Если это двусмысленно в DNS, то это запрещено в DNSControl.
  6. Имена хостов не имеют подчеркиваний.

Это абсолютно логично. Чтобы узнать больше о мнениях и их причинах, ознакомьтесь с документацией.

✅ Хорошо, я убежден. Как мне начать?

Рад это слышать! Чтобы начать, сначала установите DNSControl.

go install github.com/StackExchange/dnscontrol/v3@latest
Войдите в полноэкранный режим Выйдите из полноэкранного режима

Теперь создайте файл dnsconfig.js. В нем будут храниться все записи для вашего сайта (сайтов). Заполните его начальным шаблоном:

// Providers
var REG_NONE = NewRegistrar('none');    // No registrar.
var DNS_BIND = NewDnsProvider('bind');  // ISC BIND.

// Domains
D('example.com', REG_NONE, DnsProvider(DNS_BIND),
    A('@', '1.2.3.4')
);
Вход в полноэкранный режим Выйти из полноэкранного режима

Далее создайте файл creds.json для хранения конфигураций провайдера (токенов API и другой информации об аккаунте). Например, чтобы использовать как name.com, так и Cloudflare, необходимо:

{
  "cloudflare": {
    "TYPE": "CLOUDFLAREAPI",
    "accountid": "your-cloudflare-account-id",
    "apitoken": "your-cloudflare-api-token"
  },
  "namecom": {
    "TYPE": "NAMEDOTCOM",
    "apikey": "key",
    "apiuser": "username"
  },
  "none": { "TYPE": "NONE" } // the no-op provider
}
Войти в полноэкранный режим Выйти из полноэкранного режима

Полный список провайдеров и способы их использования можно найти в документации по провайдерам.

Внимание: Не забудьте добавить creds.json в ваш .gitignore перед фиксацией и переносом вашей конфигурации.

Теперь запустите команду dnscontrol preview и убедитесь, что она завершилась без ошибок. Команда предварительного просмотра — это режим «сухого прогона», который показывает, какие изменения нужно внести, но никогда не вносит никаких фактических изменений. При необходимости она будет использовать API, чтобы узнать, какие записи DNS существуют в настоящее время.

Результаты должны выглядеть примерно так:

dnscontrol preview
Initialized 1 registrars and 1 dns service providers.
******************** Domain: example.com
----- Getting nameservers from: bind
----- DNS Provider: bind... 1 correction
#1: GENERATE_ZONEFILE: example.com
 (2 records)

----- Registrar: none
Done. 1 corrections.
Вход в полноэкранный режим Выход из полноэкранного режима

Далее запустите dnscontrol push, чтобы действительно внести изменения. В данном случае изменения будут заключаться в создании файла зоны там, где его ранее не было.

dnscontrol push
Initialized 1 registrars and 1 dns service providers.
******************** Domain: example.com
----- Getting nameservers from: bind
----- DNS Provider: bind... 1 correction
#1: GENERATE_ZONEFILE: example.com
 (2 records)

CREATING ZONEFILE: zones/example.com.zone
SUCCESS!
----- Registrar: none
Done. 1 corrections.
Вход в полноэкранный режим Выход из полноэкранного режима

⚙️ У меня уже настроено много записей DNS. Как мне их импортировать?

С этой проблемой я столкнулся сам, и вот как вы импортируете существующие конфигурации DNS.

Большинство поставщиков услуг DNS имеют функцию «экспорта в файл зоны». (Если у вашего нет такой функции, перейдите на Cloudflare; это бесплатно, они импортируют все ваши записи во время настройки и позволят вам экспортировать файл зоны).

Поместите этот файл зоны в каталог zones в каталоге, где находится ваш dnsconfig.js. Переименуйте файл зоны в <domain>.zone. Теперь структура ваших каталогов должна выглядеть примерно так:

.
├── creds.json
├── dnsconfig.js
└── zones
    └── example.com.zone
Вход в полноэкранный режим Выход из полноэкранного режима

Далее выполните следующую команду:

dnscontrol get-zones --format=js --out=draft.js bind BIND example.com
Войти в полноэкранный режим Выйти из полноэкранного режима

Теперь вы можете скопировать содержимое draft.js в dnsconfig.js и изменить по необходимости.

🚀 И, наконец, несколько советов для запуска в продакшене

  • Храните файлы конфигурации в Git.
  • Зашифруйте или полностью опустите файл creds.json перед его хранением в Git. НЕ храните API-ключи или другие учетные данные без их шифрования.
  • Используйте инструмент CI/CD, например Github Actions/Jenkins/CircleCI/etc. для автоматического распространения изменений DNS.
  • Присоединяйтесь к сообществу DNSControl. Подавайте проблемы и PR.

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

Оцените статью
Procodings.ru
Добавить комментарий