LoginSignup
3
3

More than 5 years have passed since last update.

IAMユーザをAnsibleで管理する

Last updated at Posted at 2017-03-17

はじめに

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

こんな感じに変数を定義します。

group_vars/group.yml
---
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により、ユーザ作成結果の内容から、新規作成時のみ実行するようにします。

roles/iam/tasks/main.yml
---
- 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

roles/iam/templates/save_credential.j2
{% 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情報が残るので何かと便利だと思います。

参考

3
3
0

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
3
3