PowerDNSの状態やゾーンを管理するコマンド. 動作としては,PowerDNSのバックエンドのデータベースの操作を行う. pdns_control はPowerDNSにコマンドを送信するための物なので用途が違う. PowerDNSのバックエンドのデータベースの操作が可能なので,Slaveの管理や,TSIG KEYの管理などを行える. また,元々は pdnssec というコマンドであり,DNSSECまわりの鍵の追加なども行える. 自分はDNSSECが好きではないので,見なかった事にする.

Slaveの管理

PowerDNSのデータベース系のバックエンドでは domainmetadata というテーブルにゾーンのメタデータを格納している. このテーブルにNofity先や転送の許可などを行うことで,PowerDNSのSlaveの管理を行える,

pdnsutil コマンドを用いて以下のように設定を行うことが出来る.

$ pdnsutil set-meta example.com. ALLOW-AXFR-FROM 1.1.1.1
$ pdnsutil set-meta example.com. ALSO-NOTIFY 1.1.1.1

これらのコマンドを実行すると, domainmetadata には以下のようにデータが登録される.

MariaDB [pdns]> select id, name from domains where name='example.com';
+----|-------------+
| id | name        |
+----|-------------+
|  9 | example.com |
+----|-------------+
1 row in set (0.00 sec)

MariaDB [pdns]> select * from domainmetadata;
+----|-----------|-----------------|------------+
| id | domain_id | kind            | content    |
+----|-----------|-----------------|------------+
|  8 |         9 | ALLOW-AXFR-FROM | 1.1.1.1    |
|  9 |         9 | ALSO-NOTIFY     | 1.1.1.1    |
+----|-----------|-----------------|------------+
2 rows in set (0.00 sec)

pdnsutil は複数の値を登録する事も出来る.

$ pdnsutil set-meta example.com. ALLOW-AXFR-FROM 1.1.1.1 2.2.2.2 3.3.3.3
$ pdnsutil set-meta example.com. ALSO-NOTIFY  1.1.1.1 2.2.2.2 3.3.3.3

これらのコマンドを実行すると,データベースは以下のようになる

MariaDB [pdns]> select * from domainmetadata;
+----|-----------|-----------------|------------+
| id | domain_id | kind            | content    |
+----|-----------|-----------------|------------+
| 10 |         9 | ALLOW-AXFR-FROM | 1.1.1.1    |
| 11 |         9 | ALLOW-AXFR-FROM | 2.2.2.2    |
| 12 |         9 | ALLOW-AXFR-FROM | 3.3.3.3    |
| 13 |         9 | ALSO-NOTIFY     | 1.1.1.1    |
| 14 |         9 | ALSO-NOTIFY     | 2.2.2.2    |
| 15 |         9 | ALSO-NOTIFY     | 3.3.3.3    |
+----|-----------|-----------------|------------+
6 rows in set (0.00 sec)

また, pdnsutil は,実行の羃等性が担保されているので,現状,3つのSlaveがある状態で,Slaveの個数を2つに減らすようにコマンドを実行した場合には正しくデータベースの削除も行なってくれる. 以下のコマンドを実行する

$ pdnsutil set-meta example.com. ALLOW-AXFR-FROM 1.1.1.1 3.3.3.3
$ pdnsutil set-meta example.com. ALSO-NOTIFY  1.1.1.1 3.3.3.3

データベースは以下のようになる.

MariaDB [pdns]> select * from domainmetadata;
+----|-----------|-----------------|------------+
| id | domain_id | kind            | content    |
+----|-----------|-----------------|------------+
| 16 |         9 | ALLOW-AXFR-FROM | 1.1.1.1    |
| 17 |         9 | ALLOW-AXFR-FROM | 3.3.3.3    |
| 18 |         9 | ALSO-NOTIFY     | 1.1.1.1    |
| 19 |         9 | ALSO-NOTIFY     | 3.3.3.3    |
+----|-----------|-----------------|------------+
4 rows in set (0.01 sec)

となり,便利にSlaveを管理する事が出来る. AnsibleなどでSlaveを管理したい場合は,MySQLを直接扱うよりも,pdnsutilコマンドを実行した方が安全. また,存在しないゾーンに対して, pdnsutil コマンドを使用しても,データベースに登録されないだけなので,たいした問題はない.