【連載01】211.NFSをインストールし管理サーバ(adminserv01)とAPサーバ(apserv01)・DBサーバ(dbserv01)から接続する

<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>で確認ください。

##1.NFS設定概要
NFSサーバとクライアントをインストールする。
 
今回は必要な資材(yumではインストールしないtomcat、jenkis、selenium等)を一旦「adminserv01」にコピーし、「dbserv01」や「apserv01」は「adminserv01」をマウントすることによりファイルを取得する形式にする。

![image](https://qiita-image-store.s3.amazonaws.com/0/98085/bbd50057-2f1f-f419-f57a-700afbb19bc9.png)

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

![image](https://qiita-image-store.s3.amazonaws.com/0/98085/0f79de28-cd10-da22-5b44-0c77983dd116.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.NFSサーバ設定のplaybook(/operations/0081_nfs.yml)

${ANSIBLE_HOME}/operations/0081_nfs.yml

playbook中のコメントの補足に関しては「[6.補足説明](#6%E8%A3%9C%E8%B6%B3%E8%AA%AC%E6%98%8E)」を参照。

```yaml:
# ===================
# NFSサーバとNFSクライアント設定(nfs.yml)
# ===================
- hosts: adminserv01
  sudo: no
  remote_user: root
  vars_files:
    - ../vars/enviroment.yml
  tasks:

# ===================
# NFS用設定ファイルを指定場所(/etc/exports)に配置する
# exportsの#EXP_NETWORK文字列を置換する(環境依存部分)
# ===================
    - name: NFS設定ファイルはexportsを指定場所に配置(ファイルは常に再配置)
      shell: cp /var/opt/data/nfs/nfs/settings/exports /etc/exports  #【4.A:NFSサーバへの許可をするネットワークを設定を記述したexportsファイルの配置】

    - name: "許可するネットワークセグメントを置換する(#EXP_NETWORKを指定値に置換する)"
      replace: dest=/etc/exports regexp="#EXP_NETWORK" replace="{{nfs.exportnetwork}}"  #【4.B:ネットワークは環境依存する為(本番と開発では違う)外部変数化した文字列で置換】
    - name: "rcpbindとnfs-serverをRestartする"
      service: name=rpcbind state=restarted enabled=yes  #【4.C:NFSサーバとrcpbindサービスを起動】
    - service: name=nfs-server state=restarted enabled=yes
- hosts: ap_db
  sudo: no
  remote_user: root
  tasks:
    # ========================================================
    # マウント先が削除されて参照ができなくなってるいる状態
    # ========================================================
    - shell: ls /var/opt/data/nfs
      register: mounted_err
      ignore_errors: true
    # ========================================================
    # すべてのサーバに
    # /var/opt/data/nfsディレクトリをrootユーザー755で作成する。
    # 当該フォルダにはインストーラや設定ファイルなどをコピーする。
    # 後ほどNFSサーバを導入し当該ディレクトにファイルをコピーしたのち
    # 資源配布を行うようにする
    # ========================================================
    - shell: umount /var/opt/data/nfs
      when: mounted_err.rc == 2
# ===================
# apserv01へ/etc/fstabにadminserv01へのマウント指定
# ===================
- hosts: apserv01
  sudo: no
  remote_user: root
  tasks:
    - name: "(apserv01)rcpbindを使用可能にし、/etc/fstabにadminserv01へのマウント設定"
      service: name=rpcbind state=started enabled=yes
    - mount: name=/var/opt/data/nfs src=adminserv01:/var/opt/data/nfs  fstype=nfs state=mounted  #【4.D:常時接続状態でかつMount状態(/etc/fstabに記述)】

# ===================
# apserv01へ/etc/fstabにadminserv01へのマウント指定
# ===================
- hosts: dbserv01
  sudo: no
  remote_user: root
  tasks:
    - name: "(apserv01)rcpbindを使用可能にし、/etc/fstabにadminserv01へのマウント設定"
      service: name=rpcbind state=started enabled=yes
    - mount: name=/var/opt/data/nfs src=adminserv01:/var/opt/data/nfs  fstype=nfs  state=mounted
```

##5.変数設定playbook(/vars/enviroment.yml)

>nfs:
  exportnetwork: 192.168.134.0

##6.補足説明
[4.NFSサーバ設定のplaybook(/operations/0081_nfs.yml)](#4nfs%E3%82%B5%E3%83%BC%E3%83%90%E8%A8%AD%E5%AE%9A%E3%81%AEplaybookoperations0081_nfsyml)内のコメント4.A～4.Dについて。

- 4.A:NFSサーバへの許可をするネットワーク設定を記述したexportsファイルの配置

>shell: cp /var/opt/data/nfs/nfs/settings/exports /etc/exports

NFSサーバに接続許可するネットワークを記述する。

- 4.B:ネットワークは環境依存する為(本番と開発では違う)外部変数化した文字列で置換

exportsファイルの内容:

>
/var/opt/data/nfs <font color="#ff0000"><b>#EXP_NETWORK</b></font>/255.255.255.0(rw,no_root_squash)

となっている。
<font color="#ff0000"><b>#EXP_NETWORK</b></font>の部分を置換する為にreplaceモジュールを使用して指定した文字に一致した部分を置換する。

>
replace: dest=/etc/exports regexp="#EXP_NETWORK" replace="{{nfs.exportnetwork}}"

<dl>
<dt><font color="#0066ff">replaceモジュール</font></dt>
</dl>

|名前|説明|補足|
|:------|:------|:------|
|dest|対象のファイルを指定||
|regexp|正規表現で対象ファイルより置換対象文字列を探す||
|replace|置換する文字列を記述||

{{}}で括られた位置は[5.変数設定](#5%E5%A4%89%E6%95%B0%E8%A8%AD%E5%AE%9Aplaybookvarsenviromentyml)で設定した値が設定される。

- 4.C:NFSサーバとrcpbindサービスを起動
NFSサーバとrcpbindサービスを起動し、NFSサーバとして起動する。

>
  service: name=rpcbind state=restarted enabled=yes
　service: name=nfs-server state=restarted enabled=yes

<dl>
<dt><font color="#0066ff">serviceモジュール</font></dt>
</dl>
デーモンを起動する
CentOS7でのservicectl、CentOS6でのinit.d。

|名前|説明|補足|
|:------|:------|:------|
|enabled|true(自動起動する状態)<br>false(自動起動しない状態)|例：<br>systemctl enable nfs-server<br>/etc/init.d/nfs-server<br>と同様|
|state|started(起動状態)<br>restart(再起動)<br>restarted(再起動)<br>reloaded(再読み込み)|例：<br>systemctl start nfs-server<br>/etc/init.d/nfs-server start<br>と同様|

##7.補足の補足（注意）
NFSを常時接続したい場合、OS起動時に/etc/fstabを参照し、NFSサーバにマウントしにいくことになる。
今回の場合、「adminserv01」がNFSサーバとなり、「apserv01」(APサーバ)と「dbserv01」(DBサーバ)はクライアントとして起動時に接続を試みる。
今回の環境はVagrantを使用していますが、起動順は「apserv01」、「dbserv01」、「adminserv01」となっている為、「apserv01」と「dbserv01」の起動は「adminserv01」を探し、あきらめるまで約1分半程度かかる。
NFSを導入する場合は起動順を意識してVagrantfileはNFSサーバが先に起動する設定にしておく方がいいかと思われる。
<br>
次回は「[211.環境変数を設定する](http://qiita.com/CsFactoryitter/items/f30d0a77d32a572b37af)」について。

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