Статьи

Использование API Digital Ocean для управления вашим DNS

Конечный продукт
Что вы будете создавать

В ноябре 2014 года Digital Ocean анонсировала обновленную услугу DNS-хостинга . Помимо быстрой и надежной работы пользователи почти мгновенно обновляют записи DNS. Любой разработчик или системный администратор может оценить преимущества этого: больше не нужно ждать обновления IP-адресов во время миграции системы. В этом руководстве мы собираемся расширить функциональность консольного приложения, которое мы создали в прошлый раз, чтобы включить управление службой DNS Digital Ocean.

DNS-архитектура цифрового океана

Опять же, вы можете скачать бесплатное консольное приложение из репозитория Tuts + Github . Я разместил подробное руководство по установке консольного приложения на своем веб-сайте. Вы также можете ознакомиться с моим общим руководством по установке приложений Digital Ocean .

Хотя вы можете использовать веб-консоль Digital Ocean для управления своими записями DNS, вам может оказаться полезным программно управлять ими через API.

Документация по службам DNS API Digital Ocean расположена в двух основных областях:

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

Прежде чем вы сможете активировать собственные службы DNS Digital Ocean, вам необходимо перенести свои доменные серверы имен на серверы имен Digital Ocean:

  • ns1.digitalocean.com
  • ns2.digitalocean.com
  • ns3.digitalocean.com

Я собираюсь добавить свой домен StarWars.io для демонстрации этого урока. Вот мое изменение сервера имен у моего регистратора доменов:

Изменение ваших имен серверов

Вы также можете найти, как указывать на серверы имен DigitalOcean от обычных регистраторов доменов .

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

Веб-консоль Digital Ocean DNS

Нажмите Добавить домен :

DNS-консоль Digital Ocean Создать домен

Вот как Digital Ocean отображает вашу запись DNS. Хорошо, что он показывает вам сгенерированный файл зоны ниже:

Digital Ocean DNS веб-консоль доменное представление

Далее мы добавим запись домена A для www.starwars.io :

DNS-консоль Digital Ocean Добавить запись домена

Теперь давайте рассмотрим API, начав с загрузки некоторых доменов и записей доменов, которые мы только что создали.

Во-первых, давайте загрузим список наших доменов, используя API. В нашем консольном приложении нажмите Домены на панели навигации и выберите Синхронизация в правом меню.

Код DomainController выглядит следующим образом:

1
2
3
4
5
public function actionSync() {
     $domain = new Domain();
     $domain->sync();
     $this->redirect(‘/domain/admin’);
   }

Затем модель домена вызывает наши функции компонента Ocean и добавляет каждый найденный домен в нашу локальную базу данных:

1
2
3
4
5
6
7
public function sync() {
    $ocean = new Ocean();
    $domains = $ocean->getDomains();
    foreach ($domains as $d) {
      $domain_id = $this->add($d);
    }
  }

Вот код API из компонента Ocean для получения списка доменов:

1
2
3
4
5
6
7
public function getDomains() {
   // return the action api
   $action = $this->digitalOcean->domain();
   // return a collection of Action entity
   $actions = $action->getAll();
   return $actions;
 }

Вот метод доменной модели Add:

01
02
03
04
05
06
07
08
09
10
11
12
13
14
public function add($domain) {
      $d = Domain::model()->findByAttributes(array(‘name’=>$domain->name));
     if (empty($d)) {
       $d = new Domain;
     }
     $d->name = $domain->name;
       $d->ttl = $domain->ttl;
       $d->zone = $domain->zoneFile;
       $d->active =1;
      $d->created_at = $d->created_at;
      $d->modified_at =new CDbExpression(‘NOW()’);
      $d->save();
     return $d->id;
    }

Вы должны увидеть что-то вроде этого после завершения:

Наша консоль Yii Управление доменами

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

Наша Yii Консоль Доменного Представления

Затем давайте синхронизируем записи домена для starwars.io. Нажмите Sync Domain Records — это SyncRecords действие SyncRecords в DomainController :

1
2
3
4
5
public function actionSyncrecords($id) {
     $dr = new DomainRecord();
     $dr->sync($id);
     $this->redirect(‘/domain/view/’.$id);
   }

Метод DomainRecord модели DomainRecord выглядит следующим образом. Он делает запрос на записи доменного имени и добавляет каждую в таблицу DomainRecord в нашей локальной базе данных:

1
2
3
4
5
6
7
8
9
public function sync($id) {
     // lookup domain
      $d = Domain::model()->findByPk($id);
    $ocean = new Ocean();
    $records = $ocean->getDomainRecords($d->name);
    foreach ($records as $r) {
      $record_id = $this->add($id,$r);
  }
 }

Вот метод getDomainRecords компонента getDomainRecords :

1
2
3
4
5
public function getDomainRecords($name) {
   $action = $this->digitalOcean->domainRecord();
   $actions = $action->getAll($name);
   return $actions;
 }

DomainRecord добавления DomainRecord немного более детален:

01
02
03
04
05
06
07
08
09
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
public function add($domain_id,$record) {
      $dr = DomainRecord::model()->findByAttributes(array(‘record_id’=>$record->id));
     if (empty($dr)) {
       $dr = new DomainRecord;
     }
     $dr->domain_id = $domain_id;
     $dr->record_id = $record->id;
     $dr->record_name = $record->name;
     $dr->record_type = $record->type;
       $dr->record_data = $record->data;
       if (isset($record->priority))
         $dr->priority = $record->priority;
       else
         $dr->priority = null;
       if (isset($record->port))
         $dr->port = $record->port;
       else
         $dr->port = null;
       if (isset($record->weight))
         $dr->weight = $record->weight;
       else
         $dr->weight = null;
          
       $dr->active =1;
      $dr->created_at =new CDbExpression(‘NOW()’);
      $dr->modified_at =new CDbExpression(‘NOW()’);
      $dr->save();
     return $dr->id;
    }

Вот как это будет выглядеть после синхронизации записей домена:

Наша Yii Консоль Домена Просмотр после синхронизации доменных записей

Вы также можете добавить домены и доменные записи из нашей консоли вручную.

Наша консоль Yii Добавить домен

Вот код в модели Домена, который вызывает запрос API для добавления домена:

1
2
3
4
5
6
public function remote_add() {
         $ocean = new Ocean();
         $domain = $ocean->createDomain($this->name, $this->ip_address);
         $this->save();
         return true;
     }

Вот метод addDomain компонента addDomain :

1
2
3
4
5
public function createDomain($name,$ip_address) {
   $action = $this->digitalOcean->domain();
   $create = $action->create($name,$ip_address);
   return $create;
 }

Затем синхронизируйте записи домена и добавьте свои собственные:

Наша консоль Yii Добавить запись домена

Вот метод DomainRecord модели DomainRecord :

01
02
03
04
05
06
07
08
09
10
11
12
public function remote_add($id) {
        $d = Domain::model()->findByPk($id);
      $ocean = new Ocean();
      $record = $ocean->createDomainRecord($d->name,$this->record_type,$this->record_name,$this->record_data,$this->priority,$this->port,$this->weight);
      $this->domain_id = $id;
      $this->record_id = $record->id;
      $this->active =1;
      $this->created_at =new CDbExpression(‘NOW()’);
      $this->modified_at =new CDbExpression(‘NOW()’);
      $this->save();
      return true;
    }

Вот компонент Ocean, createDomainRecord метод createDomainRecord :

1
2
3
4
5
6
7
8
9
public function createDomainRecord($domain_name,$type,$name,$data,$priority,$port,$weight) {
   $domainRecord = $this->digitalOcean->domainRecord();
   if ($priority==») $priority=null;
   if ($port==») $port=null;
   if ($weight==») $weight=null;
   // return the created DomainRecord entity of the domain ‘bar.dk’
   $created = $domainRecord->create($domain_name,$type, $name, $data,$priority,$port,$weight);
   return $created;
 }

Вы должны увидеть что-то подобное в нашей консоли:

Наш домен Yii Console после синхронизации

Вот что показывает веб-консоль Digital Ocean — обратите внимание, что наше локальное представление и удаленное представление теперь идентичны:

Веб-консоль Digital Ocean - представление домена

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

Я надеюсь, что вы нашли это исследование DNS API Digital Ocean полезным.

Пожалуйста, не стесняйтесь оставлять свои вопросы и комментарии ниже. Вы также можете связаться со мной в Twitter @reifman или написать мне напрямую. Следуйте за моей страницей инструктора Tuts +, чтобы видеть будущие статьи на связанные темы