GitHubじゃ!Pythonじゃ!

GitHubからPython関係の優良リポジトリを探したかったのじゃー、でも英語は出来ないから日本語で読むのじゃー、英語社会世知辛いのじゃー

github

octodns – 複数のプロバイダ間でDNSを管理するためのツール

投稿日:

複数のプロバイダ間でDNSを管理するためのツール

DNSをコードとして – 複数のプロバイダ間でDNSを管理するためのツール

コードとしてインフラストラクチャの中で、 OctoDNSは、複数のプロバイダ間でDNSレコードを簡単に管理できる一連のツールとパターンを提供します。 結果の設定はリポジトリに保存され、コードの残りの部分と同様に配備され、明確な履歴を保持し、既存のレビューとワークフローを使用することができます。

アーキテクチャはプラガブルであり、さまざまなユースケースに適用できるようにツールは柔軟性があります。 新しいプロバイダをできるだけ簡単に追加できるように努力しました。 単一のclassと数百行のコードを書くという単純なケースでは、そのほとんどはプロバイダのスキーマとOctoDNSの間で翻訳されています。 私たちがそれを使う方法のいくつかと、それを/ docsディレクトリの中で拡張する方法についてもっと詳しく説明します。

Netflix / denominatorに似ています。

入門

ワークスペース

以下のコマンドを実行すると、OctoDNSの最新リリースがインストールされ、設定ファイルが保存される場所が設定されます。 プロバイダ固有の要件が必要かどうかを判断するには、下記の[ サポート対象プロバイダ]の表を参照してください。

$ mkdir dns
$ cd dns
$ virtualenv env
...
$ source env/bin/activate
$ pip install octodns <provider-specific-requirements>
$ mkdir config

設定

まず、設定ファイルを作成して、OctoDNSに、私たちが管理したいプロバイダとゾーンについて教えてください。 以下では、私たちの設定ファイルのソースレコードとRoute53ProviderDynProvider両方を、それらのレコードのターゲットとして提供するRoute53Providerを設定しています。 任意の数のゾーンを設定することができ、それぞれのレコードのデータとターゲットのソースをいくつでも設定することができます。 別々のアカウントを使用し、それぞれ異なるゾーンセットを管理する複数の設定ファイルを持つこともできます。 これの良い例は、./ ./config/production.yaml / ./config/production.yaml &./ ./config/production.yaml / ./config/production.yamlです。 config/production.yaml焦点を当てます。

---
providers:
  config:
    class: octodns.provider.yaml.YamlProvider
    directory: ./config
  dyn:
    class: octodns.provider.dyn.DynProvider
    customer: 1234
    username: 'username'
    password: env/DYN_PASSWORD
  route53:
    class: octodns.provider.route53.Route53Provider
    access_key_id: env/AWS_ACCESS_KEY_ID
    secret_access_key: env/AWS_SECRET_ACCESS_KEY

zones:
  example.com.:
    sources:
      - config
    targets:
      - dyn
      - route53

classは、OctoDNSにPythonクラスをロードする必要があることを伝える特別なキーです。 他のキーは、そのプロバイダに設定値として渡されます。 一般に、敏感で頻繁に回転する値は環境変数から来るべきです。 OctoDNSがenv/で始まる値を見ると、プロセスの環境でその値を探し、その結果を渡します。

さらに詳しい情報は、各ソースとプロバイダクラスのdocstringにあります。

OctoDNSに、私たちがそれについて話すか、記録するために必要なプロバイダーとゾーンについて話すことができました。 ここでは単純にしておき、ドメインの最上位に単一のAレコードを作成します。

config/example.com.yaml

---
'':
  ttl: 60
  type: A
  values:
    - 1.2.3.4
    - 1.2.3.5

詳細については、 レコードのドキュメントを参照してください

いいえ

私たちは、新しい設定でドライクリーニングを実行して、どのような変更が行われるかを確認します。 ここにはふりをしているので、 example.com.既存のレコードがないように行動し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
********************************************************************************
...

画面には他のロギング情報が表示されますが、成功した同期の実行は、変更のあるすべてのプロバイダとゾーンについて、上記のような要約で終了します。 変更がなければ、その旨のメッセージが代わりに印刷されます。 上の例では、両方のプロバイダで新しいゾーンを作成して、同じ変更を表示していますが、必ずしもそうである必要はありません。 それらのうちの1つを起動すると、異なる状態になった場合、OctoDNSが同期させる予定の変更が表示されます。

変更を加える

警告 :OctoDNSは、あなたが指すドメインの所有権を前提としています。 行動するように指示すると、予期しない記録を削除するなど、状態を試して一致させるために必要なことはすべて実行します。 OctoDNSで遊んでいるときは注意してください。 偽のゾーンや、システムに慣れるまでは重要なデータがないゾーンを試すのが最善です。

今、OctoDNSに事態を起こさせるよう指示する時です。 同じオプションを指定してもう一度起動し、最後に--doitを追加して、指定した変更を実際に試してみたいときにこれを伝えます。

$ octodns-sync --config-file=./config/production.yaml --doit
...

ここでの出力は、以前と同じになり、実際の変更が行われるため、最後にもう少しログ行が追加されます。 その後、Route53とDynの設定は、yamlファイルの内容と一致する必要があります。

ワークフロー

上記のケースでは、手動でOctoDNSをコマンドラインから実行しました。 これはうまくいきます。プロバイダーのGUIに目を向けることや、クリックして変更することよりも優れていますが、OctoDNSはデプロイメントプロセスの一環として実行されるように設計されています。 実装の詳細はこのREADMEの範囲をはるかに超えていますが、ここではGitHubで使用するワークフローの例を示します。 それは、 GitHub自身が枝を展開する方法に従います。

最初のステップは、変更を加えてPRを作成することです。

コードテストと設定検証のステータスが緑色であると仮定すると、次のステップは、noopのデプロイを行い、OctoDNSが予定している変更が期待通りのものであることを確認することです。

その後、一連のレビューが来る。 あなたが成し遂げようとしていることとあなたがそれを行うためにしている変更に目に見えるものに完全な文脈を持っているべきであるチームメイトからのもの。 もう1つは、DNSを所有しているGitHubのチームメンバからのもので、ほとんどはサニティチェックとして、ベストプラクティスに従っていることを確認するためです。 可能な限り多くのものがoctodns-validate焼き付けられます。

レビューの後、ブランチを展開するときに変更を展開します。

それがスムーズに進まない場合は、予想される変更を再度確認し、 digoctodns-report確認してください。マージボタンを押してもいいとoctodns-reportします。 問題がある場合はすぐに.deploy 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の同期にはゼロの変更が表示されるはずです。

サポートされているプロバイダ

プロバイダ 要件 レコードサポート GeoDNSのサポート ノート
AzureProvider アズール-mgmt-dns A、AAAA、CNAME、MX、NS、PTR、SRV、TXT いいえ
CloudflareProvider A、AAAA、ALIAS、CAA、CNAME、MX、NS、SPF、SRV、TXT いいえ CAAタグが制限されています
DigitalOceanProvider A、AAAA、CAA、CNAME、MX、NS、TXT、SRV いいえ CAAタグが制限されています
DnsMadeEasyProvider A、AAAA、CAA、CNAME、MX、NS、PTR、SPF、SRV、TXT いいえ CAAタグが制限されています
DnsimpleProvider すべて いいえ CAAタグが制限されています
DynProvider dyn すべて はい
EtcHostsProvider A、AAAA、ALIAS、CNAME いいえ
GoogleCloudProvider google-cloud-dns A、AAAA、CAA、CNAME、MX、NAPTR、NS、PTR、SPF、SRV、TXT いいえ
Ns1プロバイダ nsone すべて はい GeoDNSのヘルスチェックがありません
OVH A、AAAA、CNAME、MX、NAPTR、NS、PTR、SPF、SRV、SSHFP、TXT、DKIM いいえ
PowerDnsProvider すべて いいえ
ラックスペース A、AAAA、エイリアス、CNAME、MX、NS、PTR、SPF、TXT いいえ
ルート53 boto3 A、AAAA、CAA、CNAME、MX、NAPTR、NS、PTR、SPF、SRV、TXT はい
AxfrSource A、AAAA、CNAME、MX、NS、PTR、SPF、SRV、TXT いいえ 読み取り専用
TinyDnsFileSource A、CNAME、MX、NS、PTR いいえ 読み取り専用
YamlProvider すべて はい 設定

ノート

  • ALIASのサポートはプロバイダーごとに大きく異なります。ニーズが詳細に満たされていることを確認するために注意が必要です。
    • DynのUIはTTLの編集や表示を許可しませんが、APIは値を受け入れて保存しますが、この値は配信時には使用されていないようです
    • Dnsimple’sは、ALIASを通して物事を提供するときに設定されたTTLを使用します。また、octaDNSが無視するALIASの横に作成されるセカンダリTXTレコードもあります
  • octoDNS自体は非ASCII文字セットをサポートしていますが、Cloudflareのテストでは、現在その機能がエンドツーエンドで機能する唯一のプロバイダです。 他のものは、クライアントライブラリやAPI呼び出しのいずれかに障害があります

カスタムソースとプロバイダ

ソースプロバイダのディレクトリをチェックアウトして、現在サポートされているものを確認することができます。 ソースは、記録情報源として機能します。 AxfrSourceとTinyDnsFileSourceは現在のところ唯一のOSSソースですが、私たちは環境に固有のいくつかの他のものを内部的に持っています。 これらには、 gPanelからホストデータを引き出すためのものや、当社のネットワーク機器に関する情報を入手して、そのインタフェース用のAPTRレコードを作成する同様のプロバイダが含まれます。 適切なOSSソースを作成する可能性のあるものには、 AWS Elastic Load Balancerに関する情報を取得し、そのためのCNAMEを動的に作成するEc2Sourceや、インスタンス情報を取得するEc2Sourceが含まれているため、 GPanelProvider仕組みと同様のホストに対してレコードを作成できます。

OctoDNSに含まれているもののほとんどはプロバイダであり、データのソースとターゲットの両方として機能できるという明白な違いがあります。 私たちは本当にこのリストが時間の経過とともに増えていくのを見たいと思いますので、サポートされていないプロバイダを使用するとPRは大歓迎です。 既存のプロバイダは、合理的な例として役立つはずです。 GeoDNSをサポートしていないものは比較的簡単です。 残念ながら、GeoDNSスタイルのトラフィック管理を行うAPIの大半は複雑で、やや矛盾しているため、その機能のサポートを追加するのはいいかもしれませんが、オプションであり、別々のパスで行うのが最適です。

プロバイダ設定セクションのclassキーは、Pythonパスの任意のクラスを指すために使用することができます。内部プロバイダやサードパーティプロバイダは、PYTHONPATHに入ることなく、OctoDNSを使ってvirtualenvにインストールされる可能性があります。

その他の用途

プロバイダ間の同期

主な使用事例は、yaml設定ファイルのセットを1つ以上のDNSプロバイダに同期することですが、OctoDNSは任意のものを容易に入手してターゲット設定することができるように構築されています。 簡単な例として、以下の設定はgithubtest.net.と同期しgithubtest.net. Route53からDynまで

---
providers:
  route53:
    class: octodns.provider.route53.Route53Provider
    access_key_id: env/AWS_ACCESS_KEY_ID
    secret_access_key: env/AWS_SECRET_ACCESS_KEY
  dyn:
    class: octodns.provider.dyn.DynProvider
    customer: env/DYN_CUSTOMER
    username: env/DYN_USERNAME
    password: env/DYN_PASSWORD

zones:

  githubtest.net.:
    sources:
      - route53
    targets:
      - dyn

ダイナミックソース

内部的には、カスタムソースを使用して、人間の介入なしに頻繁に変化する動的データに基づいてレコードを作成します。 その例は次のようになります。 ホストの場合、このメカニズムは定期的に実行され、定期的に実行され、ホストが存続し、ホストが破棄された後にホストが削除されていることを確認する限り、正しいレコードが存在することを確認します。 ホストのプロビジョニングと破壊プロセスは、レコードを作成して破壊する実際の作業を行います。

---
providers:
  gpanel-site:
    class: github.octodns.source.gpanel.GPanelProvider
    host: 'gpanel.site.github.foo'
    token: env/GPANEL_SITE_TOKEN
  powerdns-site:
    class: octodns.provider.powerdns.PowerDnsProvider
    host: 'internal-dns.site.github.foo'
    api_key: env/POWERDNS_SITE_API_KEY

zones:

  hosts.site.github.foo.:
    sources:
      - gpanel-site
    targets:
      - powerdns-site

貢献する

参加したい場合は、 寄稿文をご覧ください!

ヘルプの利用

問題や提案がある場合は、このリポジトリで問題開いてください。最善の努力をします。 このプロジェクトは、 コントリビューターコヴナント行動規範に準拠しています。

ライセンス

OctoDNSはMITライセンスの下でライセンスされています

MITライセンス交付金は、ロゴデザインを含むGitHubの商標ではありません。 GitHubは、すべての商標および著作権をGitHubのすべての商標に留保します。 GitHubのロゴには、たとえば、ファイル名に「ロゴ」が含まれる様式化されたデザインが含まれています( https://github.com/github/octodns/tree/master/docs/logos/)。

GitHub®とその定形化バージョンおよびInvertocatマークは、GitHubの商標または登録商標です。 GitHubのロゴを使用する場合は、必ずGitHubロゴのガイドラインに従ってください。

著者

OctoDNSは、 Ross McFarlandJoe Williamsによって設計され、作成されました。 これは現在、Ross、Joe、およびGitHubのサイト信頼性エンジニアリングチームの他のメンバーによって維持、レビュー、テストされています。







-github

執筆者: