Debian10でOctoDNSを使用してDNSを展開および管理する方法
序章
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ゾーンを定義します。これにより、ループなどの高度なプログラム機能を使用して、同じゾーン内の複数の類似したレコードを指定できます。 記事Debian10でDNSControlを使用してDNSを展開および管理する方法では、DNSControlの基本的なセットアップと構成について説明しています。
このチュートリアルでは、OctoDNSをインストールして構成し、基本的なDNS構成を作成して、ライブプロバイダーへのDNSレコードの展開を開始します。 このチュートリアルの一部として、DNSプロバイダーの例としてDigitalOceanを使用します。 別のプロバイダーを使用する場合、セットアップは非常に似ています。 終了すると、安全なオフライン環境でDNS構成を管理およびテストし、それを本番環境に自動的に展開できるようになります。
前提条件
このガイドを開始する前に、次のものが必要です。
- Debian 10を使用した初期サーバーセットアップに従ってセットアップされた1台のDebian10サーバー。これには、sudo非rootユーザーと、ファイアウォールが非必須ポートをブロックできるようになっています。
your-server-ipv4-address
とyour-server-ipv6-address
WebサイトまたはドメインをホストしているサーバーのIPアドレスを参照してください。 - がサポートするプロバイダーによってホストされているDNSに完全に登録されたドメイン名。 このチュートリアルでは、
your-domain
全体とサービスプロバイダーとしてのDigitalOcean。 - 読み取りおよび書き込み権限を持つDigitalOceanAPIキー(パーソナルアクセストークン)。 作成するには、パーソナルアクセストークンの作成方法にアクセスしてください。
これらの準備ができたら、root以外のユーザーとしてサーバーにログインして開始します。
ステップ1—OctoDNSのインストール
OctoDNSはPythonpipパッケージとして配布され、Python仮想環境( virtualenv )で実行されるため、これに必要なパッケージをインストールすることからこのステップを開始します。 A virtualenv
は、メインのシステム全体のPythonインストールとは別に、独自のライブラリと構成を持つことができる分離されたPython環境です。 Pythonと virtualenv
Debianのデフォルトのソフトウェアリポジトリ内で利用可能であり、従来のパッケージ管理ツールを使用してインストールすることができます。
ローカルパッケージインデックスを更新して、新しいアップストリームの変更を反映することから始めます。
- sudo apt update
次に、をインストールします python
と virtualenv
パッケージ:
- sudo apt install python virtualenv
インストールを確認した後、 apt
Pythonをダウンロードしてインストールします。 virtualenv
、およびそれらに必要なすべての依存関係。
次に、DNSとプログラム構成が保存されるOctoDNSに必要なディレクトリを作成します。 を作成することから始めます ~/octodns
と ~/octodns/config
ディレクトリ:
- mkdir ~/octodns ~/octodns/config
今に移動します ~/octodns
:
- cd ~/octodns
次に、Python仮想環境を作成する必要があります。これは、OctoDNSを実行するための独自のライブラリと構成を備えた分離されたPython環境です。
- virtualenv env
次のコマンドを使用して環境をアクティブ化します。
- source env/bin/activate
これにより、次のようなものが出力されます。
OutputRunning 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パッケージとして配布されます。
OctoDNS pipパッケージは、次のコマンドを使用してインストールできます。 virtualenv
:
- pip install octodns
これが完了したら、インストールされているバージョンをチェックして、すべてが機能していることを確認できます。
- octodns-sync --version
出力は次のようになります。
OutputoctoDNS 0.9.9
あなたが見たら 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コードにコードコメントとして表示されます。これは、表の[プロバイダー]列にリンクされています。 プロバイダーのPythonコードを見つけたら、次のようになります。 cloudflare.py
また route53.py
、関連するコードコメントは、 class
ProviderNameProvider
. 例えば:
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
サンプルを追加します config.yaml
ファイルへのDNSプロバイダーの構成。 DNSプロバイダーとしてDigitalOceanを使用している場合は、次を使用できます。
---
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
このファイルは、OctoDNSに、接続するDNSプロバイダーと、それらのプロバイダーに対して管理する必要のあるDNSゾーンを通知します。
DNSプロバイダーに何らかの形式の認証を提供する必要があります。 これは通常、APIキーまたはOAuthトークンです。
アクセストークンをプレーンテキストで構成ファイルに保存したくない場合は、代わりに、プログラムの実行時に環境変数としてアクセストークンを渡すことができます。 これを行うには、次を使用する必要があります token:
代わりに行 config.yaml
:
token: env/DIGITALOCEAN\_OAUTH\_TOKEN
次に、OctoDNSを実行する前に、関連する環境変数をアクセストークンに設定すると、OctoDNSは実行時にそこから読み取ります。
- export DIGITALOCEAN\_OAUTH\_TOKEN=your-digitalocean-oauth-token
警告:このトークンはDNSプロバイダーアカウントへのアクセスを許可するため、パスワードと同じように保護する必要があります。 また、バージョン管理システムを使用している場合は、トークンを含むファイルが除外されていることを確認してください(例: を使用して .gitignore
)、または何らかの方法で安全に暗号化されています。
DNSプロバイダーとしてDigitalOceanを使用している場合は、前提条件の一部として生成したDigitalOceanアカウント設定で必要なOAuthトークンを使用できます。
複数の異なるDNSプロバイダーがある場合(たとえば、複数のドメイン名や委任されたDNSゾーンの場合)、これらすべてを同じもので定義できます。 config.yaml
ファイル。
プログラムがDNSプロバイダーに対して認証し、変更を加えることができるように、初期OctoDNS構成ファイルを設定しました。 次に、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-address
www:
- type: A
value: your-server-ipv4-address
このサンプルファイルは、次のDNSゾーンを定義します your-domain
2つで A
ドメインまたはウェブサイトをホストしているIPv4アドレスを指すレコード。 1 A
レコードはルートドメイン用です(例: your-domain
)、もう1つは www
サブドメイン(例: www.your-domain
).
完了したら、ファイルを保存して閉じます。
OctoDNSの基本的なDNSゾーン構成ファイルを設定しました。2つの基本的なものがあります A
ドメインまたはWebサイトのIPv4アドレスを指すレコード。 次に、いくつかの有用なDNSレコードを使用してファイルを展開します。
ステップ4—DNS構成ファイルにデータを入力する
次に、YAML構造化構成言語を使用して、DNS構成ファイルにWebサイトまたはサービスのDNSレコードの実用的なセットを入力できます。
DNSレコードが生の行ごとの形式で書き込まれる従来のBINDゾーンファイルとは異なり、OctoDNS内のDNSレコードは、YAMLキーおよびサブキーとして定義され、いくつかの値が関連付けられています。ステップ3。
トップレベルのキーは通常、 'name'
、これは基本的にレコード識別子です。 www
, subdomain1
、 と mail
すべてDNSの例です 'name'
. OctoDNSには、2つの特殊用途の名前があります。 ''
、ルートレコード(通常は @
)、 と '*'
、ワイルドカードレコードの場合。 各キー(DNSレコード)に必要な値は次のとおりです。 type
. これは、そのYAMLトップレベルキー内で定義しているDNSレコードのタイプを定義します。 A type
以下を含む標準DNSレコードタイプごとに存在します A
, AAAA
, MX
, TXT
, NS
, CNAME
、 等々。 使用可能なレコードタイプの完全なリストは、OctoDNSドキュメントのレコードセクションにあります。
DNSレコードの値は、最上位キーへの値(値が1つしかない場合)またはリスト(複数の値がある場合など)として直接定義されます。 複数のIPアドレスまたはMXアドレス)。
たとえば、単一の値を定義するには、次の構成を使用できます。
'www':
type: A
value: 203.0.113.1
または、単一のレコードに複数の値を定義するには、次のようにします。
'www':
type: A
values:
- 203.0.113.1
- 203.0.113.2
DNSレコードを設定するための構文は、レコードタイプごとにわずかに異なります。 以下は、最も一般的なレコードタイプの例です。
A
記録:
目的: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/config
- nano your-domain.yaml
次に、前のリストで説明した構文と、OctoDNSの公式ドキュメントの Records セクションを使用して、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: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
DNSの初期構成が完了したら、ファイルを保存して閉じます。
この手順では、DNSレコードを含む初期DNS構成ファイルを設定します。 次に、構成をテストしてデプロイします。
ステップ5—DNS構成のテストと展開
このステップでは、DNS構成に対してローカル構文チェックを実行してから、変更をライブDNSサーバー/プロバイダーに展開します。
まず、あなたの中に移動します octodns
ディレクトリ:
- cd ~/octodns
Python内でまだ操作していることを再確認してください virtualenv
Bashプロンプトの前にその名前を探すことによって:
(env) user@digitalocean:~/octodns$
次に、 octodns-validate
構成ファイルの構文を確認するコマンド。 構成ファイルへのパスを指定する必要があります。
- octodns-validate --config=./config/config.yaml
DNS構成ファイルのYAML構文が正しい場合、OctoDNSは出力なしで返されます。 出力にエラーまたは警告が表示された場合、OctoDNSはYAMLファイル内のエラーの場所と場所に関する詳細を提供します。
次に、DNS構成のドライランプッシュを実行できます。これにより、実際に変更を加えることなく、どの変更が行われるかが出力されます。
- octodns-sync --config=./config/config.yaml
これにより、次のような出力が生成されます。
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
********************************************************************************
警告:次のコマンドは、DNSレコードおよび場合によっては他の設定にライブ変更を加えます。 既存のDNS構成のバックアップを取ることを含め、これに備えていることを確認してください。また、必要に応じてロールバックする手段があることを確認してください。
最後に、ライブDNSプロバイダーに変更をプッシュできます。
- octodns-sync --config=./config/config.yaml --doit
注:場合によっては、OctoDNSが大幅な数の調整を行っている場合、変更のプッシュを拒否します。 これは、偶発的な設定ミスを防ぐための自動保護機能です。 この拒否に遭遇した場合は、再実行できます octodns-sync
を使用して --force
オプションですが、準備ができていることを確認してください。
このステップの前半でドライランのような出力が表示されますが、次のようなものが追加されています。
Output2019-07-07T23:17:27 INFO DigitalOceanProvider[digitalocean] apply: making changes
2019-07-07T23:17:30 INFO Manager sync: 9 total changes
ここで、DigitalOceanコントロールパネルでドメインのDNS設定を確認すると、変更が表示されます。
ドメイン/委任ゾーンに対してDNSクエリを実行して、レコードの作成を確認することもできます。 dig
.
お持ちでない場合 dig
インストールされている場合は、をインストールする必要があります dnsutils
パッケージ:
- sudo apt install dnsutils
インストールしたら dig
、これを使用して、ドメインのDNSルックアップを作成できます。 レコードがそれに応じて更新されていることがわかります。
- dig +short your-domain
OctoDNSを使用してデプロイしたゾーンのIPアドレスと関連するDNSレコードを示す出力が表示されます。 DNSレコードの伝播には時間がかかる場合があるため、このコマンドを待ってから再度実行する必要がある場合があります。
この最後のステップでは、DNS構成ファイルのローカル構文チェックを実行し、それをライブDNSプロバイダーに展開して、変更が正常に行われたことをテストしました。
結論
この記事では、OctoDNSをセットアップし、DNS構成をライブプロバイダーに展開しました。 これで、DNS構成の変更を安全なオフライン環境で管理およびテストしてから、本番環境に展開できます。
このテーマをさらに詳しく調べたい場合は、OctoDNSがCI / CDパイプラインに統合されるように設計されているため、詳細なテストを実行し、本番環境への展開をより詳細に制御できます。 また、OctoDNSをインフラストラクチャの構築/展開プロセスに統合して、サーバーを展開し、それらをDNSに完全に自動的に追加できるようにすることも検討できます。
OctoDNSをさらに進めたい場合は、次のDigitalOceanの記事で、OctoDNSを変更管理およびインフラストラクチャ展開ワークフローに統合するのに役立ついくつかの興味深い次のステップを提供します。