個人で取ったドメインのネームサーバーをIDCFのDNSサービスで管理しようと考えた時に、ちょっと困ったことがありました。
Ansibleが使えない?
業務から個人ネタまでインンフラ系の構成管理にAnsibleを使っている身としては、やっぱりドメイン周りも構成管理に組み込みたいわけで。
DNSサービス系のサービスでAnsibleのモジュールがあるものだとRoute53は当たり前のようにあるのですが、せっかくなのでIDCFクラウドを使ってみたいという感覚がありました。
で、改めて振り返ると、
- AnsibleのモジュールはPython書ければ作れそうだし、ガイドラインが結構丁寧
- IDCFクラウドはAPIが公開されているので、ちゃんとHTTPリクエスト組めば問題なく取り扱える
- IDCFクラウドはベースがCloudStackではあるがDNSはどうも違うっぽい(?未確認)
ということなので、モジュールを自作するネタとしてはちょうど良いため、せっかくなので作ってみることにしました。
こんな感じに動く
- https://github.com/attakei/ansible-modules-idcf 内のidcfフォルダ内にあるファイルを、libraryフォルダに置く
- ↓みたいな感じにPlaybook作って実行する
- 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
におけば勝手に認識してくれています。ので、その通りにおいてもらえれば何の問題もないのですが、自作モジュールを大量に取り扱う時に死ねそう(そんなことはない気もするけれど)