zorun.nsd
NSD用のAnsibleロール
このAnsibleロールは、権威DNSサーバーであるNSDをインストールし、設定します。 また、DNSゾーンをNSDに公開することも可能です。
インストール
このロールはAnsible Galaxyで入手できます。
機能
このロールはNSD3とNSD4の両方をサポートし、マスターまたはスレーブモードでのNSD設定とゾーンファイルの管理が可能です。ゾーン転送(TSIG)の有無も選べます。
他のNSDロール(elnappo、reallyenglish、creicm、adarnimrod、hudecof)と比べて、以下の特徴があります:
- ゾーンデータを「従来の」ゾーンファイルに保存でき、Ansible変数としてゾーンを定義する必要がありません。
- ゾーンファイルはJinjaテンプレートとして解析され、動的なものが必要な場合にも対応します。
- マスターシナリオ、スレーブシナリオ、またはその両方を混在させることができます(同じNSDサーバー上で、マスターとスレーブとして動作するゾーンを持つことが可能)。
- 完全に一般的なNSD設定(NSDがサポートする任意の設定属性を自由に定義可能で、ロール内にハードコードされたリストはありません)。これにより、よりシンプルな構文での自動リスト展開が実現されています。
- ゾーン転送をサポート:TSIGキー、スレーブへの通知など。
- 便利でありながら、使いやすさも重視しています!
ただし、ファイアウォールの設定やメールの管理は行いません。また、現在のところDebianのみに対応しています。
使用例
注意:すべての使用例は、各ゾーンごとに独立して使用できます。つまり、1台のNSDサーバーがexample.com
のマスターであり、example.org
のスレーブでもあることができます。
ピュアマルチマスター
すべてのDNSサーバーがAnsibleで設定されている場合、これが最も簡単な設定です: すべてのサーバーがゾーンのマスターであり、ゾーンデータはAnsibleを使用してデプロイされます。
この設定では、DNSベースのゾーン転送は不要です。
追加のスレーブを持つマルチマスター
この設定では、1台または複数のマスターが前の使用例のようにAnsibleで設定されます。しかし、外部スレーブがマスターからゾーンデータを取得できるように、DNSベースのゾーン転送も設定されています。Ansibleがマスター上のゾーンを更新すると、NSDにスレーブに通知するように指示します。
この設定では、スレーブの適切な構成(すべてのマスターからの通知を受け入れ、1台または複数のマスターからゾーンデータを取得)を行う責任はあなたにあります。
スレーブのみ
この設定では、NSDサーバーは単にゾーンのスレーブとして設定されます。この場合、サーバーにゾーンデータはコピーされません。データは外部マスターから通常のDNSゾーン転送メカニズムを使用して取得されます。
この設定では、マスターの適切な構成(スレーブに通知し、スレーブからのゾーン転送を許可する)を行う責任はあなたにあります。
要件
このロールはDebian(wheezy、jessie、stretch、buster、bullseye)でテストされています。他のシステムでも、いくつかの適応を行うことで動作する可能性があります。
このロールはnsd-control
をセットアップしません。これはDebianパッケージによって自動的に行われるためです。他のシステムでは、Ansibleを介して設定する必要があるかもしれません。
ロール変数
これは、プレイブックで設定できるすべてのロール変数を文書化したものです。このREADMEの最後に完全な例があります。
サーバー設定
nsd_server_config [dict]
NSDのserver:
設定セクションに追加されるキーと値のペアの辞書です。値は文字列またはリストのいずれかで、後者の場合は、値が複数の設定エントリーに展開されます。
この辞書に任意の設定オプションを追加できますが、それがNSDによって理解される設定オプションであることを確認してください!安全策として、役割は生成された設定の検証をNSDに要求しますが、ansible-playbook --check
を実行するときには行われません。
nsd_local_server_config [dict]
nsd_server_config
と同じ構文と意味を持ちます。2つ目の変数は、特定の設定を単一のマシンに追加するのを容易にするために提供されます。通常、nsd_server_config
をgroup_vars
またはプレイブック内で定義し、nsd_local_server_config
はhost_vars
で定義されます。
TSIGキー
nsd_tsig_keys [list of dict]
オプションのTSIGキーのリストです。各TSIGキーは以下の属性を持つ辞書である必要があります:
tsig_keyname
: このTSIGキーの名前。マスター/スレーブDNS構成では、マスターとスレーブでTSIGキーの名前が同じでなければなりません。この名前は、nsd_primary_zones
およびnsd_secondary_zones
のロール変数からTSIGキーを参照するためにも使用されます。必須。tsig_secret
: キーのbase64エンコードされた値。必須。tsig_algorithm
: キーが使用するアルゴリズム(例:hmac-md5
)。必須。
プライマリゾーン
nsd_primary_zones [list of dict]
マスターとして提供されるゾーンのリスト。各ゾーンは以下の属性を持つ辞書である必要があります:
zone_name
: ゾーンの名前(例:example.com
や8.b.d.0.1.0.0.2.ip6.arpa.
)。必須。zone_filename
: ゾーンデータを含むファイルの名前(files/nsd/
内で検索されます)。必須。slaves
: DNSスレーブのリスト。以下のフォーマットを参照してください。オプション。
スレーブエントリーのフォーマットは次の通りです:
ip
: DNSスレーブのIPv4またはIPv6アドレス。 "notify"メッセージを送信し、このIPからのゾーン転送を許可するために使用されます。必須。tsig_key
: このスレーブとの通信に使用するTSIGキーの名前。この名前は、前述のTSIGキーのtsig_keyname
フィールドと一致しなければなりません。オプション。
セカンダリゾーン
nsd_secondary_zones [list of dict]
スレーブとして提供されるゾーンのリスト。各ゾーンは以下の属性を持つ辞書である必要があります:
zone_name
: ゾーンの名前(例:example.com
や8.b.d.0.1.0.0.2.ip6.arpa.
)。必須。masters
: DNSマスターのリスト。以下のフォーマットを参照してください。オプションですが、スレーブゾーンはマスターなしではほとんど役に立ちません。
マスターエントリーのフォーマットは次の通りです:
ip
: DNSマスターのIPv4またはIPv6アドレス。ゾーン転送をリクエストし、通知メッセージを許可するために使用されます。必須。tsig_key
: このマスターとの通信に使用するTSIGキーの名前。この名前は、前述のTSIGキーのtsig_keyname
フィールドと一致しなければなりません。オプション。
高度な設定変数
これらの変数はほとんどの場合変更する必要はありません。 変数はここでデフォルト値と共に提示されます。
nsd_local_zones_dir: files/nsd/
ゾーンファイルを探すローカルディレクトリ(zone_filename
エントリはこのディレクトリに対して相対的です)。
nsd_version: 4
NSDのバージョン。バージョンに応じて意味をなさないタスクやハンドラーをスキップするために使用されます。
nsd_service_name: "nsd"
initサービスの名前で、NSDの再起動に使用されます。
nsd_pkg_name: "nsd"
インストールするパッケージの名前です。
nsd_control_program: "/usr/sbin/nsd-control"
NSDを制御するために使用されるプログラム(リロード、再構築、通知など)。
nsd_config_dir: "/etc/nsd"
NSD設定が保存されるディレクトリです。
nsd_zones_config_file: "/etc/nsd/zones.conf"
ゾーン設定を保持する設定ファイルの名前(その後、NSDのメイン設定ファイルからインクルードされます)。
nsd_primary_zones_dir: "/etc/nsd/primary"
このロールによってゾーンファイルがコピーされるディレクトリです。
nsd_secondary_zones_dir: "/etc/nsd/secondary"
ゾーン転送後にNSDによってスレーブゾーンファイルが配置されるディレクトリです。
例プレイブック
これは、いくつかのTSIGキーと複数のDNSゾーンを持つ完全な例のプレイブックです: 最初のゾーンはスレーブなしのプライマリゾーンで、2番目のゾーンには2つのスレーブがあります。3番目のゾーンは2つのマスターを持つセカンダリゾーンです。
- hosts: dnsservers
roles:
- nsd
vars:
nsd_server_config:
verbosity: 2
ip4-only: 'yes'
nsd_tsig_keys:
# ゾーン定義で使用される2つのTSIGキー
- tsig_keyname: "tsig-key.example.org"
tsig_secret: "3znH//y866vzpOZdahYYUlWeiY4iidiJGFRX6CI6OkUBggRNYFpZAMvlYbtnUosiBVPsgghA6zT0TzOEX0vetQ=="
tsig_algorithm: hmac-md5
- tsig_keyname: "key-eu.org"
tsig_secret: "t6ELXqsSLYl57iO2rxj+X9+DNpOV3exTBFWu9wS/3jI="
tsig_algorithm: hmac-sha256
nsd_primary_zones:
# スレーブなしのマスタゾーン
- zone_name: "example.com."
zone_filename: "example.com.zone"
# スレーブ2つを持つマスタゾーン、1つはデュアルスタックでTSIGキーあり、もう1つはシングルスタックでキーなし。
- zone_name: "example.org."
zone_filename: "example.org.zone"
slaves:
- ip: 2001:db8:42:1337::1
tsig_key: "tsig-key.example.org"
- ip: 198.51.100.12
tsig_key: "tsig-key.example.org"
- ip: 203.0.113.8
nsd_secondary_zones:
# 2つのマスターを持つスレーブゾーン、最初はキーなし、2番目はキーあり。
- zone_name: "example.eu.org"
masters:
- ip: 192.0.2.42
- ip: 2001:db8:1234:5678::9
tsig_key: "key-eu.org"
また、host_vars/ns1.yml
に:
nsd_local_server_config:
ip-address: ['2001:db8:ffff::42', '203.0.113.199']
2つのプライマリゾーンのゾーンデータは、nsd_local_zones_dir
(デフォルトでfiles/nsd/
として設定されています)に保存する必要があります:
# ls files/nsd/
example.org.zone example.com.zone
# head -3 files/nsd/example.org.zone
$ORIGIN example.org
$TTL 3h
@ IN SOA ns1 root.example.org. (2017090101 1d 2h 4w 1h)
ゾーンファイル内でJinjaテンプレートを使用して、動的なレコードを生成することができます。
例:高度な設定
より高度なカスタマイズが必要な場合は、高度な変数を使用できます。たとえば、Debian wheezy上でNSD3をサポートするための適切な設定は次のようになります:
nsd_version: 3
nsd_service_name: "nsd3"
nsd_pkg_name: "nsd3"
nsd_control_program: "/usr/sbin/nsdc"
nsd_config_dir: "/etc/nsd3"
nsd_zones_config_file: "/etc/nsd3/zones.conf"
nsd_primary_zones_dir: "/etc/nsd3/primary"
nsd_secondary_zones_dir: "/etc/nsd3/secondary"
これはgroup_vars/wheezy.yml
ファイルやそれに相当するものに配置することができます。
制限事項
特定のゾーンについて、このロールを使用するすべてのマシンはすべてマスターまたはすべてスレーブでなければなりません。
これにより設定が大幅に簡素化され、一つのゾーンのためにマスターとスレーブが両方ともAnsibleで管理される必要は一般的にありません。なぜならAnsibleが単にゾーンデータをすべてのサーバーにプッシュすれば良いからです(つまり、すべてがマスターになり得ます)。
この制限を克服する方法は、異なるマシンと異なる設定でこのロールを何度も呼び出すことです。
Ansibleによってプッシュされるゾーンを持つ複数のマスターがあることは望ましくない場合もあります:
- 動的DNSレコード(NSDではサポートされていません)
- DNSSEC(私はDNSSECの経験がありませんので、貢献は歓迎します)
ライセンス
MIT