octdns:dns作为代码-用于跨多个提供程序管理dns的工具
octodns的Python项目详细描述
dns作为代码-用于跨多个提供程序管理dns的工具
按照基础设施 代码octdns提供了一组工具和模式,使跨多个提供程序轻松管理dns记录。生成的配置可以存在于存储库中,并像其他代码一样进行部署,保持清晰的历史记录并使用现有的审阅和工作流。
该体系结构是可插入的,工具是灵活的,使其适用于各种各样的用例。已经努力使添加新的提供者尽可能容易。在这个简单的例子中,只需要编写一个类和几百行代码,其中大部分是在提供者的模式和octodns模式之间转换的。更多关于我们使用它的一些方法以及如何在下面和中扩展它的信息。/文档目录
它与netflix/分母类似。
目录
开始
工作区
运行以下命令将安装最新版本的octodns,并为您的配置文件设置一个存放位置。要确定是否需要特定于提供商的要求,请参见下面的支持的提供商表。
$ mkdir dns
$ cd dns
$ virtualenv env
...
$ source env/bin/activate
$ pip install octodns <provider-specific-requirements>
$ mkdir config
配置
我们首先创建一个配置文件,告诉octodns我们的提供商和我们希望它管理的区域。下面我们将设置一个yamlprovider
以从配置文件中获取记录,并设置一个route53provider
和dynprovider
作为这些记录的目标。可以为每个分区设置任意数量的分区以及任意数量的数据源和记录目标。您还可以有多个配置文件,它们使用单独的帐户,每个帐户管理一组不同的区域。一个很好的例子可能是/config/staging.yaml
&;/config/production.yaml
。我们将关注aconfig/production.yaml
---providers:config:class:octodns.provider.yaml.YamlProviderdirectory:./configdefault_ttl:3600enforce_order:Truedyn:class:octodns.provider.dyn.DynProvidercustomer:1234username:'username'password:env/DYN_PASSWORDroute53:class:octodns.provider.route53.Route53Provideraccess_key_id:env/AWS_ACCESS_KEY_IDsecret_access_key:env/AWS_SECRET_ACCESS_KEYzones:example.com.:sources:-configtargets:-dyn-route53
类
是一个特殊键,它告诉octodns应该加载哪个python类。任何其他键都将作为配置值传递给该提供程序。一般来说,任何敏感或频繁旋转的值都应该来自环境变量。当octodns看到以env/
开头的值时它将在进程的环境中查找该值并将结果传递给进程。
更多信息可以在每个源和提供程序类的docstring
中找到。
既然我们有东西要告诉octodns关于我们的提供商和区域,我们需要告诉它或记录。我们将暂时保持简单,只需在域的顶层创建一个a
记录即可。
配置/example.com.yaml
---'':ttl:60type:Avalues:-1.2.3.4-1.2.3.5
有关更多信息,请参见记录文档。
noop
我们准备对我们的新设置进行一次试运行,看看它会做出什么改变。因为我们假装在这里,所以我们会假装在任何一个提供商的帐户中都没有example.com.
的现有记录。
$ octodns-sync --config-file=./config/production.yaml
...
********************************************************************************
* example.com.
********************************************************************************
* route53 (Route53Provider)
* Create <ARecord A 60, example.com., [u'1.2.3.4', '1.2.3.5']>
* Summary: Creates=1, Updates=0, Deletes=0, Existing Records=0
* dyn (DynProvider)
* Create <ARecord A 60, example.com., [u'1.2.3.4', '1.2.3.5']>
* Summary: Creates=1, Updates=0, Deletes=0, Existing Records=0
********************************************************************************
...
屏幕上会显示其他日志信息,但成功运行同步时,对于任何有更改的提供商和区域,都将始终以类似于上面的摘要结束。如果没有更改,则会打印一条这样的消息。上面我们在两个提供者中创建了一个新的区域,因此它们显示相同的更改,但并不总是这样。如果要启动其中一个具有不同的状态,您将看到octodns打算进行的更改以同步它们。
进行更改
警告:octodns假定您指向的任何域的所有权。当你告诉它采取行动时,它会做任何必要的努力来匹配状态,包括删除任何意外的记录。玩八达通时要小心。最好尝试使用一个假区域或一个没有任何重要数据的区域,直到您对系统感到满意为止。
现在是时候告诉octodns让事情发生了。我们将使用相同的选项再次调用它,并在最后添加一个--doit
来告诉它这次我们实际上希望它尝试进行指定的更改。
$ octodns-sync --config-file=./config/production.yaml --doit
...
这里的输出将与以前一样,在它进行实际更改时,在末尾添加一些日志行。之后,route53和dyn中的配置应该与yaml文件中的配置匹配。
工作流程
在上面的例子中,我们从命令行手动运行octdns。这很有效,而且比进入提供者gui并通过点击进行更改要好,但是octodns被设计为作为部署过程的一部分运行。实现细节远远超出了本自述文件的范围,但这里是我们在github使用的工作流的一个示例。它遵循这样的方式:github本身就是分支部署的。
第一步是用您的更改创建公关。
假设代码测试和配置验证状态为绿色,下一步是执行noop部署,并验证octdns计划所做的更改是否符合您的预期。
之后是一系列的评论。一个来自队友的人,他应该对你要完成的事情有完整的背景,并且对你要做的改变有可见性。另一个是github的一个团队成员,他拥有dns,主要是作为一个健全的检查,以确保遵循最佳实践。尽可能多地将其烘焙到octodns validate
在审查之后,是时候分支部署更改了。
如果进展顺利,您将再次看到预期的更改,并使用dig
和/或octdns报告验证它们代码>你可以点击合并按钮。如果有问题,您可以快速执行a
。部署dns/master
以返回到上一个状态。
引导配置文件
很少有情况会涉及从一张白板开始,这就是为什么内置了工具将现有数据从提供者中提取到匹配的配置文件中。
$ octodns-dump --config-file=config/production.yaml --output-dir=tmp/ example.com. route53
2017-03-15T13:33:34 INFO Manager __init__: config_file=tmp/production.yaml
2017-03-15T13:33:34 INFO Manager dump: zone=example.com., sources=('route53',)
2017-03-15T13:33:36 INFO Route53Provider[route53] populate: found 64 records
2017-03-15T13:33:36 INFO YamlProvider[dump] plan: desired=example.com.
2017-03-15T13:33:36 INFO YamlProvider[dump] plan: Creates=64, Updates=0, Deletes=0, Existing Records=0
2017-03-15T13:33:36 INFO YamlProvider[dump] apply: making changes
上面的命令将现有数据从route53中取出,并将结果放入tmp/example.com.yaml
。可以检查该文件并将其移到config/
中以成为新的源。如果一切按设计进行,则后续的noop同步应显示零更改。
支持的提供程序
<表><广告>注释
- 别名支持因提供商而异,应注意验证您的需要我们见面很详细。
- dyn的ui不允许编辑或查看ttl,但是api接受并存储所提供的值,该值在服务时似乎不被使用
- dnsimple在通过别名提供服务时使用配置的ttl,在octodns忽略的别名旁边还创建了一个二级txt记录
- octodns本身支持非ascii字符集,但在测试中,cloudflare是当前端到端功能的唯一提供程序。其他的则在客户端库或api调用中失败
自定义源和提供程序
您可以查看源和提供程序目录,查看当前支持的内容。来源作为记录信息的来源。axfrsource和tinydnsfilesource是目前唯一的oss源代码,不过我们内部还有一些特定于我们环境的其他源代码。其中包括从gpanel和一个类似的提供商中提取主机数据,该提供商提供有关我们的网络设备的信息,以便为它们的接口创建a
&;
ptr
记录。好的OSS源代码可能包括一个elbsource
来获取有关AWS弹性负载均衡器的信息,并为其动态创建cname
或ec2source
来获取的实例信息,以便可以为主机创建类似于我们的gpanelprovider工作原理的记录。
octodns中包含的大多数内容都是提供者,明显的区别在于它们可以同时充当数据的源和目标。我们非常希望看到这个列表随着时间的推移而增长,因此如果您使用不受支持的提供商,那么欢迎使用prs。现有的供应商应作为合理的例子。那些没有大地测量支持的是相对简单的。不幸的是,大多数用于实现geodns风格的流量管理的api都很复杂,而且有些不一致,因此添加对该功能的支持是很好的,但这是可选的,最好在单独的过程中完成。
providers config部分中的类
键可用于指向python路径中的任意类,这样,除了将内部或第三方提供程序放入python path之外,无需进行任何协调就可以轻松地将它们包括在内,而pythonpath很可能是通过octodns安装到virtualenv中的。
其他用途
提供程序之间的同步
虽然主要用例是将一组yaml配置文件同步到一个或多个dns提供程序,但octodns的构建方式使您可以轻松地任意地获取源和目标。作为一个简单的例子,下面的配置将把githubtest.net从route53同步到dyn。
---providers:route53:class:octodns.provider.route53.Route53Provideraccess_key_id:env/AWS_ACCESS_KEY_IDsecret_access_key:env/AWS_SECRET_ACCESS_KEYdyn:class:octodns.provider.dyn.DynProvidercustomer:env/DYN_CUSTOMERusername:env/DYN_USERNAMEpassword:env/DYN_PASSWORDzones:githubtest.net.:sources:-route53targets:-dyn
动态源
在内部,我们使用自定义源创建基于动态数据的记录,这些数据在没有直接人工干预的情况下频繁更改。一个这样的例子可能如下所示。对于主机,此机制是清洁的,定期运行,确保只要主机处于活动状态,就存在正确的记录,并确保在主机被销毁后将其删除。主机配置和销毁过程完成创建和销毁记录的实际工作。
---providers:gpanel-site:class:github.octodns.source.gpanel.GPanelProviderhost:'gpanel.site.github.foo'token:env/GPANEL_SITE_TOKENpowerdns-site:class:octodns.provider.powerdns.PowerDnsProviderhost:'internal-dns.site.github.foo'api_key:env/POWERDNS_SITE_API_KEYzones:hosts.site.github.foo.:sources:-gpanel-sitetargets:-powerdns-site
贡献
如果您想参与,请参阅我们的贡献文档!
获取帮助
如果您有任何问题或建议,请在此存储库中打开一个问题,我们将尽力提供帮助。请注意,本项目遵守《出资人契约行为准则》。
许可证
OCTODNS是根据麻省理工学院许可证获得许可的
麻省理工学院的许可证不是针对Github的商标,包括商标设计。GitHub保留对所有GitHub商标的所有商标和版权。Github的徽标包括,例如,在以下文件夹的文件标题中包含"徽标"的样式化设计:https://github.com/github/octdns/tree/master/docs/logos/
Github®及其样式化版本和Invertocat标记是Github的商标或注册商标。使用Github徽标时,请务必遵循Github徽标指南。
作者
octodns的设计和作者分别是ross mcfarland和joe williams。它现在由Ross、Joe和Github的其他站点可靠性工程团队维护、审查和测试。