Asibleで決められた命名規則の中で大量のユーザー作成を行う場合のTips

SIOS Blog

Ansibleでは、ユーザーを管理するためのUserモジュールが提供されており、こちらを活用することでユーザー管理の業務を効率化することが出来ます。

こちらの記事にてUserモジュールを使用して特定の規則に沿ってユーザー作成を行うための方法をご紹介します。

Userモジュール

AnsibleのUser モジュールは Name パラメーターに値を与えてあげることで、そのユーザーを作成してくれます。この時、パラメーターを追加することで同時に Group やパスワードの指定も可能です。サンプルコードではシンプルにUserの作成を行う例を紹介します。

---
- name: Ensure users
  hosts: node1
  become: yes

  tasks:
    - name: Create user
      user:
        name: user001
        state: present

実行結果は以下の通り

[student10@ansible ansible-files]$ ansible-playbook singleuser.yml 

PLAY [Ensure users] ************************************************************

TASK [Gathering Facts] *********************************************************
ok: [node1]

TASK [Create user] *************************************************************
changed: [node1]

PLAY RECAP *********************************************************************
node1                      : ok=2    changed=1    unreachable=0    failed=0    skipped=0    rescued=0    ignored=0  

このように、Ansibleを使用してユーザーの作成が行えました。しかし、日々の運用ではユーザーを大量に作成する機会も多いと思います。その時に活躍するのが roop 機能です。

引用:Ansible Workshop
https://github.com/ansible/workshops/blob/master/exercises/ansible_rhel/1.5-handlers/README.ja.md

---
- name: Ensure users
  hosts: node1
  become: yes

  tasks:
    - name: Ensure three users are present
      user:
        name: "{{ item }}"
        state: present
      loop:
         - dev_user
         - qa_user
         - prod_user

UserモジュールのNameパラメーターが {{ item }} が設定されており、このitem変数には loop で指定された項目が順に入力され実行されます。つまり、ここでは「dev_user」「qa_user」「prod_user」が順に入力され、ユーザーの作成が行われます。実行結果は下記のようになります。

[student9@ansible ansible-files]$ ansible-playbook loop_users.yml 

PLAY [Ensure users] ************************************************************

TASK [Gathering Facts] *********************************************************
ok: [node1]

TASK [Ensure three users are present] ******************************************
changed: [node1] => (item=dev_user)
changed: [node1] => (item=qa_user)
changed: [node1] => (item=prod_user)

PLAY RECAP *********************************************************************
node1                      : ok=2    changed=1    unreachable=0    failed=0    skipped=0    rescued=0    ignored=0   

特定の規則に沿ってユーザーの作成を行いたい場合は、with_sequence を使用してユーザーの作成を行うことができます。

下記の例では0からスタートして10まで、つまり10回User作成が行われ、その時のユーザー名のフォーマットが「testuser%03g」で記載されています。つまり1回目の実行では「testuser000」、2回目は「testuser001」、最後の11回目には「testuser010」が作成される形になります。

---
- name: Ensure users
  hosts: node1
  become: yes

  tasks:
  - name: loop sequence
    user:
      name: "{{ item }}"
    with_sequence: start=0 end=10 stride=1 format=testuser%03g

実行結果は下記のとおりになります。

[student10@ansible ansible-files]$ ansible-playbook loop_users.yml 

PLAY [Ensure users] ************************************************************

TASK [Gathering Facts] *********************************************************
ok: [node1]

TASK [loop sequence] ***********************************************************
changed: [node1] => (item=testuser000)
changed: [node1] => (item=testuser001)
changed: [node1] => (item=testuser002)
changed: [node1] => (item=testuser003)
changed: [node1] => (item=testuser004)
changed: [node1] => (item=testuser005)
changed: [node1] => (item=testuser006)
changed: [node1] => (item=testuser007)
changed: [node1] => (item=testuser008)
changed: [node1] => (item=testuser009)
changed: [node1] => (item=testuser010)

PLAY RECAP *********************************************************************
node1                      : ok=2    changed=1    unreachable=0    failed=0    skipped=0    rescued=0    ignored=0   

このように、AnsibleにてUserモジュールを使用したユーザー管理を行うことで日々の業務がより楽にそして確実に行うことも出来ます。4月にはユーザー作成業務が大量に必要になるケースがあるかと思います。そのときにはこちらのUserモジュールが活躍する場がありましたら是非ご活用ください。