【連載01】215.Ansibleを使ってjava/Tomcatのインストール・配置する

<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.JDKインストール/設定概要
JDKとTOMCATをインストールします。
	JDKとTOMCAT(最新は)yumリポジトリには無い為
	事前にダウンロードしてmanageterm端末よりcopyモジュールを使用し
	adminserv01サーバに送信しNFS経由でJDK/TOMCATを取得した後
	インストールする形式をとります。
		manageterm端末からファイル送信は
		http://qiita.com/CsFactoryitter/items/1ecf579bcb4f4c6e987e
		NFSに関しては
		http://qiita.com/CsFactoryitter/items/f951549c9beb962badcb
		を参照してください。
	
※oracleJDKは
	wget --no-check-certificate --no-cookies --header "Cookie: oraclelicense=accept-securebackup-cookie" http://download.oracle.com/otn-pub/java/jdk/8u65-b17/jdk-8u65-linux-x64.rpm
	を使用すれば取得可能なのでget_urlモジュールを使用すればダウンロード/インストールが可能ですが
	今回はURL変更やCookieの変更に影響を受けてansible実行が失敗しないようにしています。


![image](https://qiita-image-store.s3.amazonaws.com/0/98085/4f91c635-f175-cafd-9aa5-93dcd494cd26.png)

##2.playbookファイルの相関
![image](https://qiita-image-store.s3.amazonaws.com/0/98085/5ca0ba47-900f-b389-bff7-d327601ffee0.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.JDK・TOMCATインストール/設定のplaybook(/operations/1021_javatomcat.yml)

${ANSIBLE_HOME}/operations/1021_javatomcat.yml

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

```yaml:
# ========================================================
# JavaとTomcatをインストール設定(javatomcat.yml)
# ========================================================
---
- hosts: ap_admin
  sudo: no
  vars_files:
    - ../vars/filedir.yml
  remote_user: root
  tasks:
    # ========================================================
    # Javaのインストール確認
    # ========================================================
    - name: javaの存在確認
      shell: which java
      register: java_which
      failed_when: java_which.rc not in [0, 1]

    # ========================================================
    # javaがインストールされていない場合Javaをインストール
    # ========================================================
    - name: Java インストール
      yum: name=/var/opt/data/nfs/java/installer/jdk-7u79-linux-x64.rpm state=present
      when: java_which.rc == 1


    # ========================================================
    # tagにreinstallを指定した場合はTomcatを再インストールする
    # ========================================================
    - name: 実行時に指定するtagsが"reinstall"の場合再実行する為一度削除する
      shell: rm -f /opt/tomcat/bin/startup.sh
      when: target == 'reinstall'

   # ========================================================
    # /opt/tomcat/bin/startup.shファイルが
    # 存在する場合はインストール終了とする(冪等性は当該ファイルで担保)
    # ========================================================
    - name: tomcatの存在確認(以下すべて存在してない場合のみ実行)
      stat: path=/opt/tomcat/bin/startup.sh
      register: tomcatexists

    # ========================================================
    # tar.gz圧縮されたtomatを/tmpに展開する
    # ========================================================
    - name: 未インストールの場合：圧縮ファイルを展開する
      command: tar zxvf /var/opt/data/nfs/tomcat/installer/apache-tomcat-7.0.65.tar.gz -C /tmp/.
      when: not tomcatexists.stat.exists

    # ========================================================
    # /tmp配下にあるtomat7を/opt配下にコピーする
    # ========================================================
    - name: 未インストールの場合：展開したファイルを/opt/tomcat配下にコピーする
      command: "cp -r /tmp/apache-tomcat-7.0.65/. /opt/tomcat/."
      when: not tomcatexists.stat.exists

    # ========================================================
    # tomcatの環境変数を設定するsetenvファイルを/opt/tomcat/binにコピー
    # ========================================================
    - name: 未インストールの場合：envのファイルをコピー
      command: "cp -r /var/opt/data/nfs/tomcat/settings/setenv.sh /opt/tomcat/bin/setenv.sh"
      when: not tomcatexists.stat.exists

    # ========================================================
    # systemdの環境変数を設定するtomcatenviromentファイルをコピーする
    # ========================================================
    - name: 未インストールの場合：systemdのenviromentファイル
      command: "cp  /var/opt/data/nfs/tomcat/settings/tomcatenviroment /etc/sysconfig/tomcatenviroment"
      when: not tomcatexists.stat.exists


    # ========================================================
    # 不要になった/tmpファイルを削除する
    # ========================================================
    - name: 未インストールの場合：展開したフォルダを削除する
      command: rm -rf /tmp/apache-tomcat-7.0.65
      when: not tomcatexists.stat.exists

    # ========================================================
    # /opt/tomcatのパーミッションを再設定TOMCATユーザー 755を設定
    # ========================================================
    - name: 未インストールの場合：パーミッションとユーザーの変更
      file:
          recurse=yes
          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}}
      when: not tomcatexists.stat.exists

    # ========================================================
    # 事前に用意したtomcat自動起動設定ファイルを配置する
    # ========================================================
    - name: 未インストールの場合：SYSTEMDのユニットファイルsystemDIRにコピーする
      command: "cp /var/opt/data/nfs/tomcat/settings/tomcat_systemd.template /usr/lib/systemd/system/tomcat.service"
      when: not tomcatexists.stat.exists

    # ========================================================
    # 事前に用意したserver.xmlを配置する
    # ========================================================
    - name: server.xmlのコピー
      command: "cp /var/opt/data/nfs/tomcat/settings/server.xml /opt/tomcat/conf/server.xml"
      when: not tomcatexists.stat.exists


#==================================================================
#adminserv01のserver.xmlの変数を置換する
#==================================================================
- hosts: adminserv01
  sudo: no
  vars_files:
    - ../vars/filedir.yml
    - ../vars/enviroment.yml
  remote_user: root
  tasks:
      #==================================================================
      #adminserv01のserver.xmlの変数を置換する
      #==================================================================
    - name: server.xmlのIPアドレス部分を修正
      replace: dest="/opt/tomcat/conf/server.xml" regexp="<<SERVER_GLOBAL_IP>>" replace="{{tomcat.bindip_admin}}"
      when: not tomcatexists.stat.exists
#==================================================================
#apserv01用にサーバXMLを編集
#==================================================================
- hosts: apserv01
  sudo: no
  vars_files:
    - ../vars/filedir.yml
    - ../vars/enviroment.yml
  remote_user: root
  tasks:
      #==================================================================
      #apserv01のserver.xmlの変数を置換する
      #==================================================================
    - name: server.xmlのIPアドレス部分を修正
      replace: dest="/opt/tomcat/conf/server.xml" regexp="<<SERVER_GLOBAL_IP>>" replace="{{tomcat.bindip_ap}}"
      when: not tomcatexists.stat.exists



#==================================================================
#apserv01,adminserv01のTOMCATをリロード
#==================================================================
- hosts: ap_admin
  sudo: no
  vars_files:
    - ../vars/filedir.yml
  remote_user: root
  tasks:
      #==================================================================
      # 事前に用意したtomcatのユーザーファイルを配置する
      #==================================================================
    - name: tomcat-users.xmlのコピー
      command: "cp /var/opt/data/nfs/tomcat/settings/tomcat-users.xml /opt/tomcat/conf/tomcat-users.xml"
      when: not tomcatexists.stat.exists

      #==================================================================
      # TOMCATサービスをリスタートする
      #==================================================================
    - name: TOMCATサービスをリスタートする
      service: name=tomcat enabled=yes state=restarted
      ignore_errors: True
	
```





##5 変数設定
###5.a 変数設定 Playbook(${ANSIBLE_HOME}/operations/firledir.yml)

```yaml:
---
  path:
    dir:
      data_root:
        path: /var/opt/data
        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: 755
      nfs_installer:
        path: /var/opt/data/nfs/installer
        user: infra
        group: infra
        state: directory
        permision: 755
      nfs_work:
        path: /var/opt/data/nfs/work
        user: infra
        group: infra
        state: directory
        permision: 755
      nfs_settings:
        path: /var/opt/data/nfs/settings
        user: infra
        group: infra
        state: directory
        permision: 755
      jenkins_root:
        path: /var/opt/data/jenkins
        user: tomcat
        group: tomcat
        state: directory
        permision: 755
      ssl_root:
        path: /etc/ssl/apserv_cets
        user: root
        group: root
        state: directory
        permision: 755
  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
	

```

###5.b 変数設定 Playbook(${ANSIBLE_HOME}/operations/enviroment.yml)

```yaml:
---
nfs:
  exportnetwork: 192.168.134.0
apache:
  user01:
    name: user01
    password: user01
  user02:
    name: user02
    password: user02
  user03:
    name: user03
    password: user03

openvpn:
  client_route: 192.168.102.0
  vpn_network: 10.99.0.0

tomcat:
  bindip_admin: 192.168.134.198
  bindip_ap: 192.168.134.196

mysql:
  password: password

nic:
  vpn: tun0
  lo: lo
  outer: enp0s9
  inner: enp0s8

```
##6 説明

##6.a 処理順説明

<dl>
<dt>Java/Tomcatのインストールは以下の手順で行います。</dt>
<dd>1. Javaが既にインストールされているか確認。(インストールされていれば以降の処理を実行しない(冪等性担保)</dd>
<dd>2. NFS上に存在するJavaインストール用のrpmを使用してJavaインストール</dd>
<dd>3. NFS情報TOMACATのtarボールを展開する</dd>
<dd>4. TOMCATルートディレクトリを/opt配下に移動</dd>
<dd>5. TOMCAT起動の環境変数設定のファイル(sentenv.sh)をNFS上からコピーしてTOMCATルートディレクトリ配下にコピー</dd>
<dd>6. SYSTEMDから起動する際のTOMCAT用環境変数設定のファイル(tomcatenviroment)をNFS上からコピーしてTOMCATルートディレクトリ配下にコピー</dd>
<dd>7. TOMCATのパーミッション/オーナー設定</dd>
<dd>8. SystemDで起動できるようにSYSTEMDの設定ファイルを配置</dd>
<dd>9. TOMCATのserver.xmlをNFSからコピー</dd>
<dd>10. server.xmlにはadminserv01とapserv01でそれぞれ固有のIPアドレスを記述するようにしている為server.xml内の文字列を置換<dd>11. TOMCATのWEBデプロイコンソールが利用できる用にユーザーを追加したファイルをNFSからコピー</dd>
<dd>12. SystemDで再スタート</dd>
</dl>

※今回のjavaインストール関して冪等性の担保は
・_which javaが実行出来た場合にはJavaインストール処理は行わない。_
・_tomcatの起動シェルが存在する場合にはTOMCATのインストール/設定処理は行わない。_
とちょっと大雑把になっていますがバージョンアップや修正したい場合には
再度実行できないといけない為、もう少し考慮が必要かと思います。
簡単な方法はtagにtomate_reinstallやjava_reinstallが指定されていれば
・_指定のバージョンやミドルウェアがインストールされているか確認する_
・_インストールされていればファイル削除やremoveを行う。_
等のstatモジュールとregisterモジュールを使用して
冪等性の担保を行う等の余地があるかと思います。



####6.b. 実行コマンド補足説明

上記にかきましたが事前にJavaインストールrpmをダウンロードしたものを
インストールするのではなく直接ansibleにてダウンロード/インストールする場合は以下でも可能です
(バージョンなんかは気にしてください)

#####get_urlモジュール,yumモジュール
```yaml:
get_url: url=http://download.oracle.com/otn-pub/java/jdk/8u65-b17/jdk-8u65-linux-x64.rpm dest=/tmp/jdk.rpm  headers="Cookie: oraclelicense=accept-securebackup-cookie"
yum: name=/tmp.jdk.rpm state=present
```


#####tarの解凍,所定のファイルコピー(shell/commandモジュール)
Ansibleには何故かansbile実行端末からリモートへのコピーやらはありますが
操作しているリモートサーバ内でのcpやらmvを実行するモジュールがありません。
tarコマンドをおこなうモジュールもありません。
なので今回はshellモジュールを使用します。
shell/commandモジュールは他のansibleモジュールと違い
冪等性の担保を自分でする必要があります。
registerモジュールを使用して変数に登録した上whenを使って確認後実行
とするのが冪等性を担保するうえでも良いかと思います。

```yaml:
# ========================================================
# statを使用してファイルの存在確認結果をXXXXExistsに登録する
# ========================================================
  stat: path=/tmp/XXXXX
  register: XXXXexists
```

```yaml:
# ========================================================
# XXXXExistsに保存した情報から/tmp/XXXXXファイルが存在しない場合だけtarコマンドを
#実行する
# ========================================================
  command: tar zxvf /tmp/XXXXX -C /tmp/YYYY/.
  when: not tomcatexists.stat.exists
```


#####パーミッション/オーナーの設定 (fileモジュール)
今までも沢山出てきていますが、fileモジュールで行います。

```yaml:
file:
        recurse = %YES=ディレクトリの場合再帰的に設定%
        group   = %ファイル/ディレクトリの所有グループ名%
        mode    = %パーミッション%
        owner   = %ファイル/ディレクトリの所有者%
        path    = %ファイル/ディレクトリのパス%
        state   = %file=ファイル , directory=ディレクトリ , absent-削除 , hard/link=リンク , touch=touch%
```
fileモジュールという名前ですがディレクトリに対しても実行可能です。
ここが役に立ちます。[ファイルモジュール(日本語)](http://qiita.com/moiwasaki/items/e2c843e255c81a65746c)


次回は「[216.seleniumのインストール・配置]」について。

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