AnsibleによるIAMユーザの管理

2016.10.31

この記事は公開されてから1年以上経過しています。情報が古い可能性がありますので、ご注意ください。

渡辺です。

本日紹介するモジュールはIAM User/Group/Roleを管理するiamモジュールです。 AnsibleでIAM User/Group/Roleを管理するでも紹介しましたが、今回はグループ変数ありきのテクニックを紹介します。

IAM Userの定義

早速、グループ変数での定義部分をみていきましょう。 前提として、IAM Userは最低でもひとつのGroupに属するとします。

iam_users:
 - name: user1
   groups:
     - group1
     - group2
 - name: user2
   groups:
     - group2

単一のグループでよい場合はもっとシンプルになるかと思います。

IAM Group/Userの作成

Playbookです。

---
- hosts: localhost
  connection: local
  gather_facts: False
  tasks:
    - iam:
        iam_type: group
        name: "{{ item.1 }}"
        state: present
        profile: "{{ profile }}"
      with_subelements:
        - "{{ iam_users }}"
        - groups
    - iam:
        iam_type: user
        name: "{{ item.name }}"
        groups: "{{ item.groups }}"
        state: present
        profile: "{{ profile }}"
      with_items: "{{ iam_users }}"

はじめにIAM Groupの作成、次にIAM Userの作成という流れです。

IAM Groupの作成

IAM Groupは複数あり、複数のIAM Userが属することになります。 このため、IAM Groupの一意的なリストが必要と考えるでしょう。 そこで、iam_groupsという変数を定義してIAM Groupの一覧を別途管理することも可能ですが、定義の重複は避けたい所です。

さて、Ansibleは冪等性を保つように作成されています。 既に存在するIAM Groupであれば何度実行しても、リソースの状態が変わることはありません。 したがって、次のようにリストに重複があったとしても、group1group2が作成されることに違いはないのです。

    - iam:
        iam_type: group
        name: "{{ item.1 }}"
        state: present
        profile: "{{ profile }}"
      with_items:
        - group1
        - group1
        - group2

つまり、iam_users.groupsの要素をすべてループさせれば良いのです。 先日紹介したwith_subelementsを利用すれば、次のようになります( サブ要素をループするAnsibleのwith_subelements | Developers.IO)。

    - iam:
        iam_type: group
        name: "{{ item.1 }}"
        state: present
        profile: "{{ profile }}"
      with_subelements:
        - "{{ iam_users }}"
        - groups

このように、グループ変数をスッキリさせますが、一方でタスクでは少々複雑なことをしてます。 この部分はトレードオフとなるので、どちらを優先させるかのポリシーが大切です。

IAM Userを作成する

    - iam:
        iam_type: user
        name: "{{ item.name }}"
        groups: "{{ item.groups }}"
        state: present
        profile: "{{ profile }}"
      with_items: "{{ iam_users }}"

IAM Userの作成は、with_itemsを使ったシンプルなタスクです。 groupsにはリストを指定することも、単一のグループ名を指定することもできます。

IAM Userのパスワードを設定する

次のようにIAM User作成時に、passwordを指定することで、パスワードを設定することができます。

    - iam:
        iam_type: user
        name: "{{ item.name }}"
        groups: "{{ item.groups }}"
        password: "{{ item.password }}"
        state: present
        profile: "{{ profile }}"
      with_items: "{{ iam_users }}"

ただし、passwordを指定した場合、ステータスは必ずchangedになります。 恐らくは現在のパスワードと設定されているパスワードが一致するか、APIで確認出来ないからでしょう。 まあ、パスワードはユーザが変更することを期待するものですから、仕方ない部分もあります。 このような仕様であるため、パスワードの設定を行うのは、初期のIAMユーザ作成時に限る方が良いでしょう。

また、グループ変数にパスワードを設定する場合、vaultでの暗号化を忘れないようにしてください。 そのパスワードがgithubなどにコミットされ漏洩した場合のリスクがあるので扱いには注意すべきです。

まとめ

iamモジュールを利用することで、IAM User/Groupを作成することができます。 特に大量のIAM Userを作成する場合、ひとつひとつ作成するのは非常に面倒なので、一括で作れるようなPlaybook(Role)を作成しておくと非常に便利です。 ただし、パスワードの扱いについては充分に注意を払いましょう。