【連載01】208.必要なディレクトリを作成しオーナーとパーミッションを設定する

<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.ディレクトリ＆パーミッション設定概要
今回のサーバ構築は必要な設定ファイル、SSL証明書、yumでインストールしないミドルウェア等をAnsible管理端末(manageterm)から一旦「adminserv01」に送信し、「apserv01」、「dbserv01」は「adminserv01」にインストールするNFS経由で取得する構成とする。

- 「adminserv01」は主にNFSのディレクトリ構造やJenkins等のミドルウェアの配置場所である。
- 「apserv01」、「dbserv01」にはミドルウェアのディレクトリ構造を作成しておく。合わせてミドルウェアのルートディレクトリのパーミッションも設定しておく。

![image](https://qiita-image-store.s3.amazonaws.com/0/98085/e85e3de4-976e-d062-887e-0645e2ae74d7.png)

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

![image](https://qiita-image-store.s3.amazonaws.com/0/98085/68ce8cfb-16b3-344a-86eb-2520af22bd83.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(/operations/0061_filedir.yml)

${ANSIBLE_HOME}/operations/0061_filedir.yml

各サーバのディレクトリ／パーミッション設定のplaybookは以下の通り。playbook中の【】で囲んだコメントの補足に関しては「[6.補足説明](#6%E8%A3%9C%E8%B6%B3%E8%AA%AC%E6%98%8E)」を参照。

```yaml:
# ===================
# ファイル＆ディレクトリ(filedir.yml)
# ===================

# ===================
# apserv01/adminserv01/dbserv01にインストールするミドルウェアの
# 配置場所や設定ファイル置き場の作成とオーナーとパーミッション設定
# ===================
- hosts: all
  sudo: no
  remote_user: root
  vars_files:

# ===================
# サーバの各種Pathの具体値は後ほど変更があるかもしれないので
# 外部変数化しておく
# ===================
    - ../vars/filedir.yml
  tasks:

# ===================
# 全てのサーバに
# /var/opt/dataディレクトリをrootユーザー755で作成する。
# 当該フォルダ配下にデータ関係を配置する。
# ===================
    - file:
        group={{path.dir.data_root.group}}  #【4.A:ディレクトリを作成する】
        mode={{path.dir.data_root.permision}}
        owner={{path.dir.data_root.user}}
        path={{path.dir.data_root.path}}
        state={{path.dir.data_root.state}}

# ===================
# 全てのサーバに
# /var/opt/data/nfsディレクトリをrootユーザー755で作成する。
# 当該フォルダにはインストーラや設定ファイルなどをコピーする。
# 後ほどNFSサーバを導入し当該ディレクトにファイルをコピーした後
# 資源配布を行うようにする
# ===================
    - file:
        group={{path.dir.nfs_root.group}}
        mode={{path.dir.nfs_root.permision}}
        owner={{path.dir.nfs_root.user}}
        path={{path.dir.nfs_root.path}}
        state={{path.dir.nfs_root.state}}
 
- hosts: ap_admin
  sudo: no
  remote_user: root
  vars_files:
    - ../vars/filedir.yml
  tasks:

# ===================
# adminserv01とapserv01にはTOMCATをインストールするので
# TOMCAT関係のディレクトリをtomcatユーザー755で作成する。
# /opt/tomcat
# /var/opt/data/tomcat/webapps
# /var/opt/data/tomcat/work
# ===================
    - file:
        group={{path.dir.tomcat_home.group}}
        mode={{path.dir.tomcat_home.permision}}
        owner={{path.dir.tomcat_home.user}}
        path={{path.dir.tomcat_home.path}}
        state={{path.dir.tomcat_home.state}}
    - file:
        group={{path.dir.tomcat_data_webapps.group}}
        mode={{path.dir.tomcat_data_webapps.permision}}
        owner={{path.dir.tomcat_data_webapps.user}}
        path={{path.dir.tomcat_data_webapps.path}}
        state={{path.dir.tomcat_data_webapps.state}}
    - file:
        group={{path.dir.tomcat_data_work.group}}
        mode={{path.dir.tomcat_data_work.permision}}
        owner={{path.dir.tomcat_data_work.user}}
        path={{path.dir.tomcat_data_work.path}}
        state={{path.dir.tomcat_data_work.state}}
 
- hosts: db_admin
  sudo: no
  remote_user: root
  vars_files:
    - ../vars/filedir.yml
  tasks:

# ===================
# adminserv01とdbserv01にはMariadb(mysql)をインストールするので
# MariaDB関係のディレクトリをmysqlユーザー755で作成する。
# /var/opt/data/mysql
# ===================
    - file:
        group={{path.dir.mysql_data_home.group}}
        mode={{path.dir.mysql_data_home.permision}}
        owner={{path.dir.mysql_data_home.user}}
        path={{path.dir.mysql_data_home.path}}
        state={{path.dir.mysql_data_home.state}}
 
- hosts: adminserv01
  sudo: no
  remote_user: root
  vars_files:
    - ../vars/filedir.yml
  tasks:
    - debug: msg="NFSディレクトリ作成します。"

# ===================
# adminserv01にNFSを後ほどインストールする。
#
# (1)apserv01とdbserv01はNFSクライアントになって
# adminserv01にNFS接続し以下のディレクトリから
# 資源を取得し各種インストールをすることにする。
# ・/var/opt/data/nfs/installer(インストーラやzip置き場)
# ・/var/opt/data/nfs/work(一次ディレクトリ)
# ・/var/opt/data/nfs/settings(設定ファイル置き場)
#
#  (2)JenkinsとSeleniumはadminserv01にインストーする為
#  以下のディレクトリを作っておく
# ・/var/opt/data/jenkins
# ・/var/opt/data/selenium
# ===================
    - file:
        group={{path.dir.nfs_installer.group}}
        mode={{path.dir.nfs_installer.permision}}
        owner={{path.dir.nfs_installer.user}}
        path={{path.dir.nfs_installer.path}}
        state={{path.dir.nfs_installer.state}}
    - file:
        group={{path.dir.nfs_work.group}}
        mode={{path.dir.nfs_work.permision}}
        owner={{path.dir.nfs_work.user}}
        path={{path.dir.nfs_work.path}}
        state={{path.dir.nfs_work.state}}
    - file:
        group={{path.dir.nfs_settings.group}}
        mode={{path.dir.nfs_settings.permision}}
        owner={{path.dir.nfs_settings.user}}
        path={{path.dir.nfs_settings.path}}
        state={{path.dir.nfs_settings.state}}
    - file:
        group={{path.dir.jenkins_root.group}}
        mode={{path.dir.jenkins_root.permision}}
        owner={{path.dir.jenkins_root.user}}
        path={{path.dir.jenkins_root.path}}
        state={{path.dir.jenkins_root.state}}
 
    - debug: msg="Seleniumディレクトリ作成します。"
    - file:
        group={{path.dir.selenium_home.group}}
        mode={{path.dir.selenium_home.permision}}
        owner={{path.dir.selenium_home.user}}
        path={{path.dir.selenium_home.path}}
        state={{path.dir.selenium_home.state}}
    - file:
        group={{path.dir.selenium_log.group}}
        mode={{path.dir.selenium_log.permision}}
        owner={{path.dir.selenium_log.user}}
        path={{path.dir.selenium_log.path}}
        state={{path.dir.selenium_log.state}}
 
- hosts: apservers
  sudo: no
  remote_user: root
  vars_files:
    - ../vars/filedir.yml
  tasks:
    - file:

# ===================
# apserv01は外部公開WEBサーバの為HTTPS利用を前提とする。
# 証明書関係を配置する以下のディレクトリを作成する
# /etc/ssl/apserv_cets
# ===================
        group={{path.dir.ssl_root.group}}
        mode={{path.dir.ssl_root.permision}}
        owner={{path.dir.ssl_root.user}}
        path={{path.dir.ssl_root.path}}
        state={{path.dir.ssl_root.state}}
```

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

${ANSIBLE_HOME}/vars/filedir.yml
【】で囲んだコメントの補足に関しては「[6.補足説明](#6%E8%A3%9C%E8%B6%B3%E8%AA%AC%E6%98%8E)」を参照。

```yaml:
  path:
    dir:
      data_root:
        path: /var/opt/data  #【5.A:外部変数設定にしておく】
        user: infra
        group: infra
        state: directory
        permision: 755
      tomcat_home:
        path: /opt/tomcat
        user: tomcat
        group: tomcat
        state: directory
        permision: 755
      selenium_home:
        path: /opt/selenium
        user: selenium
        group: selenium
        state: directory
        permision: 755
      selenium_log:
        path: /var/log/selenium
        user: selenium
        group: selenium
        state: directory
        permision: 755
 
      mysql_data_home:
        path: /var/opt/data/mysql
        user: mysql
        group: mysql
        state: directory
        permision: 755
      tomcat_data_webapps:
        path: /var/opt/data/tomcat/webapps
        user: tomcat
        group: tomcat
        state: directory
        permision: 755
      tomcat_data_work:
        path: /var/opt/data/tomcat/work
        user: tomcat
        group: tomcat
        state: directory
        permision: 755
      nfs_root:
        path: /var/opt/data/nfs
        user: infra
        group: infra
        state: directory
        permision: 777
      nfs_installer:
        path: /var/opt/data/nfs/installer
        user: infra
        group: infra
        state: directory
        permision: 777
      nfs_work:
        path: /var/opt/data/nfs/work
        user: infra
        group: infra
        state: directory
        permision: 777
      nfs_settings:
        path: /var/opt/data/nfs/settings
        user: infra
        group: infra
        state: directory
        permision: 777
      jenkins_root:
        path: /var/opt/data/jenkins
        user: tomcat
        group: tomcat
        state: directory
        permision: 777
      ssl_root:
        path: /etc/ssl/apserv_cets
        user: root
        group: root
        state: directory
        permision: 777
  file:
      tomcat:
        install_check_file: /opt/tomcat/bin/startup.sh
        installer: /var/opt/data/nfs/installer/tomcat7.tar.gz
        unzip_ch_path: /tmp/.
        unzip_after_file: /tmp/apache-tomcat-7.0.65
      nmon:
        install_check_file: /bin/nmon
        installer: /var/opt/data/nfs/installer/centos7.tar.gz
        unzip_ch_path: /bin
        unzip_after_file: /bin/nmon_x86_64_centos7
      java:
        install_check_cmd: which java
        installer: /var/opt/data/nfs/installer/jdk-7u79-linux-x64.rpm
```

##6.補足説明
[4.ディレクトリ＆パーミッション設定のplaybook(/operations/0061_filedir.yml)](#4%E3%83%87%E3%82%A3%E3%83%AC%E3%82%AF%E3%83%88%E3%83%AA%E3%83%91%E3%83%BC%E3%83%9F%E3%83%83%E3%82%B7%E3%83%A7%E3%83%B3%E8%A8%AD%E5%AE%9A%E3%81%AEplaybookoperations0061_filediryml)内のコメント（#【4.A:ディレクトリを作成する】）及び[5.変数設定playbook(/vars/filedir.yml)](#5%E5%A4%89%E6%95%B0%E8%A8%AD%E5%AE%9Aplaybookvarsfilediryml)内のコメント（#【5.A:外部変数設定にしておく】）について。

ファイル/ディレクトリのパーミッションを設定する。

>
    - file:
        group={{path.dir.data_root.group}}　#【4.A:ディレクトリを作成する】
        mode={{path.dir.data_root.permision}}
        owner={{path.dir.data_root.user}}
        path={{path.dir.data_root.path}}
        state={{path.dir.data_root.state}}

ここではfiledir.ymlを参照して「5.A」の変数値を設定する。
{{path.dir.data_root.group}}の部分はfiledir.ymlの以下の部分に該当する。

>
 path:
    dir:
      data_root:
・
・
        group: <font color="#ff0000">infra</font>

<b>fileモジュール</b>は<b>file</b>とあるが、実際はファイルだけでなくディレクトリやシンボリックリンクファイルの設定が可能。

|名前|説明|補足|
|:---|:---|:---|
|group|オーナーグループを設定|chgrp、chownに該当|
|mode|パーミッションを設定|chmodに該当|
|owner|オーナーを設定|chmodに該当|
|path|設定対象のパスを記述。<br>・ディレクトリ<br>・ファイル||
|state|pathに指定した対象の属性を指定。<br>・file<br>・link<br>・directory<br>・hard<br>・touch<br>・absent|absentは削除する|

##7.補足の補足

実際はファイルの作成を一ヵ所でやるのではなく(今回のようなファイル作成playbookを作るのではなく）、TOMCATをインストールするplaybook等で作成する方が凝縮度が高まりplaybook単体での試験がしやすいというメリットがある。
プログラムも同様だが、何かの前提がないと動作しないものは外部依存度が高まり、修正や単体での再実行がしにくくなる。

一方でディレクトリを作る場合、「このplaybookを直せば良い」と管理がしやすいというメリットがある。
どんなことにも言えるが、<b>分散管理</b>と<b>集中管理</b>にはそれぞれにメリット・デメリットがあるので、適宜設計して実行する方がよいと思う。（Ansibleもプログラムを設計する力同様のスキルが必要かと思われる。）

次回は「[209.ローカル(manageterm)にあるファイルをリモート(adminserv01)にコピーする](http://qiita.com/CsFactoryitter/items/1ecf579bcb4f4c6e987e)」について。

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