てくなべ (tekunabe)

ansible / network / automation / StackStorm

[Ansible] user モジュールの基本的な使い方(ユーザーの作成・削除など)

■ はじめに

Ansible には、ユーザーを管理(作成、削除など)する user モジュール があります。

この記事では、 user モジュールの公式ドキュメントに記載されている使用例をベースにして、使い方を説明します。

なお、公式ドキュメントの使用例は、Playbook 単位ではなくtask 単位で記載されています。この記事では Playbook 単位で例示します。

動作確認環境

  • Ansible 2.3.0, 2.7.8
  • CentOS 7.6 (Ansible 側、管理対象ホスト側とも)

目次


■ [例1] 単純にユーザーを作成する

Playbook

ユーザー kingyo を作成する Playbook です。公式ドキュメントの使用例にはありませんが、一番シンプルな使い方です。

- hosts: linux
  gather_facts: no
  become: yes

  tasks:
    - name: Add the user 'kingyo'
      user:
        name: kingyo
  • name オプション
    • 対象のユーザー名を指定します。(必須)

本タスクで指定していないその他のオプション例

  • state オプション
    • 対象のユーザーが存在する状態(present)にするか、存在しない状態(absent)にするかを指定します。(デフォルト present
    • ここでは state: absent を指定しているため、存在しない状態(存在する場合は削除)という指定になります。

実行ログ

ここでは、kingyo ユーザー未作成の状態で Playbook を実行します。

  • リモート上の事前確認
$ id kingyo 
id: kingyo: no such user  # kingyo ユーザーがまだ存在しない
  • Ansible 側
$ ansible-playbook -i inventory user_add_simple.yml 

PLAY [linux] **************************************************************************************************

TASK [Add the user 'kingyo'] **********************************************************************************
changed: [linux1]

PLAY RECAP ****************************************************************************************************
linux1                     : ok=1    changed=1    unreachable=0    failed=0   
  • リモート上の事後確認
$ id kingyo 
uid=1041(kingyo) gid=1041(kingyo) groups=1041(kingyo)  # kingyo ユーザーが作成された
$ cat /etc/passwd | grep kingyo
kingyo:x:1041:1041::/home/kingyo:/bin/bash

無事に指定した通りに、ユーザー kingyo が作成されました。 groupgroups オプションを指定していなかったため、暗黙的に新たに作成された kingyo グループにプライマリグループとして所属しています。


■ [例2] プライマリグループとユーザーIDを指定してユーザーを作成する

Playbook

作成済みの admin グループにプライマリグループとして所属し、ユーザーID 1040 のユーザー jonhnd を作成する Playbook です

- hosts: linux
  gather_facts: no
  become: yes

  tasks:
    - name: Add the user 'johnd' with a specific uid and a primary group of 'admin'
      user:
        name: johnd
        comment: John Doe
        uid: 1040
        group: admin
  • name オプション
    • 対象のユーザー名を指定します。(必須)
  • comment オプション
    • /etc/passwd のコメント欄に記入するコメントを指定します。
  • uid オプション
    • 対象のユーザーIDを指定します。
  • group オプション
    • 対象のユーザーが所属するプライマリグループ名を指定します。
    • 似たようなオプションに groups(サブグループの指定)があるので注意してください。

実行ログ

ここでは、johnd ユーザーは未作成、admin グループは作成済みの状態で Playbook を実行します。

$ ansible-playbook -i inventory user_add.yml 

PLAY [linux] **********************************************************************************

TASK [Add the user 'johnd' with a specific uid and a primary group of 'admin'] ****************
changed: [linux1]

PLAY RECAP ************************************************************************************
linux1                     : ok=1    changed=1    unreachable=0    failed=0   

$ 
$ id johnd
uid=1040(johnd) gid=1002(admin) groups=1002(admin)
$ cat /etc/passwd | grep johnd
johnd:x:1040:1002:John Doe:/home/johnd:/bin/bash    # johnd ユーザーが作成された

無事に指定した通りに、ユーザー johnd が作成されました。


■ [例3] サブグループと使用シェルを指定してユーザーを作成する

Playbook

作成済みの adminsdevelopers グループにサブグループとして所属し、`/bin/bash を使用するユーザー james を作成する Playbook です。

- hosts: linux
  gather_facts: no
  become: yes

  tasks:
    - name: Add the user 'james' with a bash shell, appending the group 'admins' and 'developers' to the user's groups
      user:
        name: james
        shell: /bin/bash
        groups: admins, developers
        append: yes
  • name オプション
    • 対象のユーザー名を指定します。(必須)
  • shell オプション
    • 使用するシェルを指定します。
  • groups オプション
    • 対象のユーザーが所属するサブグループ名を指定します。
    • 複のグループ名を指定できます。Ansible 2.3 からは、カンマ区切りの他にリストも指定できます。
    • 似たようなオプションに group (プライマリグループの指定)があるので注意してください。
  • append オプション
    • groups オプションで指定したグループ名を追加所属させるかどうかを指定します。(デフォルト no
    • append: no を指定(デフォルト)の場合、groups オプションで指定したグループ以外の所属は外れます。

実行ログ

ここでは、james ユーザーは未作成、adminsdevelopers グループは作成済みの状態で Playbook を実行します。

$ ansible-playbook -i inventory user_add_goups.yml 

PLAY [linux] **********************************************************************************

TASK [Add the user 'james' with a bash shell, appending the group 'admins' and 'developers' to the user's groups] ***
changed: [linux1]

PLAY RECAP ************************************************************************************
linux1                     : ok=1    changed=1    unreachable=0    failed=0   

$ id james
uid=1002(james) gid=1005(james) groups=1005(james),1003(admins),1004(developers)  # james ユーザーが作成された
$ cat /etc/passwd | grep james   
james:x:1002:1005::/home/james:/bin/bash

無事に指定した通りに、ユーザー james が作成されました。


■ [例4] ユーザーを削除する

Playbook

作成済みのユーザー johnd を削除する Playbook です。

- hosts: linux
  gather_facts: no
  become: yes

  tasks:
    - name: Remove the user 'johnd'
      user:
        name: johnd
        state: absent
        remove: yes
  • name オプション
    • 対象のユーザー名を指定します。(必須)
  • state オプション
    • 対象のユーザーが存在する状態(present)にするか、存在しない状態(absent)にするかを指定します。(デフォルト present
  • remove オプション
    • state: absent の指定場合った場合、対象のユーザーに関連づいたディレクトリを削除します。(デフォルト no

実行ログ

$ id johnd                  
uid=1040(johnd) gid=1002(admin) groups=1002(admin) # johnd ユーザーがまだ存在する
$ cat /etc/passwd | grep johnd
johnd:x:1040:1002:John Doe:/home/johnd:/bin/bash
$ sudo ls -al /home/johnd/  
total 20         # johnd のホームディレクトリがまだ存在する
drwx------. 2 1040 admin 4096 Mar  3 01:53 .
drwxr-xr-x. 6 root root  4096 Mar  3 02:08 ..
-rw-r--r--. 1 1040 admin   18 Oct 30 17:07 .bash_logout
-rw-r--r--. 1 1040 admin  193 Oct 30 17:07 .bash_profile
-rw-r--r--. 1 1040 admin  231 Oct 30 17:07 .bashrc

$ ansible-playbook -i inventory user_remove.yml 

PLAY [linux] ********************************************************************************************************************

TASK [Remove the user 'johnd'] **************************************************************************************************
changed: [linux1]

PLAY RECAP **********************************************************************************************************************
linux1                     : ok=1    changed=1    unreachable=0    failed=0   

$ id johnd   
id: johnd: no such user      # johnd ユーザーが削除された
$ sudo ls -al /home/johnd/   
ls: cannot access /home/johnd/: No such file or directory  # johnd のホームディレクトリも削除された

無事に指定した通りに、ユーザー johnd とホームディレクトリも削除されました。


■ まとめ

公式ドキュメントの使用例をベースにして、user モジュール の使い方を説明しました。

他に「こんなことできるかな?」と気になる事がありましたら、公式ドキュメントで詳細をご確認ください。

docs.ansible.com

また、user モジュールは System modules に分類されています。System modules には、他にも、グループを管理する group や、cron エントリを管理する cron 、などのモジュールがあります。詳細は System modules の一覧からご確認ください。