URAMIRAIKAN

1020のなれの果て (since 2005.6.19)

PowerDNS-Adminをインストール

 PowerDNSをインストールしたので、管理のためのWeb UIです。
 GitHubのWikiにいろいろとリストアップされているので、ここからPowerDNS-Adminを選びました。
 PowerDNSとはAPIで連携、Python、最近も更新されている、なんとなくモダンな感じという適当な理由です。

 以前使っていたPoweradminはちょっと前に見たときはしばらく更新がなくて取り消し線が付いていたと思いますが、また復活していましたね。

 それでは早速インストールしていきますが、PowerDNS-Adminのインストール方法はWikiにまとまっているので、あまり迷うこともないと思います。
 環境の前提は前回のPowerDNSインストールを完了していること。PowerDNSと同じサーバに同居させます。

 まずは、諸般の事情でSELinuxを無効します。

# sed -i "s/SELINUX\=.*$/SELINUX=disabled/g" /etc/selinux/config
# setenforce 0

 次は、PowerDNS用データベースとは別に、PowerDNS-Admin用のデータベースを準備します。
 データベース名"pdnsadmin"、ユーザー名"pda"、パスワード"password"としています。

# mysql -h 127.0.0.1 -u root -p <<EOF
> CREATE DATABASE pdnsadmin CHARACTER SET utf8 COLLATE utf8_general_ci;
> GRANT ALL PRIVILEGES ON pdnsadmin.* TO 'pda'@'%' IDENTIFIED BY 'password';
> FLUSH PRIVILEGES;
> EOF

 Python 3.6を使うためIUSレポジトリを使います。
 ついでに後で必要となる開発系のパッケージもインストールしておきます。

# yum -y install https://centos7.iuscommunity.org/ius-release.rpm
# yum -y install python36u python36u-devel python36u-pip git python-pip python-devel openldap-devel xmlsec1-devel xmlsec1-openssl libtool-ltdl-devel MySQL-python

 Python 3.6のパッケージを入れたら、"pip"と"virtualenv"の最新化、"python3"コマンドの作成をしておきます。

# pip3.6 install -U pip
# pip install -U virtualenv
# ln -s /usr/bin/python3.6 /usr/bin/python3

 Yarnと依存性で必要になるNode.jsをインストールします。

# 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 -y install yarn

 GitHubからPowerDNS-Adminのレポジトリをクローンします。
 ここでは"/opt/PowerDNS-Admin"に配置します。

# cd /opt
# git clone https://github.com/ngoduykhanh/PowerDNS-Admin.git

 PowerDNS-Adminのディレクトリに移動し、Python 3.6用に"virtualenv"を使います。

# cd ./PowerDNS-Admin
# virtualenv -p python3 env

 Python 3.6の環境に入ってPythonの各種パッケージをインストールします。

# . ./env/bin/activate
(env) # pip install python-dotenv
(env) # pip install -r requirements.txt

 設定ファイルのテンプレートをコピーして、データベース情報の修正とリモートアクセスのためネットワーク情報を設定します。

(env) # cp -p ./config_template.py ./config.py
(env) # sed -i "s/SQLA_DB_USER \=.*$/SQLA_DB_USER = \'pda\'/g" ./config.py
(env) # sed -i "s/SQLA_DB_PASSWORD \=.*$/SQLA_DB_PASSWORD = \'password\'/g" ./config.py
(env) # sed -i "s/SQLA_DB_NAME \=.*$/SQLA_DB_NAME = \'pdnsadmin\'/g" ./config.py
(env) # sed -i "s/BIND_ADDRESS \=.*$/BIND_ADDRESS = \'0.0.0.0\'/g" ./config.py

 データベースの初期化とAssetファイル生成を実行します。

(env) # export FLASK_APP=app/__init__.py
(env) # flask db upgrade
(env) # yarn install --pure-lockfile
(env) # flask assets build

 ファイアウォールでポートを開放してからPowerDNS-Adminを起動します。

(env) # firewall-cmd --permanent --add-port=9191/tcp --zone=public
(env) # firewall-cmd --reload
(env) # ./run.py

 この時点では、フォアグラウンドかつデバッグモードで起動します。
 "http://<IPアドレス>:9191" へアクセスするとログイン画面が表示されるので、最初にユーザーを作成してからログインします(最初に作ったユーザーが管理ユーザーになります)。
 初回ログイン時に接続するPowerDNSのAPIエンドポイントやキーを設定してください。正しく設定できればPowerDNSの操作ができるはずです。



 これで動作確認はできましたが、実際に使うためにはサービス化する必要があると思います。
 そこでターミナルに戻って、[Ctrl]+[c]を押下してPowerDNS-Adminを終了してください。

 今回はアプリケーションサーバとしてGunicornを使っています。
 PowerDNS-Adminの"requirements.txt"にGunicornは記述してあるので、既にインストールされています。
 systemdで起動するためユニットファイル"/etc/systemd/system/pdns-admin.service"を以下の内容で作成します。


[Unit] Description=PowerDNS-Admin with Gunicorn After=network.target [Service] User=root Group=root WorkingDirectory=/opt/PowerDNS-Admin ExecStart=/opt/PowerDNS-Admin/env/bin/gunicorn --workers 2 --bind 0.0.0.0:8080 app:app [Install] WantedBy=multi-user.target

 TCPポート8080を使用していますが、環境に応じて適当に変更してください。
 あとはサービスの起動とファイアウォールのポート開放です。

# systemctl daemon-reload
# systemctl start pdns-admin.service
# systemctl enable pdns-admin.service
# firewall-cmd --permanent --add-port=8080/tcp --zone=public
# firewall-cmd --reload

 これで"http://<IPアドレス>:8080"でPowerDNS-Adminへアクセスできるようになったはずです。
 さらに考えるなら、Webサーバを使ってHTTPSにするとかでしょうか。


 とりあえず今回はここまで。