ろーてくxyz blog

ローテクを駆使してIT関係でサヴァイヴしようとする人による備忘録

PowerDNS Authoritative Install Memo Part2

次の日投稿するはずが、AWSソリューションアーキテクトの試験を受けたりしてるうちに一月経ってしまいました。

PowerDNS AuthrititativeをInstallしてみるですが、Part1のPowerDNS導入の記事はこちら。
rotek.hateblo.jp

前回の記事ではPowerDNS Authoritativeのインストールまでを行いました。 今回はレコード編集操作用のWebインターフェースを導入してみます。

PowerDNS Frontendのサマリー

FrontendのPJについては、PowerDNSのgithubwikiにリストがあり、
使われている言語とLast Commitの日にちなどが書かれています。

github.com

2019/2時点でのリストは以下のような形
PowerDNSのAPIを叩くものと、BackendのDBを直接叩くものにわかれている。
個人の感想としては膨大なレコードを持っている場合は、API経由ではタイムアウトが発生し情報が取得できなくなるケースが私はありました。
ただしどのくらいのレコードボリュームなどの検証まではできてなく、普段GENERATE文などを多用してBulkをたくさん抱えてる方は検証などを取られた方が良いかもしれません。

PowerDNS Frontendを導入してみよう

今回はAPIベースで操作するPowerDNS-Adminを導入して見たいと思います。
Python/JSで作られているようです。

githubのアドレスはこちら github.com

Set Upを行う

GithubのREADME.mdを見る感じだと、docker imageも用意されているようなのですが今回はWiki pageに書かれている手順でサーバへインストールする方法でやりたいと思います。
基本的にはWikiに書かれている内容をこなせば起動まで確認ができます。(ですが、やった内容を一応残します)

Home · PowerDNS-Admin/PowerDNS-Admin Wiki · GitHub

MariaDB内にPowerDNS-Admin用のデータベースを作成する

PowerDNS Authoritativeをインストールした際に、BackendをMariaDBで構築を行いましたのでそのままMariaDBを使います。

MariaDB [(none)]> CREATE DATABASE powerdnsadmin CHARACTER SET utf8 COLLATE utf8_general_ci;
Query OK, 1 row affected (0.01 sec)

MariaDB [(none)]>
MariaDB [(none)]> GRANT ALL PRIVILEGES ON powerdnsadmin.* TO 'pdnsadminuser'@'%' IDENTIFIED BY 'ぱすわーど';
Query OK, 0 rows affected (0.00 sec)

MariaDB [(none)]>
MariaDB [(none)]> FLUSH PRIVILEGES;
Query OK, 0 rows affected (0.00 sec)

MariaDB [(none)]>
MariaDB [(none)]> \q
Bye

なお、大量のゾーンデータを扱う場合にはhistoryテーブルのデータ型をMEDIUMTEXTに変更しておいた方が良いと書かれているので必要な方は実施しましょう。

Python3.6関係をインストール

今回の対象OSはCentOS7系を利用しているのでその流れで作業していきます。
OSはクリーンインストールからの状態なので色々多様利用していない前提で作業をしています。

epelとiusのレポジトリを追加します。

# yum install epel-release
# yum install https://centos7.iuscommunity.org/ius-release.rpm
# yum install python36u python36u-devel python36u-pip
# pip3.6 install -U pip
# pip install -U virtualenv
# ln -s /usr/bin/python3.6 /usr/bin/python3

その他フレームワーク起動に必要なlibrary群をインストール

Backendの利用バージョンで必要なlibrary群が変わりますので公式Wikiを必ず参照。
今回はMariadb5.5系のため以下を入れました。

# yum install gcc mariadb-devel openldap-devel xmlsec1-devel xmlsec1-openssl libtool-ltdl-devel

またyarnとNodejs 10が必要なためインストールしておきます。

# curl -sL https://rpm.nodesource.com/setup_10.x | bash -
# curl -sL https://dl.yarnpkg.com/rpm/yarn.repo -o /etc/yum.repos.d/yarn.repo
# yum install yarn

Githubからソースコードのcloneしvirtualenvで環境を作成

# git clone https://github.com/ngoduykhanh/PowerDNS-Admin.git /opt/web/powerdns-admin
Cloning into '/opt/web/powerdns-admin'...
remote: Enumerating objects: 14, done.
remote: Counting objects: 100% (14/14), done.
remote: Compressing objects: 100% (11/11), done.
remote: Total 7678 (delta 3), reused 14 (delta 3), pack-reused 7664
Receiving objects: 100% (7678/7678), 31.54 MiB | 13.78 MiB/s, done.
Resolving deltas: 100% (3224/3224), done.

# cd /opt/web/powerdns-admin

# virtualenv -p python3 flask
Running virtualenv with interpreter /bin/python3
Using base prefix '/usr'
  No LICENSE.txt / LICENSE found in source
New python executable in /opt/web/powerdns-admin/flask/bin/python3
Also creating executable in /opt/web/powerdns-admin/flask/bin/python
Installing setuptools, pip, wheel...
done.
#
# source ./flask/bin/activate
(flask) # pip install python-dotenv
(flask) # pip install -r requirements.txt

PowerDNS-Adminの起動準備

flaskで起動するにあたり、config.pyが必要となります。 ソースコードをcloneした中身に、config_template.pyが存在するのでコピーして利用します。

(flask) # cp -p config_template.py config.py
(flask) # vim config.py

起動時にbindするアドレスとポートを指定しましょう。 SECRET KEYはブラウザでのCookieの署名に使うらしいので適宜文字列をいれておく。

# BASIC APP CONFIG
SECRET_KEY = '5qk8rzq2'
BIND_ADDRESS = 'ipアドレス'
PORT = 9191

PowerDNS-Admin用のDB接続情報を最低限設定する。

# DATABASE CONFIG
SQLA_DB_USER = 'pdnsadminuser'
SQLA_DB_PASSWORD = 'ぱすわーど'
SQLA_DB_HOST = '127.0.0.1'
SQLA_DB_PORT = 3306
SQLA_DB_NAME = 'powerdnsadmin'
SQLALCHEMY_TRACK_MODIFICATIONS = True

DBのスキーマ作成を行う

(flask) # export FLASK_APP=app/__init__.py
(flask) # flask db upgrade
INFO  [alembic.runtime.migration] Context impl MySQLImpl.
INFO  [alembic.runtime.migration] Will assume non-transactional DDL.
INFO  [alembic.runtime.migration] Running upgrade  -> 787bdba9e147, Init DB
INFO  [alembic.runtime.migration] Running upgrade 787bdba9e147 -> 59729e468045, Add view column to setting table
INFO  [alembic.runtime.migration] Running upgrade 59729e468045 -> 1274ed462010, Change setting.value data type
INFO  [alembic.runtime.migration] Running upgrade 1274ed462010 -> 4a666113c7bb, Adding Operator Role
INFO  [alembic.runtime.migration] Running upgrade 4a666113c7bb -> 31a4ed468b18, Remove all setting in the DB
INFO  [alembic.runtime.migration] Running upgrade 31a4ed468b18 -> 654298797277, Upgrade BD Schema
(flask) # 

yarnで必要なパッケージ類をインストールしwebassetsでgenerateする

(flask) # yarn install --pure-lockfile
yarn install v1.15.2
[1/4] Resolving packages...
[2/4] Fetching packages...
[3/4] Linking dependencies...
[4/4] Building fresh packages...
Done in 50.17s.
(flask) #
(flask) # flask assets build
Building bundle: generated/login.js
[INFO] Building bundle: generated/login.js
Building bundle: generated/validation.js
[INFO] Building bundle: generated/validation.js
Building bundle: generated/login.css
[INFO] Building bundle: generated/login.css
Building bundle: generated/main.js
[INFO] Building bundle: generated/main.js
Building bundle: generated/main.css
[INFO] Building bundle: generated/main.css
(flask) #

起動する

./run.pyを叩き起動する。
起動するとconfig.pyの中で指定している、Port 9191でListenし起動します。

(flask) # ./run.py
 * Serving Flask app "app" (lazy loading)
 * Environment: production
   WARNING: Do not use the development server in a production environment.
   Use a production WSGI server instead.
 * Debug mode: on
[INFO]  * Running on http://10.31.0.172:9191/ (Press CTRL+C to quit)
[INFO]  * Restarting with stat
[WARNING]  * Debugger is active!
[INFO]  * Debugger PIN: 712-980-236

Webブラウザからアクセスする

起動メッセージ内のRunning onにかかれているURLへアクセスを行います。(上記だとRunning on http://10.31.0.172:9191/)
アクセスができるとログイン画面が表示されますので、初回アクセス時は赤枠内のCreate an accountをクリックしログインユーザを作成します。

ユーザ作成後にこの画面に戻るので作成したユーザでログインする。

PowerDNSのAPI情報を設定する

初回ログイン後はこの画面になるため、PowerDNS上で設定しているAPI KeyAPI Endpointを入力する。

入力後

APIでの通信ができているかの確認をするためには、こちらの画面が表示されて値が取得されていれば大丈夫でしょう。
左ペインのPDNSを選択すると今のPowerDNSでの統計値が取得されます。

APIでの通信ができていない場合 統計値が取得できていない。

以上でWeb GUIからPowerDNSのバックエンドへAPI経由でのアクセスができるようになりました。
ただし、現状ですとrun.pyをコマンドを実行して起動している状態のみのWeb GUIが起動となります。

今回はここまででPart3で、nginxを使って常時起動する方法、レコードの更新操作周り、そして既存のBINDからのconfigインポート周りを書きたいと思います。