Kompira

Menu Menu

Enterprise Technical information

ジョブフローの簡単な例 DNSのゾーンファイルを編集する

ネットワークに新規のサーバーを追加した場合や、サーバーの入れ替えをした時など、DNSの設定を変更する場合があります。追加・変更する際にはbindのゾーンファイルを書き換えるのですが、管理者権限が必要になり、設定項目も注意が必要であり、運用上は気を使う作業の一つです。ここではKompiraを利用してDNSの登録情報の変更を行ってみましょう。今回の記事はnamedの設定とpythonの簡単な知識が前提となります。   事前準備 単純にサーバーの追加であれば、ゾーンファイルにAレコードを追加するのみですが、既存登録の変更となると単純ではありません。 ここではpythonの”dnspython”モジュールを利用しています。(動作確認にはバージョン1.15.0を使用しました。) 流れとしては以下の様になります。 * DNSサーバーから、ゾーンファイルをKompiraサーバーに転送 * Kompiraサーバーで、dnspythonの機能を使って編集 * 編集したファイルをDNSサーバーに再転送   dnspythonのインストール Kompiraサーバーにシェルログインを行った後、管理者権限のアカウントで以下の様にモジュールをインストールしてください。
# easy_install dnspython
(追記) Kompira1.5以降では、以下のようにパッケージをインストールします。
# /opt/kompira/bin/pip install dnspython
  ライブラリの作成 Kompiraからdnspythonを利用するためのラッパーライブラリを作成していきます。ここでは「DNSレコード編集」という名前の「ライブラリ型」のオブジェクトを作成します。以下の様なpythonのコードを記載します。 ライブラリ「DNSレコード編集」
import dns.zone
from dns.exception import DNSException
from dns.rdataclass import *
from dns.rdatatype import *

def change_A_record(oldzone, newzone, domain, key, new_IP):
# oldzone: 変更前のゾーンファイル
# newzone: 変更後のゾーンファイル
# domain : ドメイン名
# key    : キー(www,mail,ftpなど)
# new_IP : 変更後のIPアドレス
  
	try:
		zone = dns.zone.from_file(oldzone, domain)
		print "Zone origin:", zone.origin
	except DNSException, e:
		print e.__class__, e

	print "Changing A record for", key, "to", new_IP
	rdataset = zone.find_rdataset(key, rdtype=A)
	for rdata in rdataset:
		rdata.address = new_IP

	print "Writing modified zone to file %s" % newzone
	zone.to_file(newzone)
これで指定したドメイン名、キーに該当するレコードのIPアドレスを変更して、新しいゾーンファイルに保存する”change_A_record”というメソッドが利用できるようになります。   ジョブフローの作成 次にライブラリを利用するジョブフローを作成します。
|oldzone = "/var/named/mykompira.com.db"| # DNS上のゾーンファイル
|domain = "mykompira.com"|                # ドメイン名
|key = "mail"|                            # キー
|ip = "192.168.99.99" |                   # 変更後のIPアドレス
|tmpzone = "/tmp/tmpzone" |               # 作業用の一時ファイル(変更前)
|newzone = "/tmp/mykompira.com.db.new"|   # 作業用一時ファイル(変更後)
  
[__host__="ns.mykompira.com"] ->
[__user__="admin"] ->
[__password__="secret"] ->
[__sudo__=true] ->

get(oldzone, tmpzone) ->
["cat $tmpzone"] -> print($RESULT) ->  # 変更前のゾーン
[./DNSレコード編集.change_A_record: tmpzone, newzone, domain, key, ip] ->
put(newzone, oldzone) ->
["cat $newzone"] -> print($RESULT) ->   # 変更後のゾーン
["rndc reload"]
まず get() を利用して、DNSサーバーからゾーンファイルをKompiraサーバーにダウンロードします。 続いて、先に作成したchange_A_record()を呼び出して、ゾーン情報の編集を行います。結果はnewzoneに保存されます。 最後に変更後のゾーンファイル$newzoneをDNSサーバーに再アップロードして終了です。 (必要に応じてrndcコマンドでゾーン情報の再読み込みを行わせるなどの対応が必要です。) このようにしてdnspythonの機能を利用して既存のゾーン情報内のレコードの編集を行いましたが、他にもTTLの変更、ドメインの追加、ホストの追加・削除などを行う事が出来ます。上記と同様にライブラリにメソッドを追加してジョブフローから利用する事ができますが、詳細に関してはdnspythonのサイトを参照してください。 また、上記の例ではKompiraサーバー上にpythonライブラリをインストールしましたが、DNSサーバー上にインストールする事が可能であれば、Kompiraからはコマンド発行のみでゾーン情報の変更が出来るため、get/putのようなファイル転送は不要になります。DNSサーバーの認証情報についても「ノード情報」型オブジェクトを使用しても結構です。

スタートガイド

Kompiraジョブフローの基礎

ジョブフローの簡単な例

Kompiraの機能

外部との連携