Python: dnspythonでAレコードを追加して削除する

この記事ではdnspythonを使ってzoneファイルにAレコードを追加して削除するサンプルプログラムを記載します。

1 dnspythonのインストール

Ubuntuの場合はpython-dnspythonパッケージをインストールします。CentOSの場合はpython-dnsパッケージに組み込まれています。

$ sudo apt install -y python-dnspython # Ubuntu
$ sudo yum install -y python-dns       # CentOS

dnspythonがパッケージングされていないディストリビューションの場合はpipでインストールします。

$ sudo pip install dnspython

2 zoneファイルにAレコードを追加する

以下のスクリプトでAレコードを追加します。

$ cat dns-append-example.py
#!/usr/bin/env python

import os

import dns.rdataset
import dns.rdtypes.IN.A
import dns.zone

conf = 'example.zone'
hostname = 'foobar'
ipaddr = '192.168.11.250'


def append():
    zone = dns.zone.from_file(conf, os.path.basename(conf))
    rdataset = zone.find_rdataset(hostname, dns.rdatatype.A, create=True)
    rdata = dns.rdtypes.IN.A.A(dns.rdataclass.IN, dns.rdatatype.A, ipaddr)
    rdataset.add(rdata, 86400)
    zone.to_file(conf)


append()
  • dns.zone.from_fileを使い、example.zoneというファイルからexample.zoneというzone名でzoneオブジェクトを作成します。
  • zone.find_rdatasetで'foobar'というホスト名のrdatasetオブジェクトを見つけます。ない場合は作成します。
  • IPアドレス192.168.11.250を設定したAレコードのrdataオブジェクトをrdatasetに追加します。rdataにはNSレコード等の各種レコードを格納できます。
  • zoneオブジェクトをexample.zoneというファイルに保存します。

以下のzoneファイルを使用します。

$ cat example.zone
$TTL 86400

@ IN SOA my.net root.my.net (
  2017021902
  3600
  900
  604800
  86400
)

@ IN NS ubuntu-16.04

pythonスクリプトを実行します。

$ python dnspython-append-example.py

Aレコードが追加されました。

$ cat example.zone
@ 86400 IN SOA my.net root.my.net 2017021902 3600 900 604800 86400
@ 86400 IN NS ubuntu-16.04
foobar 86400 IN A 192.168.11.250

3 zoneファイルからAレコードを削除する

以下のスクリプトでAレコードを追加します。

$ cat dnspython-remove-example.py
#!/usr/bin/env python

import os

import dns.rdataset
import dns.rdtypes.IN.A
import dns.zone

conf = 'example.zone'
hostname = 'foobar'


def remove():
    zone = dns.zone.from_file(conf, os.path.basename(conf))
    zone.delete_rdataset(hostname, dns.rdatatype.A)
    zone.to_file(conf)


remove()
  • zone.delete_rdatasetで'foobar'というホスト名でAレコードのrdatasetオブジェクトを削除します。

以下のzoneファイルを使用します。

$ cat example.zone
@ 86400 IN SOA my.net root.my.net 2017021902 3600 900 604800 86400
@ 86400 IN NS ubuntu-16.04
foobar 86400 IN A 192.168.11.250

pythonスクリプトを実行します。

$ python dnspython-remove-example.py

Aレコードが削除されました。

$ cat example.zone
@ 86400 IN SOA my.net root.my.net 2017021902 3600 900 604800 86400
@ 86400 IN NS ubuntu-16.04