【連載01】203.Ansibleでユーザーとグループを追加する（On Vagrant）

<b><font color="#ff6633">当記事はケーススタディの連載となっています。目次は[【こちら】](http://qiita.com/CsFactoryitter/items/6b8308b96afafd61ce5f
)です。</font></b>
<b><font color="#ff6633">最新のソースコードは[【GitHub】](https://github.com/csfactorygihubblog001/blogansible)で公開中です。</font></b>

サーバの責務は<b>[こちら](http://qiita.com/CsFactoryitter/items/032cc339048e52ee3586)</b>で確認ください。

今回は、ユーザーとグループを作成する。Ansibleでユーザー(user)追加モジュールとグループ(group)追加モジュールを使う。
※userのpasswordはハッシュ化する。

##1.ユーザー作成概要
一番最初に全てのサーバに対して必要なユーザーとグループを作成する。

![image](https://qiita-image-store.s3.amazonaws.com/0/98085/9a09930f-c80d-3284-9f5f-61aa2d183175.png)

##2.playbookファイルの相関

![image](https://qiita-image-store.s3.amazonaws.com/0/98085/553e130b-0a93-5488-ddac-40ea86a2cfc8.png)

##3.playbook(site.yml)
${ANSIBLE_HOME}/site.yml
[メインとなるplaybook(site.yml)](http://qiita.com/CsFactoryitter/items/3112c6d504d3b5a58011#3%E3%83%A1%E3%82%A4%E3%83%B3%E3%81%A8%E3%81%AA%E3%82%8Bplaybooksiteyml)参照

##4.ユーザー作成用のplaybook全体
\${ANSIBLE_HOME}/operations/0011_usergroup.yml

```yaml:0011_usergroup.yml
# ===================
# ユーザーの追加(usergroup.yml)
# ===================
 
# ===================
# 全サーバ共通のユーザーを作成
# Ansibleは全てuserで行うが、運用時にはinfraユーザー
# を利用しサーバ運用を行う。
# ===================
- hosts: all
  sudo: no
  remote_user: root
  vars_files:
    - ../vars/usergroup.yml
  tasks:
    - name: infraグループ追加
      group: name={{usergroup.infra.group }} gid={{usergroup.infra.gid}}
    - name: infraユーザー追加
      user: name={{usergroup.infra.user}} uid={{usergroup.infra.uid}} group={{usergroup.infra.group}} update_password=always password={{usergroup.infra.password}}
 
# ===================
# ap_admin(apserv01とadminserv01)に適用
#  ・apacheグループ/ユーザーの用途
#     ・adminserv01
#         ・CI(Jenkins)用HTTPサーバ
#         ・adminserv01はapserv01にデプロイする前にテスト用途としても使用する
#     ・apserv01
#         ・Webアプリケーション用HTTPサーバ
#  ・tomcatグループ/ユーザーの用途
#     ・adminserv01
#         ・CI(Jenkins)用JavaApplicationサーバ
#         ・adminserv01はAPサーバにデプロイする前にテスト用途としても使用する
#     ・apserv01
#         ・Webアプリケーション用JavaApplicationサーバ
# ===================
- hosts: ap_admin
  sudo: no
  remote_user: root
  vars_files:
    - ../vars/usergroup.yml
  tasks:
    - name: apacheグループ追加
      group: name={{usergroup.apache.group }} gid={{usergroup.apache.gid}}
 
    - name: tomcatグループ追加
      group: name={{usergroup.tomcat.group }} gid={{usergroup.tomcat.gid}}
 
    - name: apacheユーザー追加
      user: 
　　  name={{usergroup.apache.user}}
        uid={{usergroup.apache.uid}}
        group={{usergroup.apache.group}}
        update_password=always 
        password={{usergroup.apache.password}}
 
    - name: tomcatユーザー追加
      user: name={{usergroup.tomcat.user}} uid={{usergroup.tomcat.uid}} group={{usergroup.tomcat.group}}  update_password=always password={{usergroup.tomcat.password}}
 
# ===================
# db_admin(dbserv01とadminserv01)に適用
#  ・mysqlグループ/ユーザーの用途
#     ・adminserv01
#         ・adminserv01はdbサーバへの本番以降前にテスト用途としても使用する
#     ・dbserv01
#         ・本番データベースサーバ
# ===================
- hosts: db_admin
  sudo: no
  remote_user: root
  vars_files:
    - ../vars/usergroup.yml
  tasks:
    - name: mysqlグループ追加
      group: name={{usergroup.mysql.group }} gid={{usergroup.mysql.gid}}
    - name: mysqlユーザー追加
      user: name={{usergroup.mysql.user}} uid={{usergroup.mysql.uid}} group={{usergroup.mysql.group}}  update_password=always password={{usergroup.mysql.password}}
 
# ===================
# adminserv01に適用
#  ・seleniumグループ/ユーザーの用途
#     ・adminserv01
#         ・WEBGUIテスティングの起動/制御を行うSelniumGridを動作させる
# ===================
- hosts: adminservers
  sudo: no
  remote_user: root
  vars_files:
    - ../vars/usergroup.yml
  tasks:
    - name: seleniumグループ追加
      group: name={{usergroup.selenium.group }} gid={{usergroup.selenium.gid}}
    - name: seleniumユーザー追加
      user: name={{usergroup.selenium.user}} uid={{usergroup.selenium.uid}} group={{usergroup.selenium.group}}  update_password=always password={{usergroup.selenium.password}}
``` 

<dl>
<dt><font color="#0066ff">Ansibleでのグループ(group)追加モジュール</font></dt>
<br>
<dd>Ansibleでグループを追加するにはgroupモジュールを使う。</dd>
</dl>
書式:
>group: name=\${グループ名称} gid=${GID}

例:

```yaml:
group: name={{usergroup.apache.group }} gid={{usergroup.apache.gid}} 
```

<dl>
<dt><font color="#0066ff">Ansibleでのユーザー(user)追加モジュール</font></dt>
<br>
<dd>Ansibleでユーザーを追加するにはuserモジュールを使う。ユーザー作成時はグループ名称を指定してGIDは指定しない。</dd>
</dl>
書式:
>user: name=\${ユーザー名} uid=\${UID} group={グループ名称} update_password=${パスワードの更新(always または on_create)}

例:

```yaml:
user: name={{usergroup.selenium.user}} uid={{usergroup.selenium.uid}} group={{usergroup.selenium.group}}  update_password=always
```

<dl>
<dt><font color="#0066ff">var_filesの構造</font></dt>
<br>
<dd>
var_filesもyamlの法則に従い階層構造で記述。以下のような設定から、uid:1200の値をplaybookから取得したい場合は
</dd>
</dl>

>
usergroup:
&nbsp;&nbsp;tomcat:
&nbsp;&nbsp;&nbsp;&nbsp;user: tomcat
&nbsp;&nbsp;&nbsp;&nbsp;group: tomcat
&nbsp;&nbsp;&nbsp;&nbsp;<b><font color="#ff0000">uid: 1200</font></b>
&nbsp;&nbsp;&nbsp;&nbsp;gid: 1200
&nbsp;&nbsp;&nbsp;&nbsp;home: /home/tomcat
&nbsp;&nbsp;&nbsp;&nbsp;shell: /bin/bash


<font color="#ff6600">usergroup</font>配下<font color="#ff6600">tomcat</font>の配下の<font color="#ff0000"><b>uid</b></font>を取得する為、
usergroup.tomcat.uidと【.(ピリオド)】で定義を繋ぎ、左右を<font color="#ff0000"><b>{{ }}</b></font>で括り、

<b><font color="#FF0000">{{usergroup.tomcat.uid}}</font></b>

※以前のAnsibleでは${ }で取得可能だったが現在のAnsibleでは取得できない為注意。

##5.playbook(/vars/usergroup.yml)
\${ANSIBLE_HOME}/vars/usergroup.yml

※userモジュールのpassword(パスワード)はハッシュ化が必要。
 
0011_usergroup.ymlでは変数設定をしている。
userモジュールのパスワードはハッシュ化する必要があることに注意。

ハッシュ化するには今回はmanageterm(Ansible管理端末）から以下を実行。

書式：
>python -c 'import crypt; print crypt.crypt("パスワード", "\$6\$ソルト$")'

例：

```py:
python -c 'import crypt; print crypt.crypt("apache123", "$6$apachesolt$")'
```

以上の設定で「apache123」というハッシュ化されたパスワードがサーバ設定されることになる。

```yaml:
# ===================
#ユーザー情報を変数定義します。
#パスワードはハッシュ化する必要がある為、pythonのコマンドにてハッシュ化したパスワードを設定
# python -c 'import crypt; print crypt.crypt("パスワード", "$6$ソルト$")'
# ===================
  usergroup:
    tomcat:
      user: tomcat
      group: tomcat
      uid: 1200
      gid: 1200
      home: /home/tomcat
      shell: /bin/bash
      # ===================
      # python -c 'import crypt; print crypt.crypt("tomcat123", "$6$tomcatsolt$")'
      # ===================
      password: $6$tomcatsolt$Dz8QThSePXH5WZ0EjLQbUA8pZJrgIl4.2qsflSWkn1gV.RqD84vPT0.tdThOEn1VyowWJBsTgm2rmv5oJixDJ1
    apache:
      user: apache
      group: apache
      uid: 1100
      gid: 1100
      home: /home/apache
      shell: /bin/bash
      # ===================
      # python -c 'import crypt; print crypt.crypt("tomcat123", "$6$tomcatsolt$")'
      # ===================
      password: $6$apachesolt$PnTyYlBO7ZAmPmXNBxAgWj03udlCNxqOqWvfik.fM3A84UTG.Un0cWUaXEl2vT2Acme.lMsPVRapEOZ9MhWYr0
    mysql:
      user: mysql
      group: mysql
      uid: 1300
      gid: 1300
      home: /home/mysql
      shell: /bin/bash
      # ===================
      # python -c 'import crypt; print crypt.crypt("tomcat123", "$6$tomcatsolt$")'
      # ===================
      password: $6$mysqlsolt$IeAbOR9NxGYA3Os9p43DRjdGvuTae62i707gWa2/XP/IFVyjHIYsEe/gH5uc15pxwyhAk8kGuRbi6Iinga5wh/
    infra:
      user: infra
      group: infra
      uid: 1400
      gid: 1400
      home: /home/infra
      shell: /bin/bash
      # ===================
      # python -c 'import crypt; print crypt.crypt("tomcat123", "$6$tomcatsolt$")'
      # ===================
      password: $6$infrasolt$a2vFx7QL/cV2Nplcy1AxeRp8Ss34MPTjkbKpu7au.kq.PXshj8K177TUH9Pj5wtG8Y83Ea5Nv8UlvRuBMN5Fu0
    selenium:
      user: selenium
      group: selenium
      uid: 1600
      gid: 1600
      home: /home/selenium
      shell: /bin/bash
      # ===================
      # python -c 'import crypt; print crypt.crypt("tomcat123", "$6$tomcatsolt$")'
      # ===================
      password: $6$seleniumsolt$fl7ibc.Xf/.xnbIFqIXuGA3rtddYdZiUILqVvJO06cjGXy.HmpDh1LjXZYLKqzZymjn1GqmQkz2ndc8lfbfTz/
```

次回は「[yumにて必要なライブラリ／ミドル／ソフトウェアをインストールする【Ansible yumモジュール】](http://qiita.com/CsFactoryitter/items/1b7e6138197e2c58b719)」について。

<b><font color="#ff6633">連載の目次は[【こちら】](http://qiita.com/CsFactoryitter/items/6b8308b96afafd61ce5f
)です。</font></b>