在临时服务器上测试DNS更改并在生产中验证的工具
pydnstest的Python项目详细描述
Pydnstest
用于测试dns更改(添加、删除、重命名、更改记录)的python工具 针对一个临时DNS服务器,在生产环境中验证相同的更改, 或确认记录在两种环境中返回相同的结果。
Pydnstest根据GNU Affero通用公共许可第3版获得许可。
要求
- python 2.7或3.4+(当前使用2.7、3.4、3.5、3.6进行测试)
- python virtualenv 和 pip (建议的安装方法;您的操作系统/发行版应该有相应的软件包)
-
或
以下软件包:
- pydns (python2)或 py3dns (python3)
- pyparsing解析
安装
建议您安装到虚拟环境(virtualenv/ VEV)。请参阅 Virtualenv使用文档 有关如何创建VENV的信息。如果你真的想安装 在系统范围内,您可以(使用sudo)。
pip install pydnstest
配置
运行 pydnstest --promptconfig 以交互方式生成并写出配置文件 (到 ~/.dnstest.ini )或运行 pydnstest --示例配置并编辑 根据需要生成文件。
您可以使用configprint选项查看当前配置。
用法
Pydnstest使用一种自然语言(如语法)为要进行的DNS更改获取一个或多个规范,并测试一个登台DNS服务器(并有选择地根据生产/实时服务器验证一次NGE是实时的)。对于每个规范,它打印出一个简单的单行ok/ng摘要,以及一些有用的辅助消息和/或警告。目前,它接受stdin或从文件中读取的输入。
下面的使用示例都假设您已经在 virtualenv位于 ~/venv_dir 。如果您在系统范围内安装了 省略前两行( cd~/venv_dir 和 source bin/activate )。
语法
add [record|name|entry] <hostname_or_fqdn> [with ][value|address|target] <hostname_fqdn_or_ip> remove [record|name|entry] <hostname_or_fqdn> rename [record|name|entry] <hostname_or_fqdn> [with][value|address|target] <value> to <hostname_or_fqdn> change [record|name|entry] <hostname_or_fqdn> to <hostname_fqdn_or_ip> confirm <hostname_or_fqdn> (checks that TEST and PROD return identical results)
示例输入文件
add foo.example.com with address 1.2.3.4
remove bar.example.com
rename baz.example.com with value 1.2.3.5 to blam.example.com
change quux.example.com to 1.2.3.6
confirm blam.example.com
使用输入文件
在~/inputfile.txt中编写包含以下内容的测试文件:
add record newhost.example.com with address 10.188.8.90 add record newhost-console.example.com with address 10.188.15.90
然后对其运行测试:
jantman@phoenix$ cd ~/venv_dir jantman@phoenix$ source bin/activate (venv_dir)jantman@phoenix$ pydnstest -f ~/inputfile.txt OK: newhost.example.com => 10.188.8.90 (TEST) PROD server returns NXDOMAIN for newhost.example.com (PROD) REVERSE OK: 10.188.8.90 => newhost.example.com (TEST) OK: newhost-console.example.com => 10.188.15.90 (TEST) PROD server returns NXDOMAIN for newhost-console.example.com (PROD) REVERSE OK: 10.188.15.90 => newhost-console.example.com (TEST) ++++ All 2 tests passed. (pydnstest 0.1.0)
在产品中验证一次
在上述更改生效后,请在生产中验证它们:
jantman@phoenix$ cd ~/venv_dir jantman@phoenix$ source bin/activate (venv_dir)jantman@phoenix$ pydnstest -f ~/inputfile.txt -V OK: newhost.example.com => 10.188.8.90 (PROD) REVERSE OK: 10.188.8.90 => newhost.example.com (PROD) OK: newhost-console.example.com => 10.188.15.90 (PROD) REVERSE OK: 10.188.15.90 => newhost-console.example.com (PROD) ++++ All 2 tests passed. (pydnstest 0.1.0)
进行一次快速测试
在stdin上做一个快速的一次性测试,以确认prod和test 对于给定的名称返回相同的结果:
jantman@phoenix$ cd ~/venv_dir jantman@phoenix$ source bin/activate (venv_dir)jantman@phoenix$ echo"confirm foo.example.com"| pydnstest OK: prod and test servers return same response for'foo.example.com' response: {'name': 'foo.example.com', 'data': '10.10.8.2', 'typename': 'A', 'classstr': 'IN', 'ttl': 360, 'type': 1, 'class': 1, 'rdlength': 4} ++++ All 1 tests passed. (pydnstest 0.1.0)
从stdin以交互方式运行
您还可以提供stdin上的测试数据。这在提取测试数据时非常有用 来自另一个文件,例如:
jantman@phoenix:pts/12:~/tmp$ cat sample_zone.txt $ORIGIN example.com. ;PYDNSTEST add record foo.example.com with address 10.10.8.2 foo IN A 10.10.8.2 ;PYDNSTEST add record bar.example.com with address 10.10.8.3 bar IN A 10.10.8.3 ;PYDNSTEST add record baz.example.com with address 10.10.8.4 baz IN A 10.10.8.4 jantman@phoenix$ cd ~/venv_dir jantman@phoenix$ source bin/activate (venv_dir)jantman@phoenix$ grep "^;PYDNSTEST" ~/tmp/sample_zone.txt | sed 's/^;PYDNSTEST //'| pydnstest OK: prod and test servers return same response for'foo.example.com' response: {'name': 'foo.example.com', 'data': '10.10.8.2', 'typename': 'A', 'classstr': 'IN', 'ttl': 360, 'type': 1, 'class': 1, 'rdlength': 4} OK: prod and test servers return same response for'bar.example.com' response: {'name': 'bar.example.com', 'data': '10.10.8.3', 'typename': 'A', 'classstr': 'IN', 'ttl': 360, 'type': 1, 'class': 1, 'rdlength': 4} OK: prod and test servers return same response for'baz.example.com' response: {'name': 'baz.example.com', 'data': '10.10.8.4', 'typename': 'A', 'classstr': 'IN', 'ttl': 360, 'type': 1, 'class': 1, 'rdlength': 4} ++++ All 3 tests passed. (pydnstest 0.2.2)
错误和功能请求
通过github问题跟踪器可以愉快地接受错误报告和功能请求。拉取请求是 欢迎。将处理没有附带拉取请求的问题 在我的时间和优先权允许的情况下。
许可证
Pydnstest的许可证是在gnu affero general public下 许可证版本3,带有 版权和作者归属不得删除的附加条款 或以其他方式更改,但添加作者的作者归属于 这项工作。(根据AGPL V3第7b节的附加条款)。
我选择agpl主要是因为我希望这个软件继续发展 从社区参与和改进中受益。