AnsibleによるIAMユーザの管理
渡辺です。
本日紹介するモジュールは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であれば何度実行しても、リソースの状態が変わることはありません。
したがって、次のようにリストに重複があったとしても、group1
とgroup2
が作成されることに違いはないのです。
- 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)を作成しておくと非常に便利です。 ただし、パスワードの扱いについては充分に注意を払いましょう。