我们举办自己的DNS 服务器(BIND)的原因有很多,其中包括我们经常部署和关闭机器,有时我们需要非常快速地通过 DNS 进行负载平衡。
然而,现在我们有了一个很好的60 台服务器,我们很难跟踪所有记录,而且在编辑区域文件时我们往往会犯错误。目前还没有什么太糟糕的事情(我们使用其他 DNS 提供商作为备份),但我正在寻找一种比手动编辑文件更好的方法。
此外,由于我们可以轻松地使用臭名昭著的厨师,手动执行此操作是最耗时的!如果我们可以自动执行此操作,那将很有趣。有人知道这个吗?编辑和维护此区域文件的良好做法是什么?
答案1
您可以使用 Chef 搜索,使用发现的节点的主机名/fqdn 和 ip 地址,通过 Chef 动态构建区域文件作为模板。
hosts = search(:node, "*:*")
template '/path/to/zonefile' do
source 'zonefile.erb'
variables(:hosts => hosts)
owner 'root'
group 'root'
mode 0644
end
并且模板将hosts
使用搜索中每个结果的主机名、fqdn 和 ipaddress 迭代传递的变量。设计示例:
<% @hosts.each do |h| -%>
<%= h['fqdn'] %>. IN A <%= h['ipaddress'] %>
<% end -%>
答案2
我知道这已经是一个月前的事了,但我刚刚完成了一个自动化系统来为我们管理这件事。它由一个 git 存储库组成,其中包含:
- 所有主要区域和配置文件。
- 所有次要区域和配置文件。
- 为我的辅助名称服务器构建脚本 - Ubuntu 10.0.4LTS
- 一个非常简单的 Capistrano 配方,可以更新主名称服务器和辅助名称服务器。
当我想更新我的区域文件时 - 以下是流程。
git pull #to make sure it's current.
#Open the zone file and edit.
git diff #verify the change is what I want.
git commit -a; git push
cap primary:update #that also sends a notify to my secondary who pulls down the new zone
cap secondary:update #if I'm just updating the secondary.
它运行起来非常简单 - 我不需要登录到一堆服务器来做任何事情 - 而且很容易看到我正在改变什么。
此外,它还为我提供了有关变化的良好历史记录。
如果你想要一份 repo 的副本 - 请告诉我,我就会直接发给你。
答案3
文本配置功能带来的麻烦。我发现 60 个区域文件是一个小数目,除非你必须每天更改它们,但也许你可以使用支持来自数据库(例如 PostgreSQL)的 DNS 数据的服务器来更好地服务,例如强力DNS。这使您可以创建简单的脚本/页面/应用程序来处理数据(您甚至可以为客户提供前端)。
您甚至可以使用 SQL 将 bind 配置为服务器的从属,它将自动从主服务器加载区域信息。
至于最佳实践:
- 保持区域文件中没有无用的评论,
- 强制正确使用制表符/空格
- 使用区域文件的域名
- 我使用
vim
宏来编辑多个文件,但你可以使用 sed 和其他工具来实现
答案4
完整性验证脚本,其功能包括验证序列号是否已增加,以及 SCM,可能使用 Subversion 之类的程序,或者任何本地首选毒药,以具有历史记录和恢复能力。
一旦您在 svn 之类的程序中拥有数据,您就可以使用工具添加/删除单个主机,同时仍然允许人类编辑区域文件。
否则,有多种选项可以将数据从平面文件移到数据库中。PowerDNS 是其中之一,Bind 的 DLZ 补丁是另一个。我要指出的是,就性能而言,如果这些是公开的区域,您可能希望将数据库支持的服务器保留为隐藏的主服务器,并让 AXFR/IXFR 将更改传播到可以运行常规绑定的公共主服务器。对于内部区域 (corp.example.com),这可能有点过头了。