作者选择电子前沿基金会作为Write for DOnations计划的一部分接受捐赠。
介绍
OctoDNS是一种基础架构即代码工具,允许您使用标准软件开发原则部署和管理DNS区域,包括版本控制,测试和自动部署。 OctoDNS由GitHub创建,用Python编写。
使用OctoDNS消除了手动DNS管理的许多缺陷,因为区域文件以结构化格式( YAML )存储。 这允许您同时将区域部署到多个DNS提供程序,识别语法错误,并自动推出DNS配置,从而降低人为错误的风险。 OctoDNS的另一个常见用法是在不同的提供程序(例如测试和生产系统)之间或实时和故障转移环境之间同步DNS配置。
OctoDNS类似于DNSControl,它是由Stack Exchange创建并用Go编写的等效工具。 与OctoDNS不同,DNSControl使用基于JavaScript的配置语言来定义DNS区域,这允许您使用高级编程功能(如循环)在同一区域中指定多个类似的记录。 在Ubuntu 18.04上使用DNSControl如何部署和管理DNS的文章介绍了DNSControl的基本设置和配置。
在本教程中,您将安装和配置OctoDNS,创建基本DNS配置,并开始将DNS记录部署到实时提供程序。 作为本教程的一部分,我们将使用DigitalOcean作为示例DNS提供程序。 如果您希望使用其他提供商 ,则设置非常相似。 完成后,您将能够在安全的脱机环境中管理和测试DNS配置,然后自动将其部署到生产环境中。
先决条件
在开始本指南之前,您需要以下内容:
- 一个Ubuntu 18.04服务器通过遵循Ubuntu 18.04的初始服务器设置来设置 ,包括一个sudo非root用户和启用防火墙来阻止非必要端口。
your-server-ipv4-address
和your-server-ipv6-address
指的是托管您的网站或域的服务器的IP地址。 - 由支持的提供商托管的DNS完全注册的域名。 本教程将使用
your-domain
整个your-domain
和DigitalOcean作为服务提供者。 - 具有读写权限的DigitalOcean API密钥(个人访问令牌)。 要创建一个,请访问如何创建个人访问令牌 。
准备好后,以非root用户身份登录服务器。
第1步 – 安装OctoDNS
OctoDNS作为Python pip包分发,并在Python虚拟环境( virtualenv
)中运行,因此您将通过安装此所需的软件包开始此步骤。 virtualenv
是一个独立的Python环境,可以拥有自己的库和配置,与主系统范围的Python安装分开。 Python和virtualenv
可以在Ubuntu的默认软件存储库中使用,从而可以使用传统的包管理工具进行安装。
首先更新本地包索引以反映任何新的上游更改:
sudo apt update
然后,安装python
和virtualenv
包:
sudo apt install python virtualenv
确认安装后, apt
将下载并安装Python, virtualenv
及其所有必需的依赖项。
接下来,您将为OctoDNS创建所需的目录,其中将存储您的DNS和程序配置。 首先创建~/octodns
和~/octodns/config
目录:
mkdir ~/octodns ~/octodns/config
现在进入~/octodns
:
cd ~/octodns
接下来,您需要创建Python虚拟环境 – 一个独立的Python环境,它有自己的库和配置来运行OctoDNS:
virtualenv env
使用以下命令激活您的环境:
source env/bin/activate
这将输出类似于以下内容:
Running virtualenv with interpreter /usr/bin/python2New python executable in /home/user/octodns/env/bin/python2Also creating executable in /home/user/octodns/env/bin/pythonInstalling setuptools, pkg_resources, pip, wheel...done.
您的Bash shell提示符现在也将以虚拟环境的名称为前缀。 这表明您目前在virtualenv
:
(env) [email protected]:~/octodns$
如果要退出virtualenv
,可以随时使用deactivate
命令。 但是,您应该继续使用virtualenv
继续本教程。
现在您已经安装并配置了Python和virtualenv
,您可以安装OctoDNS。 OctoDNS作为Python pip包发布,它是Python包和库的标准包管理工具。
您可以在virtualenv
使用以下命令安装OctoDNS pip包:
pip install octodns
完成后,您可以检查已安装的版本以确保一切正常:
octodns-sync --version
您的输出将类似于以下内容:
octoDNS 0.9.6
如果您看到octodns-sync: command not found
错误,请仔细检查您是否仍在virtualenv
。
现在您已经安装了OctoDNS,您可以创建所需的配置文件以将OctoDNS连接到DNS提供程序,以允许它更改您的DNS记录。
第2步 – 配置OctoDNS
在此步骤中,您将为OctoDNS创建所需的配置文件,并将其连接到DNS提供程序,以便它可以开始对DNS记录进行实时更改。
注意:本教程将重点介绍OctoDNS的初始设置; 但是对于生产用途,建议将OctoDNS配置存储在Git等版本控制系统(VCS)中。 其优点包括完整版本控制,与CI / CD集成进行测试,无缝回滚部署等。
首先,您需要配置config.yaml
文件,该文件定义要管理的OctoDNS的DNS区域,并允许它向DNS提供程序进行身份验证并进行更改。
config.yaml
的格式略有不同,具体取决于您使用的DNS提供程序。 请参阅官方OctoDNS文档中的Supported Providers列表 ,以查找您自己的提供商的配置。 查看此超链接时,配置详细信息将作为代码注释显示在提供程序的实际Python代码中,该代码注释链接在表的“提供程序”列中。 找到供应商的Python代码后,例如cloudflare.py
或route53.py
,可以直接在ProviderName Provider
class
下找到相关的代码注释。 例如:
class Route53Provider(BaseProvider): ''' AWS Route53 Provider route53: class: octodns.provider.route53.Route53Provider # The AWS access key id access_key_id: # The AWS secret access key secret_access_key: # The AWS session token (optional) # Only needed if using temporary security credentials session_token:
进入~/octodns/config
目录:
cd ~/octodns/config
然后创建并打开config.yaml
进行编辑:
nano config.yaml
将DNS提供程序的示例config.yaml
配置添加到该文件。 如果您使用DigitalOcean作为DNS提供商,则可以使用以下内容:
---providers: config: class: octodns.provider.yaml.YamlProvider directory: ./config default_ttl: 300 enforce_order: True digitalocean: class: octodns.provider.digitalocean.DigitalOceanProvider token: your-digitalocean-oauth-tokenzones: your-domain.: sources: - config targets: - digitalocean
该文件告诉OctoDNS您希望它连接到哪些DNS提供商,以及它应该为这些提供商管理哪些DNS区域。
您需要为DNS提供商提供某种形式的身份验证。 这通常是API密钥或OAuth令牌。
如果您不希望在配置文件中以纯文本格式存储访问令牌,则可以在程序运行时将其作为环境变量传递。 为此,您应该使用以下token:
line而不是config.yaml
:
token: env/DIGITALOCEAN\_OAUTH\_TOKEN
然后,在运行OctoDNS之前,将相关环境变量设置为您的访问令牌,OctoDNS将在运行时从那里读取它:
export DIGITALOCEAN\_OAUTH\_TOKEN=your-digitalocean-oauth-token
警告:此令牌将授予对您的DNS提供商帐户的访问权限,因此您应该像密码一样保护它。 此外,请确保如果您使用的是版本控制系统,则排除包含令牌的文件(例如使用.gitignore
),或以某种方式安全加密。
如果您使用DigitalOcean作为DNS提供商,则可以在作为先决条件的一部分生成的DigitalOcean帐户设置中使用所需的OAuth令牌。
如果您有多个不同的DNS提供程序 – 例如,对于多个域名或委派的DNS区域 – 您可以在同一个config.yaml
文件中定义所有这些。
您已设置初始OctoDNS配置文件,以允许程序向DNS提供程序进行身份验证并进行更改。 接下来,您将为DNS区域创建配置。
第3步 – 创建DNS配置文件
在此步骤中,您将创建一个初始DNS配置文件,该文件将包含您的域名或委派DNS区域的DNS记录。
您要使用OctoDNS管理的每个DNS区域都有自己的文件,例如your-domain .yaml
。 在此文件中,区域的DNS记录使用YAML定义。
首先,进入~/octodns/config
目录:
cd ~/octodns/config
然后创建并打开your-domain .yaml
进行编辑:
nano your-domain.yaml
将以下示例配置添加到文件中:
---'': - type: A value: your-server-ipv4-addresswww: - type: A value: your-server-ipv4-address
此示例文件为your-domain
定义了一个DNS区域,其中包含两条A
记录,指向您托管域或网站的IPv4地址。 一个A
记录用于根域(例如, your-domain
),另一个用于www
子域(例如www. your-domain
)。
完成后,保存并关闭文件。
您已为OctoDNS设置了基本DNS区域配置文件,其中两个基本A
记录指向您的域或网站的IPv4地址。 接下来,您将使用一些有用的DNS记录扩展该文件。
第4步 – 填充DNS配置文件
接下来,您可以使用YAML结构化配置语言,使用一组实用的DNS记录填充DNS配置文件。
与传统的BIND区域文件 (其中DNS记录以原始的逐行格式写入)不同,OctoDNS中的DNS记录被定义为YAML密钥和具有多个关联值的子密钥,如第3步中简要所示。
顶级键通常是'name'
,它本质上是记录标识符。 www
, subdomain1
和mail
都是DNS’name 'name'
例子。 在OctoDNS中,有两个特殊用途名称,对于根记录(通常称为@
)是'*'
,对于通配符记录是'*'
。 每个密钥(DNS记录)的必需值是type
。 这定义了您在该YAML顶级键中定义的DNS记录类型。 每种标准DNS记录类型都有一种类型,包括A
, AAAA
, MX
, TXT
, NS
, CNAME
等。 OctoDNS文档的“ 记录”部分提供了可用记录类型的完整列表。
DNS记录的值可以直接定义为顶级键的值(如果只有一个值),也可以定义为列表(如果有多个值,例如多个IP地址或MX地址)。
例如,要定义单个值,可以使用以下配置:
'www': type: A value: 203.0.113.1
或者,为单个记录定义多个值:
'www': type: A values: - 203.0.113.1 - 203.0.113.2
设置DNS记录的语法因每种记录类型而略有不同。 以下是最常见记录类型的一些示例:
记录:
目的:指向IPv4地址。
句法:
'name': type: A value: ipv4-address
例:
'www': type: A value: your-server-ipv4-address
AAAA
记录:
目的:指向IPv6地址。
句法:
'name': type: AAAA value: ipv6-address
例:
'www': type: AAAA value: your-server-ipv6-address
CNAME
记录:
目的:使您的域/子域名成为另一个域名的别名。
句法:
'name': type: CNAME value: fully-qualified-domain-name
例:
'www': type: CNAME value: www.example.org
MX
记录:
目的:将电子邮件定向到特定服务器/地址。
句法:
'name': type: MX value: exchange: mail-server preference: priority-value
请注意尾随.
如果MX值中有任何点,则必须包括在内。
例:
'': type: MX value: exchange: mail.your-domain. preference: 10
TXT
记录:
目的:添加任意纯文本,通常用于没有自己专用记录类型的配置。
句法:
'name': type: TXT value: content
例:
'': type: TXT value: This is a TXT record.
要开始为您的域或委派的DNS区域添加DNS记录,请编辑DNS配置文件:
cd ~/octodns/confignano your-domain.yaml
接下来,您可以使用上一个列表中描述的语法以及官方OctoDNS文档的“ 记录”部分开始填充DNS区域。
作为参考,此处的代码块包含初始DNS设置的完整示例配置:
---'': - type: A value: your-server-ipv4-address - type: AAAA value: your-server-ipv6-address - type: MX value: exchange: mail.your-domain. preference: 10 - type: TXT value: v=spf1 -all_dmarc: type: TXT value: v=DMARC1\; p=reject\; rua=mailto:[email protected]your-domain\; aspf=s\; adkim=s\;mail: - type: A value: your-server-ipv4-address - type: AAAA value: your-server-ipv6-addresswww: - type: A value: your-server-ipv4-address - type: AAAA value: your-server-ipv6-address
完成初始DNS配置后,保存并关闭文件。
在此步骤中,您将设置包含DNS记录的初始DNS配置文件。 接下来,您将测试配置并进行部署。
第5步 – 测试和部署DNS配置
在此步骤中,您将对DNS配置运行本地语法检查,然后将更改部署到实时DNS服务器/提供程序。
首先,进入你的octodns
目录:
cd ~/octodns
通过在Bash提示符之前查找它的名称,仔细检查您是否仍在Python virtualenv
运行:
(env) [email protected]:~/octodns$
接下来,使用octodns-validate
命令检查配置文件的语法。 您需要指定配置文件的路径:
octodns-validate --config=./config/config.yaml
如果DNS配置文件的YAML语法正确,则OctoDNS将返回,但不输出。
如果您在输出中看到错误或警告,OctoDNS将提供有关错误在YAML文件中的位置和位置的详细信息。
接下来,您可以执行DNS配置的干运行推送,该配置将输出将进行的更改,而不实际进行:
octodns-sync --config=./config/config.yaml
这应该产生类似于以下的输出:
********************************************************************************* your-domain.********************************************************************************* digitalocean (DigitalOceanProvider)* Create <ARecord A 300, mail.your-domain., ['your-server-ipv4-address']> (config)* Create <AaaaRecord AAAA 300, mail.your-domain., ['your-server-ipv6-address']> (config)* Create <TxtRecord TXT 300, your-domain., ['v=spf1 -all']> (config)* Create <AaaaRecord AAAA 300, your-domain., ['your-server-ipv6-address']> (config)* Create <ARecord A 300, your-domain., ['your-server-ipv4-address']> (config)* Create <ARecord A 300, www.your-domain., ['your-server-ipv4-address']> (config)* Create <MxRecord MX 300, your-domain., [''10 mail.your-domain.'']> (config)* Create <TxtRecord TXT 300, _dmarc.your-domain., ['v=DMARC1\; p=reject\; rua=mailto:[email protected]your-domain\; aspf=s\; adkim=s\;']> (config)* Create <AaaaRecord AAAA 300, www.your-domain., ['your-server-ipv6-address']> (config)* Summary: Creates=9, Updates=0, Deletes=0, Existing Records=2********************************************************************************
警告:下一个命令将对DNS记录以及可能的其他设置进行实时更改。 请确保您已为此做好准备,包括备份现有DNS配置,以及确保您有必要回滚的方法。
最后,您可以将更改推送到您的实时DNS提供程序:
octodns-sync --config=./config/config.yaml --doit
注意:在某些情况下,如果进行大量调整,OctoDNS将拒绝推送更改。 这是一种自动保护功能,可防止意外错误配置。 如果您遇到此拒绝,可以使用--force
选项重新运行octodns-sync
,但请确保您已做好准备。
在这一步中你会看到类似干运行的输出,但是添加了类似于以下内容的东西:
2019-07-07T23:17:27 INFO DigitalOceanProvider[digitalocean] apply: making changes2019-07-07T23:17:30 INFO Manager sync: 9 total changes
现在,如果您在DigitalOcean控制面板中检查域的DNS设置,您将看到更改。
您还可以通过为域/委派区域运行DNS查询来检查记录创建。 您将看到记录已相应更新:
dig +short your-domain
您将看到输出显示使用OctoDNS部署的区域中的IP地址和相关DNS记录。 DNS记录可能需要一些时间才能传播,因此您可能需要等待并再次运行此命令。
在最后一步中,您运行了DNS配置文件的本地语法检查,然后将其部署到您的实时DNS提供程序,并测试了更改是否已成功完成。
结论
在本文中,您设置了OctoDNS并将DNS配置部署到实时提供程序。 现在,您可以在将其部署到生产环境之前,在安全的脱机环境中管理和测试DNS配置更改。
如果您希望进一步探讨此主题,OctoDNS旨在集成到您的CI / CD管道中,使您可以运行深入的测试并更好地控制您的生产部署。 您还可以考虑将OctoDNS集成到基础架构构建/部署过程中,从而允许您部署服务器并将其完全自动添加到DNS。
如果您希望进一步了解OctoDNS,以下DigitalOcean文章提供了一些有趣的后续步骤,以帮助将OctoDNS集成到您的变更管理和基础架构部署工作流程中: