Posted at

IDCFクラウドのDNSをAnsibleで管理する

More than 3 years have passed since last update.

個人で取ったドメインのネームサーバーをIDCFのDNSサービスで管理しようと考えた時に、ちょっと困ったことがありました。

Ansibleが使えない?

業務から個人ネタまでインンフラ系の構成管理にAnsibleを使っている身としては、やっぱりドメイン周りも構成管理に組み込みたいわけで。

DNSサービス系のサービスでAnsibleのモジュールがあるものだとRoute53は当たり前のようにあるのですが、せっかくなのでIDCFクラウドを使ってみたいという感覚がありました。

で、改めて振り返ると、


  • AnsibleのモジュールはPython書ければ作れそうだし、ガイドラインが結構丁寧

  • IDCFクラウドはAPIが公開されているので、ちゃんとHTTPリクエスト組めば問題なく取り扱える

  • IDCFクラウドはベースがCloudStackではあるがDNSはどうも違うっぽい(?未確認)

ということなので、モジュールを自作するネタとしてはちょうど良いため、せっかくなので作ってみることにしました。


こんな感じに動く


playbook.yml

- vars:

api_key: 'YOUR_IDCF_API_KEY'
secret_key: 'YOUR_IDCF_SECRET_KEY'
tasks:
- name: ゾーンの登録
idcd_dns_zone:
idcf_api_key: '{{ api_key }}'
idcf_secret_key: '{{ secret_key }}'
zone: 'example.com'
- name: レコードを登録する
idcd_dns_record:
idcf_api_key: '{{ api_key }}'
idcf_secret_key: '{{ secret_key }}'
zone: 'example.com'
name: '{{ item.name }}'
type: '{{ item.type }}'
content: '{{ item.content }}'
with_items:
- name: 'www'
type: 'A'
content: '127.0.0.1'
- name: 'blog'
type: 'CNAME'
content: 'github.io'

現時点ではゾーンの登録/削除/更新と登録ゾーンに対する簡単なレコード登録/更新/削除ができるようになります。(ドメイン認証あたりは未実装)


モジュール作成振り返り


モジュールスクリプト自体は作成はさほど難しくない

モジュール自体は割と何で書いても動くのでさほど苦労しません。

特にAnsibleのドキュメントにはモジュールを開発する際に気をつけた方ががいいことや、ベストプラクティス的な情報が載っており、Pythonで書く場合はAnsibleの共通ライブラリも使えるため綺麗なコードが書けます。というかAnsibleModuleクラスが凄まじく便利

未来を夢想しながら書いていたら、ドキュメント部分が大半を占めていたのも特徴的でした。


モジュールのコードはそれで完結させる必要がある

モジュール実行時は実行先にモジュールをそのまま転送して実行するという挙動上、Pythonで書くモジュールはそれ単体(+ansible.module_utils.*)とpython標準のみで動作するようにしないといけないようです。

例えば、今回はidcd_dns_zone,idcf_dns_zone_facts,idcf_dns_recordというモジュールを作ったのですが、APIをコールする部分は基本的に同じなのにもかかわらずClientクラスを作って全モジュールにコピペするような運用になりました。

オフィシャル登録されれば共通モジュールの置き場がありそうなのですが、そこまでする気力がまだないので...


どこに置いてもらうか?

基本的に自作モジュールは、Playbook実行時の./libraryにおけば勝手に認識してくれています。ので、その通りにおいてもらえれば何の問題もないのですが、自作モジュールを大量に取り扱う時に死ねそう(そんなことはない気もするけれど)