JANOG36 や DNS Summer Days 2015 で GMO の永井さんに OpenStack Designate というものを教わったので試してみる。
Designate とは、DNS コンテンツサーバを Web API で操作できる OpenStack コンポーネントである。OpenStack 自体を構築しなくても Designate 単体で動作させることができる。バックエンドには BIND9、PowerDNS、NSD4 などが使えるようだ。
環境
今回は Vagrant 上の VM に検証環境を構築する。OS は Ubuntu Server 15.04 を使用する。15.04 にしたのは、apt に Designate があったためである。また、Designate の VM は標準のメモリ 512MB だと動かなかったので、1GB に変更している。VM イメージは Vagrant Cloud にある Ubuntu オフィシャルのものを使う。VM の構成は下表の通り。
VM 名 | IP アドレス | 用途 | 備考 |
---|---|---|---|
node1 | 10.200.19.40 | Designate | Ubuntu 15.04; メモリ 1GB |
node2 | 10.200.19.41 | DNS | Ubuntu 14.04 |
node3 | 10.200.19.42 | DNS | Ubuntu 14.04 |
構成図は下記ページのような感じ。
- Architecture – designate documentation
ただし今回は Designate 単体で動かすので、Keystore は使用せず API の認証はなし (auth_strategy = noauth
) とする。また、Customer Facing DNS Servers (ユーザからリクエストを受ける DNS) には BIND を使用することにする。
インストール
インストールには、GitHub に置いておいた Vagrantfile と Ansible の playbook を使う。初回起動時はイメージをダウンロードするのに少々時間がかかる。
$ git clone https://github.com/akagisho/designate-ansible.git
$ cd designate-ansible
$ vagrant up
VM が起動したら自動的に Ansible の playbook が走る。これだけで構築が完了する。便利だね。
パッケージは次のものが入った。
vagrant@vagrant-ubuntu-vivid-64:~$ dpkg -l | grep -i designate
ii designate 2015.1.0-0ubuntu1.1 all OpenStack DNS as a Service - metapackage
ii designate-agent 2015.1.0-0ubuntu1.1 all OpenStack DNS as a Service - agent
ii designate-api 2015.1.0-0ubuntu1.1 all OpenStack DNS as a Service - API server
ii designate-central 2015.1.0-0ubuntu1.1 all OpenStack DNS as a Service - central daemon
ii designate-common 2015.1.0-0ubuntu1.1 all OpenStack DNS as a Service - common files
ii designate-doc 2015.1.0-0ubuntu1.1 all OpenStack DNS as a Service - doc
ii python-designate 2015.1.0-0ubuntu1.1 all OpenStack DNS as a Service - Python libs
ii python-designateclient 1.1.1-0ubuntu1 all client library for the OpenStack Designate API
Designate の設定の詳細は /etc/designate/designate.conf
を確認して欲しい。
使用例
Designate をインストールできたので早速使用してみよう。
まずはじめに、DNS サーバを Designate に登録する必要がある。ここでは名前を ns1.example.com.
, ns2.example.com.
とする。
$ curl -X POST -i -H 'Accept: application/json' -H 'Content-Type: application/json' -d \
'{"name": "ns1.example.com."}' \
http://10.200.19.40:9001/v1/servers
$ curl -X POST -i -H 'Accept: application/json' -H 'Content-Type: application/json' -d \
'{"name": "ns2.example.com."}' \
http://10.200.19.40:9001/v1/servers
ゾーン (example.net.
) を作成する。
$ curl -X POST -H 'Accept: application/json' -H 'Content-Type: application/json' -d \
'{
"name": "example.net.",
"email": "[email protected]"
}' http://10.200.19.40:9001/v1/domains
A レコード (www
) を登録してみる。URL の uuid の部分は、先にゾーンを作成したときに表示された id
を指定する。
$ curl -X POST -i -H 'Accept: application/json' -H 'Content-Type: application/json' -d \
'{
"name": "www.example.net.",
"type": "A",
"data": "192.168.1.1"
}' http://10.200.19.40:9001/v1/domains/bc9d25dd-76b6-499d-9492-d157a7b86683/records
Designate の MiniDNS で、登録したレコードが名前解決できるか確認してみる。MiniDNS はポート 5354 で動く、Customer Facing DNS へのゾーン転送や notify を送るためだけの必要最小限な DNS 実装である (たぶん)。
$ dig -p 5354 @10.200.19.40 www.example.net. a +short
192.168.1.1
動いてそうだ。次は Customer Facing DNS の BIND に問合せてみる。
$ for i in 10.200.19.41 10.200.19.42; do \
dig @$i www.example.net. a +short; done
192.168.1.1
192.168.1.1
こちらも動いてそうだ。
まとめ
OpenStack Designate の検証環境を構築し、動作を確認した。今後は以下のようなことを検証したい。
- 複数プールの作成
- CLI の使用
- NSD4 バックエンドの使用
- 既存 DNS からのゾーンのインポート
参考ページ
- GSLBをやってみた ~Designate&PowerDNS~ – JANOG36 Meeting
- REST API Documentation – designate
- DNSaaS な Designate と商用利用を調べる – OpenStack (2枚目) Advent Calender 2014
コメント