AnsibleでRoute53のレコード情報をいい感じにエクスポートする(全件対応版)


#はじめに

前回、[こちら](http://qiita.com/tomohiko_isobe/items/5b3c45145abf9facdfcd)でRoute53のレコード一覧をAnsibleでエクスポートする事例をご紹介しましたが、Ansibleの`route53_facts`モジュールの仕様上、ゾーンあたり100件までしかレコードを取得できないことが分かりました。
なんとか100件以上のレコードをエクスポートしたいと思い色々調べていたところ、Ansibleのモジュールだと難しいですが、botoに同梱されている`route53`コマンドが使えることが分かりました。

というわけで、`route53`コマンドをAnsibleから実行することで全件エクスポートを実現しようと思います。


#前提
- AWS関連のモジュール実行にはbotoが必要です。
- route53コマンドが必要です（botoに同梱）。
- credential情報については、環境変数`AWS_DEFAULT_PROFILE`で適切なprofileが選択されていることとします。

#sample

##やること
取得したroute53のレコードセット情報を、ゾーンごとにworkディレクトリに保存する


##ディレクトリ構成

```bash:ディレクトリ構成
site.yml
roles/
|--route53_export/
|  |--tasks/
|  |  |--main.yml
|  |--templates/
|  |  |--save_record_sets.j2
hosts/aws                  #inventory
work/                      #ゾーン単位でレコード情報が出力される
|--testdomain.com.txt        #出力されたレコード情報

```

##inventory

AWSリソース関連モジュールはすべてlocalhostで実行するので、下記のようなインベントリファイルを用意します。

```bash:hosts/aws
[aws]
localhost
```

##Role
- `route53`コマンドはAWS CLIと違い、環境変数`AWS_DEFAULT_PROFILE`でセットしたプロファイルを読んでくれません。そのため、環境変数`AWS_PROFILE`にセットする必要があります。


```yaml:roles/route53_export/tasks/main.yml
---
- name: Create directory
  file:
    path: "{{ inventory_dir | dirname }}/work/route53_export"
    state: directory
    mode: '0775'
    group: wheel
  delegate_to: localhost
  check_mode: no
  changed_when: no
  become: yes

- name: Get all hosted zones
  route53_facts:
    query: hosted_zone
  register: hosted_zones
  check_mode: no

- name: Get record sets in a given hosted zone
  shell: >-
    export AWS_PROFILE=`echo $AWS_DEFAULT_PROFILE` && \
    route53 get {{ item.Id | regex_replace('/hostedzone/','') }}
  check_mode: no
  changed_when: no
  register: record_sets
  with_items: "{{ hosted_zones.HostedZones }}"

- name: Save record sets
  template:
    src: save_record_sets.j2
    dest: >-
      {{ inventory_dir | dirname }}/work/route53_export/{{ item.item.Name | regex_replace('(^.*)\.$','\1') }}.txt
    mode: '0664'
    group: wheel
  delegate_to: localhost
  changed_when: no
  become: yes
  with_items: "{{ record_sets.results }}"
  when: not ansible_check_mode
```

##template

```YAML:roles/route53_export/templates/save_record_sets.j2
{{ item.stdout }}
```

##site.yml
```YAML:site.yml
---
- name: route53_export
  hosts: localhost
  connection: local
  roles:
    - role: route53_export
```

##実行
```bash:Command
$ ansible-playbook -i hosts/aws -l localhost site.yml
```

##出力イメージ
```YAML:work/testdomain.com.txt
Name                                     Type  TTL                  Value(s)
testdomain.com.                          NS    172800               ns-174.awsdns-21.com.,ns-1037.awsdns-01.org.,ns-1745.awsdns-26.co.uk.,ns-613.awsdns-12.net.
testdomain.com.                          SOA   900                  ns-174.awsdns-21.com. awsdns-hostmaster.amazon.com. 1 7200 900 1209600 86400
cname.testdomain.com.                    CNAME 300                  www.example.com
text.testdomain.com.                     TXT   300                  "var"
www.testdomain.com.                      A     7200                 10.1.1.1
```

#まとめ
出力イメージについては、route53コマンドの出力結果がそこそこ見やすいのでそのままファイルに出力しています。
必要に応じてJSONに整形すればYAML形式に変換するのも簡単です。

#参考
##AnsibleでAWSリソースを管理するシリーズ
- [VPCをAnsibleで作成する](http://qiita.com/tomohiko_isobe/items/c245bedfa6966305eb10)
- [IAMユーザをAnsibleで管理する](http://qiita.com/tomohiko_isobe/items/5ae6f15f52a2d20e2635)
- [AWSのセキュリティグループをAnsibleで管理する](http://qiita.com/tomohiko_isobe/items/7342b8ba874d997c5c6c)
- [EC2をAnsibleで管理する](http://qiita.com/tomohiko_isobe/items/163b23d5a0e566aaa159)
- [ec2_group_factsモジュールをAnsible2.2で使えるようにする](http://qiita.com/tomohiko_isobe/items/8684b4dc8f99793e5cf8)
- [RDSをAnsibleで管理する](http://qiita.com/tomohiko_isobe/items/7ce42217e177f0c6b7ec)
- [AnsibleでRoute53を管理する](http://qiita.com/tomohiko_isobe/items/85c5513314a64f2392ba)
- [Ansibleの実行対象AWSアカウントを事前にチェックして事故防止](http://qiita.com/tomohiko_isobe/items/f24fbd86eb64a0e9bd4a)
- [ACMを利用した独自取得SSL証明書更新をAnsibleでやってみる](http://qiita.com/tomohiko_isobe/items/893e9448b7fd0dacc11e)