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以从配置文件中获取记录,并设置一个route53providerdynprovider作为这些记录的目标。可以为每个分区设置任意数量的分区以及任意数量的数据源和记录目标。您还可以有多个配置文件,它们使用单独的帐户,每个帐户管理一组不同的区域。一个很好的例子可能是/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本身就是分支部署的。

第一步是用您的更改创建公关。

 src=

假设代码测试和配置验证状态为绿色,下一步是执行noop部署,并验证octdns计划所做的更改是否符合您的预期。

 src=

之后是一系列的评论。一个来自队友的人,他应该对你要完成的事情有完整的背景,并且对你要做的改变有可见性。另一个是github的一个团队成员,他拥有dns,主要是作为一个健全的检查,以确保遵循最佳实践。尽可能多地将其烘焙到octodns validate

在审查之后,是时候分支部署更改了。

 src=

如果进展顺利,您将再次看到预期的更改,并使用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同步应显示零更改。

支持的提供程序

<表><广告>提供商 要求 支持录制 动态/地理支持 注释< /广告><正文>azureproviderazure管理dnsA、AAAA、CAA、CNAME、MX、NS、PTR、SRV、TXTCloudFlareProvider提供程序a、aaaa、alias、caa、cname、mx、ns、spf、srv、txt>CAA标签受限数字海洋提供商A、AAAA、CAA、CNAME、MX、NS、TXT、SRV>CAA标签受限dnsmadeasyprovidera、aaaa、别名(aname)、caa、cname、mx、ns、ptr、spf、srv、txt>CAA标签受限dnsimpleprovider所有>CAA标签受限动态提供程序 Dyn 所有两者etchostsproviderA、AAAA、别名、CNAME谷歌云提供商谷歌云域名系统A、AAAA、CAA、CNAME、MX、NAPTR、NS、PTR、SPF、SRV、TXTns1提供程序nsone所有部分地理位置没有对测地线进行健康检查ovh OVH a、aaaa、cname、mx、naptr、ns、ptr、spf、srv、sshfp、txt、dkimpowerdnsprovider所有机架空间a、aaaa、alias、cname、mx、ns、ptr、spf、txt路径53BOTO3A、AAAA、CAA、CNAME、MX、NAPTR、NS、PTR、SPF、SRV、TXT两者CNAME运行状况检查不支持主机头axfrsourceA、AAAA、CNAME、MX、NS、PTR、SPF、SRV、TXT>只读区域资源A、AAAA、CNAME、MX、NS、PTR、SPF、SRV、TXT>只读tinydnsfilesourceA、CNAME、MX、NS、PTR>只读yamlprovider所有 >是配置

注释

  • 别名支持因提供商而异,应注意验证您的需要我们见面很详细。
    • dyn的ui不允许编辑或查看ttl,但是api接受并存储所提供的值,该值在服务时似乎不被使用
    • dnsimple在通过别名提供服务时使用配置的ttl,在octodns忽略的别名旁边还创建了一个二级txt记录
  • octodns本身支持非ascii字符集,但在测试中,cloudflare是当前端到端功能的唯一提供程序。其他的则在客户端库或api调用中失败

自定义源和提供程序

您可以查看提供程序目录,查看当前支持的内容。来源作为记录信息的来源。axfrsource和tinydnsfilesource是目前唯一的oss源代码,不过我们内部还有一些特定于我们环境的其他源代码。其中包括从gpanel和一个类似的提供商中提取主机数据,该提供商提供有关我们的网络设备的信息,以便为它们的接口创建a&;ptr记录。好的OSS源代码可能包括一个elbsource来获取有关AWS弹性负载均衡器的信息,并为其动态创建cnameec2source来获取的实例信息,以便可以为主机创建类似于我们的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 mcfarlandjoe williams。它现在由Ross、Joe和Github的其他站点可靠性工程团队维护、审查和测试。

欢迎加入QQ群-->: 979659372 Python中文网_新手群

推荐PyPI第三方库


热门话题
java需要一种简单的方法来创建用于排序的comparator类   java getReadableDatabase和getWriteableDatabase无法解析   查找列表<Long>中与某个元素对应的所有索引的java方法   安卓将视图添加到ViewFlipper会导致java。StackOverflowerr语言   java根据它所包含的长“curTime”类字段将N的列表拆分为24(小时)   Android N中的Java8流API   自动生成Java策略文件的安全性   垃圾收集鼓励Java中的主要GC(但不是STW GC)   java如何检查UDP服务器上侦听的客户端数量   在前一台主机被Datastax Java驱动程序关闭后,Cassandra尝试重新连接到下一台主机   java如何使用Spring Boot创建部分代理   java是否有一个网站或资源可以完全比较EJB版本   java无需使用第三方库从gradle生成输出   继承由于这个多态性的基本示例中的语法有什么不同吗?(爪哇)   java字符串数组中的空字符串   java为什么CMS中的初始标记阶段是串行的   为什么Lucene有时与InChIKeys不匹配?   安卓通知Java应用程序数据库中的更改   java如何将单个json对象值解析为按钮   java打印堆栈将运行时错误跟踪到文件