著者は、 Electronic Frontier Foundation を選択して、 Write forDOnationsプログラムの一環として寄付を受け取りました。

序章

OctoDNS は、 Infrastructure-as-Code ツールであり、バージョン管理、テスト、自動展開などの標準的なソフトウェア開発原則を使用してDNSゾーンを展開および管理できます。 OctoDNSはGitHubによって作成され、Pythonで記述されています。

OctoDNSを使用すると、ゾーンファイルが構造化された形式([X121X] YAML )で保存されるため、手動のDNS管理の落とし穴の多くが解消されます。 これにより、ゾーンを複数のDNSプロバイダーに同時に展開し、構文エラーを識別し、DNS構成を自動的にプッシュして、人的エラーのリスクを減らすことができます。 OctoDNSのもう1つの一般的な使用法は、テストシステムや本番システムなどの異なるプロバイダー間、またはライブ環境とフェイルオーバー環境間でDNS構成を同期することです。

OctoDNSは、Stack Exchangeによって作成され、Goで記述された同等のツールであるDNSControlに似ています。 OctoDNSとは異なり、DNSControlはJavaScriptベースの構成言語を使用してDNSゾーンを定義します。これにより、ループなどの高度なプログラム機能を使用して、同じゾーン内の複数の類似したレコードを指定できます。 記事Ubuntu18.04でDNSControlを使用してDNSを展開および管理する方法では、DNSControlの基本的なセットアップと構成について説明しています。

このチュートリアルでは、OctoDNSをインストールして構成し、基本的なDNS構成を作成して、ライブプロバイダーへのDNSレコードの展開を開始します。 このチュートリアルの一部として、DNSプロバイダーの例としてDigitalOceanを使用します。 別のプロバイダーを使用する場合、セットアップは非常に似ています。 終了すると、安全なオフライン環境でDNS構成を管理およびテストし、それを本番環境に自動的に展開できるようになります。

前提条件

このガイドを開始する前に、次のものが必要です。

  • Ubuntu 18.04を使用した初期サーバーセットアップに従ってセットアップされた1つのUbuntu18.04サーバー。これには、sudo非rootユーザーと、非必須ポートをブロックするファイアウォールが含まれます。 your-server-ipv4-addressおよびyour-server-ipv6-addressは、WebサイトまたはドメインをホストしているサーバーのIPアドレスを指します。
  • がサポートするプロバイダーによってホストされているDNSに完全に登録されたドメイン名。 このチュートリアルでは、全体でyour-domainを使用し、サービスプロバイダーとしてDigitalOceanを使用します。
  • 読み取りおよび書き込み権限を持つDigitalOceanAPIキー(パーソナルアクセストークン)。 作成するには、パーソナルアクセストークンの作成方法にアクセスしてください。

これらの準備ができたら、root以外のユーザーとしてサーバーにログインして開始します。

ステップ1—OctoDNSのインストール

OctoDNSはPythonpipパッケージとして配布され、Python仮想環境( virtualenv )で実行されるため、これに必要なパッケージをインストールすることからこのステップを開始します。 virtualenvは、メインのシステム全体のPythonインストールとは別に、独自のライブラリと構成を持つことができる分離されたPython環境です。 PythonとvirtualenvはUbuntuのデフォルトのソフトウェアリポジトリ内で利用可能であり、従来のパッケージ管理ツールを使用してインストールすることができます。

ローカルパッケージインデックスを更新して、新しいアップストリームの変更を反映することから始めます。

  1. sudo apt update

次に、pythonおよびvirtualenvパッケージをインストールします。

  1. sudo apt install python virtualenv

インストールを確認した後、aptは、Python、virtualenv、およびそれらに必要なすべての依存関係をダウンロードしてインストールします。

次に、DNSとプログラム構成が保存されるOctoDNSに必要なディレクトリを作成します。 ~/octodnsおよび~/octodns/configディレクトリを作成することから始めます。

  1. mkdir ~/octodns ~/octodns/config

次に、~/octodnsに移動します。

  1. cd ~/octodns

次に、Python仮想環境を作成する必要があります。これは、OctoDNSを実行するための独自のライブラリと構成を備えた分離されたPython環境です。

  1. virtualenv env

次のコマンドを使用して環境をアクティブ化します。

  1. source env/bin/activate

これにより、次のようなものが出力されます。

Output
Running virtualenv with interpreter /usr/bin/python2 New python executable in /home/user/octodns/env/bin/python2 Also creating executable in /home/user/octodns/env/bin/python Installing setuptools, pkg_resources, pip, wheel...done.

これで、Bashシェルプロンプトの前に仮想環境の名前も付けられます。 これは、現在virtualenv内で操作していることを示しています。

(env) user@digitalocean:~/octodns$

virtualenvを終了する場合は、いつでもdeactivateコマンドを使用できます。 ただし、このチュートリアルを続行するには、virtualenvにとどまる必要があります。

Pythonとvirtualenvをインストールして構成したので、OctoDNSをインストールできます。 OctoDNSは、Pythonパッケージおよびライブラリの標準パッケージ管理ツールであるPythonpipパッケージとして配布されます。

virtualenv内で次のコマンドを使用して、OctoDNSpipパッケージをインストールできます。

  1. pip install octodns

これが完了したら、インストールされているバージョンをチェックして、すべてが機能していることを確認できます。

  1. octodns-sync --version

出力は次のようになります。

Output
octoDNS 0.9.6

octodns-sync: command not foundエラーが表示された場合は、まだvirtualenv内にいることを再確認してください。

OctoDNSをインストールしたので、必要な構成ファイルを作成してOctoDNSをDNSプロバイダーに接続し、DNSプロバイダーがDNSレコードを変更できるようにすることができます。

ステップ2—OctoDNSの構成

このステップでは、OctoDNSに必要な構成ファイルを作成し、それをDNSプロバイダーに接続して、DNSレコードにライブ変更を加え始めることができるようにします。

注:このチュートリアルでは、OctoDNSの初期設定に焦点を当てます。 ただし、本番環境で使用する場合は、OctoDNS構成を Git などのバージョン管理システム(VCS)に保存することをお勧めします。 これの利点には、完全なバージョン管理、テストのためのCI / CDとの統合、シームレスなロールバック展開などが含まれます。

まず、config.yamlファイルを構成する必要があります。このファイルは、OctoDNSが管理するDNSゾーンを定義し、DNSプロバイダーへの認証と変更を可能にします。

config.yamlの形式は、使用しているDNSプロバイダーによって若干異なります。 独自のプロバイダーの構成については、OctoDNSの公式ドキュメントのサポートされているプロバイダーのリストを参照してください。 このハイパーリンクを表示すると、構成の詳細がプロバイダーの実際のPythonコードにコードコメントとして表示されます。これは、表の[プロバイダー]列にリンクされています。 cloudflare.pyroute53.pyなどのプロバイダーのPythonコードを見つけたら、関連するコードコメントをclassProviderNameProviderのすぐ下に見つけることができます。 例えば:

octodns / Provider/route53.pyの抜粋
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:

Move into the ~/octodns/config directory:

  1. cd ~/octodns/config

Then create and open config.yaml for editing:

  1. nano config.yaml

Add the sample config.yaml configuration for your DNS provider to the file. If you’re using DigitalOcean as your DNS provider, you can use the following:

~/octodns/config/config.yaml
---
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-token

zones:
  your-domain.:
    sources:
      - config
    targets:
      - digitalocean

This file tells OctoDNS which DNS providers you want it to connect to, and which DNS zones it should manage for those providers.

You’ll need to provide some form of authentication for your DNS provider. This is usually an API key or OAuth token.

If you do not wish to store your access token in plain text in the configuration file, you can instead pass it as an environment variable when the program runs. To do this, you should use the following token: line instead in config.yaml:

~/octodns/config/config.yaml
token: env/DIGITALOCEAN\_OAUTH\_TOKEN

Then, before running OctoDNS, set the relevant environment variable to your access token, and OctoDNS will read it from there when run:

  1. export DIGITALOCEAN\_OAUTH\_TOKEN=your-digitalocean-oauth-token

Warning: This token will grant access to your DNS provider account, so you should protect it as you would a password. Also, ensure that if you’re using a version control system, either the file containing the token is excluded (e.g. using .gitignore), or is securely encrypted in some way.

If you’re using DigitalOcean as your DNS provider, you can use the required OAuth token in your DigitalOcean account settings that you generated as part of the prerequisites.

If you have multiple different DNS providers—for example, for multiple domain names, or delegated DNS zones—you can define these all in the same config.yaml file.

You’ve set up the initial OctoDNS configuration file to allow the program to authenticate to your DNS provider and make changes. Next you’ll create the configuration for your DNS zones.

Step 3 — Creating a DNS Configuration File

In this step, you’ll create an initial DNS configuration file, which will contain the DNS records for your domain name or delegated DNS zone.

Each DNS zone that you want to manage using OctoDNS has its own file, for example your-domain.yaml. In this file, the DNS records for the zone are defined using YAML.

To begin, move into the ~/octodns/config directory:

  1. cd ~/octodns/config

Then create and open your-domain.yaml for editing:

  1. nano your-domain.yaml

Add the following sample configuration to the file:

~/octodns/config/your-domain.yaml
---
'':
  - type: A
    value: your-server-ipv4-address

www:
  - type: A
    value: your-server-ipv4-address

This sample file defines a DNS zone for your-domain with two A records, pointing to the IPv4 address that you’re hosting your domain or website on. One A record is for the root domain (e.g. your-domain), and the other is for the www subdomain (e.g. www.your-domain).

Once complete, save and close the file.

You’ve set up a basic DNS zone configuration file for OctoDNS, with two basic A records pointing to the IPv4 address of your domain or website. Next, you’ll expand the file with some useful DNS records.

Step 4 — Populating Your DNS Configuration File

Next, you can populate the DNS configuration file with a practical set of DNS records for your website or service, using the YAML structured configuration language.

Unlike traditional BIND zone files, where DNS records are written in a raw, line-by-line format, DNS records within OctoDNS are defined as YAML keys and subkeys with a number of associated values, as shown briefly in Step 3.

The top-level key is usually the 'name', which is essentially the record identifier. www, subdomain1, and mail are all examples of DNS 'name'. In OctoDNS, there are two special-use names, which are '', for the root record (usually referred to as @), and '*', for wildcard records. A required value of each key (DNS record) is type. This defines which type of DNS record you are defining within that YAML top-level key. A type exists for each of the standard DNS record types, including A, AAAA, MX, TXT, NS, CNAME, and so on. A full list of available record types is available in the Records section of the OctoDNS documentation.

The values for your DNS records are defined either directly as values to the top-level keys (if you only have one value), or as a list (if you have multiple values, e.g. multiple IP addresses or MX addresses).

For example, to define a single value, you could use the following configuration:

~/octodns/config/your-domain.yaml
'www':
  type: A
  value: 203.0.113.1

Alternatively, to define multiple values for a single record:

~/octodns/config/your-domain.yaml
'www':
  type: A
  values:
  - 203.0.113.1
  - 203.0.113.2

The syntax for setting DNS records varies slightly for each record type. Following are some examples for the most common record types:

A records:

Purpose: To point to an IPv4 address.

Syntax:

'name':
  type: A
  value: ipv4-address

Example:

'www':
  type: A
  value: your-server-ipv4-address

AAAA records:

Purpose: To point to an IPv6 address.

Syntax:

'name':
  type: AAAA
  value: ipv6-address

Example:

'www':
  type: AAAA
  value: your-server-ipv6-address

CNAME records:

Purpose: To make your domain/subdomain an alias of another.

Syntax:

'name':
  type: CNAME
  value: fully-qualified-domain-name

Example:

'www':
  type: CNAME
  value: www.example.org

MX records:

Purpose: To direct email to specific servers/addresses.

Syntax:

'name':
  type: MX
  value:
    exchange: mail-server
    preference: priority-value

Note that a trailing . must be included if there are any dots in the MX value.

Example:

'':
  type: MX
  value:
    exchange: mail.your-domain.
    preference: 10

TXT records:

Purpose: To add arbitrary plain text, often used for configurations without their own dedicated record type.

Syntax:

'name':
  type: TXT
  value: content

Example:

'':
  type: TXT
  value: This is a TXT record.

In order to begin adding DNS records for your domain or delegated DNS zone, edit your DNS configuration file:

  1. cd ~/octodns/config
  2. nano your-domain.yaml

Next, you can begin populating your DNS zone using the syntax described in the previous list, as well as the Records section of the official OctoDNS documentation.

For reference, the code block here contains a full sample configuration for an initial DNS setup:

~/octodns/config/your-domain.yaml
---
'':
  - 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:abuse@your-domain\; aspf=s\; adkim=s\;

mail:
  - type: A
    value: your-server-ipv4-address

  - type: AAAA
    value: your-server-ipv6-address

www:
  - type: A
    value: your-server-ipv4-address

  - type: AAAA
    value: your-server-ipv6-address

Once you have completed your initial DNS configuration, save and close the file.

In this step, you set up the initial DNS configuration file, containing your DNS records. Next, you will test the configuration and deploy it.

Step 5 — Testing and Deploying Your DNS Configuration

In this step, you will run a local syntax check on your DNS configuration, and then deploy the changes to the live DNS server/provider.

Firstly, move into your octodns directory:

  1. cd ~/octodns

Double check that you’re still operating within your Python virtualenv by looking for the name of it before your Bash prompt:

(env) user@digitalocean:~/octodns$

Next, use the octodns-validate command to check the syntax of your configuration file(s). You’ll need to specify the path to your configuration file:

  1. octodns-validate --config=./config/config.yaml

If the YAML syntax of your DNS configuration file is correct, OctoDNS will return with no output.

If you see an error or warning in your output, OctoDNS will provide details on what and where the error is located within your YAML file.

Next, you can perform a dry-run push of the DNS configuration, which will output which changes will be made, without actually making them:

  1. octodns-sync --config=./config/config.yaml

This should produce an output similar to the following:

Output
******************************************************************************** * 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:abuse@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 ********************************************************************************

Warning: The next command will make live changes to your DNS records and possibly other settings. Please ensure that you are prepared for this, including taking a backup of your existing DNS configuration, as well as ensuring that you have the means to roll back if needed.

Finally, you can push out the changes to your live DNS provider:

  1. octodns-sync --config=./config/config.yaml --doit

Note: In some cases, OctoDNS will refuse to push changes if it is making a significant number of adjustments. This is an automatic protection feature to prevent accidental misconfigurations. If you encounter this refusal, you can re-run octodns-sync using the --force option, but please ensure you are ready to do so.

You’ll see an output like the dry-run earlier in this step, but with the addition of something similar to the following:

Output
2019-07-07T23:17:27 INFO DigitalOceanProvider[digitalocean] apply: making changes 2019-07-07T23:17:30 INFO Manager sync: 9 total changes

Now, if you check the DNS settings for your domain in the DigitalOcean control panel, you’ll see the changes.

You can also check the record creation by running a DNS query for your domain/delegated zone. You’ll see that the records have been updated accordingly:

  1. dig +short your-domain

You’ll see output showing the IP address and relevant DNS record from your zone that was deployed using OctoDNS. DNS records can take some time to propagate, so you may need to wait and run this command again.

In this final step, you ran a local syntax check of the DNS configuration file, then deployed it to your live DNS provider, and tested that the changes were made successfully.

Conclusion

In this article you set up OctoDNS and deployed a DNS configuration to a live provider. Now you can manage and test your DNS configuration changes in a safe, offline environment before deploying them to production.

If you wish to explore this subject further, OctoDNS is designed to be integrated into your CI/CD pipeline, allowing you to run in-depth tests and have more control over your deployment to production. You could also look into integrating OctoDNS into your infrastructure build/deployment processes, allowing you to deploy servers and add them to DNS completely automatically.

If you wish to go further with OctoDNS, the following DigitalOcean articles provide some interesting next steps to help integrate OctoDNS into your change management and infrastructure deployment workflows: