zorun.nsd
NSD 的 Ansible 角色
这个 Ansible 角色安装和配置 NSD,一个权威的 DNS 服务器。 它还允许将 DNS 区域发布到 NSD。
安装
这个角色可以在 Ansible Galaxy 上找到。
特性
这个角色支持 NSD3 和 NSD4,允许管理 NSD 配置 和区域文件,可以以主模式或从模式运行,支持或不支持区域传输(TSIG)。
与其他 NSD 角色相比,它有以下特点:
- 允许将区域数据存储在“经典”区域文件中,而不是像 这里 那样将区域写成 Ansible 变量
- 区域文件被解析为 Jinja 模板,以防您需要动态内容
- 支持主从场景,或两者的混合(同一 NSD 服务器上某些区域作为主,某些区域作为从运行)
- 完全通用的 NSD 配置(您可以自由定义 NSD 支持的任何配置属性,角色中没有硬编码的列表)。这与 这里 相似,但语法更简单(自动扩展列表)
- 支持区域传输:TSIG 密钥、通知从服务器等……
- 希望灵活且易于使用!
但是,它不处理防火墙配置或邮件,并且目前只支持 Debian。
用例
注意:所有这些用例可以在每个区域中独立使用!也就是说,一个 NSD 服务器可以是 example.com
的主服务器,同时又是 example.org
的从服务器。
纯多主模式
如果您所有的 DNS 服务器都是通过 Ansible 配置的,这是最简单的设置: 所有服务器都是区域的主服务器,区域数据通过 Ansible 部署。
在这种设置中,无需基于 DNS 的区域传输。
带有额外从服务器的多主模式(未通过该角色配置)
在这个设置中,使用 Ansible 配置一个或多个主服务器,与之前的用例相同。然而,还设置了基于 DNS 的区域传输,以允许外部从服务器从主服务器获取区域数据。每当 Ansible 更新主服务器上的区域时,它会告诉 NSD 通知从服务器。
请注意,在此设置中,配置从服务器的职责在您自己(接受来自所有主服务器的通知,并从一个或多个主服务器获取区域数据)。
仅从服务器
在这个设置中,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
具有相同的语法和语义。
提供这个第二个变量是为了让向单台机器添加特定配置更加方便。通常您会在 group_vars
或剧本中定义 nsd_server_config
,而 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 地址。将用来发送“通知”消息,并允许从此 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"
用于重新启动 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 区域: 第一个区域是没有从服务器的主区域,第二个区域有两个从服务器,第三个区域是具有两个主服务器的从区域。
- hosts: dnsservers
roles:
- nsd
vars:
nsd_server_config:
verbosity: 2
ip4-only: 'yes'
nsd_tsig_keys:
- 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"
- 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:
- 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']
两个主区域的数据需要存储在
nsd_local_zones_dir
中(默认位于您的 Ansible 目录根目录的 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