#はじめに
AnsibleにはAWSのリソースを操作できるモジュールが豊富に用意されています。
今回はIAMを操作するモジュールを利用して、AnsibleでIAMユーザを管理してみたいと思います。
#やること
- IAMユーザ作成・所属グループ変更
- IAMグループ作成・変更
##ポイント
- ユーザ側の変数で定義したグループを作成する(グループ作成用に別途定義しない)
- ユーザ新規作成時に、ローカルにユーザごとのcredential情報をファイル出力
#注意
IAMユーザのパスワードは設定しません。
理由は後述。
#前提
AWS関連のモジュール実行にはbotoが必要です。
#sample
以下のようなユーザとグループを作成します。
- user1
- 所属グループ:group1
- user2
- 所属グループ:group1,group2
##ディレクトリ構成
site.yml
roles/
|--iam/
| |--tasks/
| | |--main.yml
| |--templates/
| | |--save_credential.j2
group_vars/
|--group.yml
##vars
こんな感じに変数を定義します。
---
my_vars:
aws:
iam:
users:
- name: user1
groups:
- group1
- name: user2
groups:
- group1
- group2
##Role
まず、users以下でループさせて、with_subelementsによりユーザが所属するグループを全て作成します。
with_subelementsは多重ループを実現できる便利なディレクティブです。
グループについては、ユーザごとに定義しているので重複しますが、Ansibleが冪等性を担保してくれるので問題ありません。
ユーザ作成については、結果をregisterで保持しておきます。
ここにcredential情報が格納されています。
なお、password:
によりパスワードも設定できますが、今回は使用しませんでした。なぜなら同じパスワードであっても毎回Ansible上でのステータスがchangedとなってしまうためです。
続いてローカルにcredential情報を格納するためのディレクトリを作成します。
そして、registerに保存したユーザ作成結果からcredential情報を取り出してテンプレートに埋め込み、ローカルにファイル出力します。
whenにより、ユーザ作成結果の内容から、新規作成時のみ実行するようにします。
---
- name: IAMグループ作成
iam:
iam_type: group
name: "{{ item.1 }}"
state: present
with_subelements:
- "{{ my_vars.aws.iam.users }}"
- groups
- flags:
skip_missing: True
- name: IAMユーザ作成
iam:
iam_type: user
name: "{{ item.name }}"
state: present
groups: "{{ item.groups }}"
access_key_state: create
with_items: "{{ my_vars.aws.iam.users }}"
register: iam_user
- name: credential情報格納用ディレクトリ作成
file:
path: "{{ inventory_dir }}/aws_credentials"
state: directory
mode: 0755
group: wheel
delegate_to: localhost
check_mode: no
changed_when: no
become: yes
- name: credential情報出力
template:
src: save_credential.j2
dest: "{{ inventory_dir }}/aws_credentials/{{ item.item.name }}"
mode: 0644
group: wheel
delegate_to: localhost
changed_when: no
become: yes
with_items: "{{ iam_user.results }}"
when: item.user_meta is defined and not ansible_check_mode
##templates
{% set params = item.user_meta.access_keys[0] %}
aws_access_key_id = {{ params.access_key_id }}
aws_secret_access_key = {{ params.secret_access_key }}
#まとめ
これでシンプルなYAMLでIAMユーザを管理できるようになりました。
また、新規ユーザ作成時には実行ホストにcredential情報が残るので何かと便利だと思います。
#参考
http://dev.classmethod.jp/server-side/ansible/looping_over_subelements/