Posted at

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

More than 3 years have passed since last update.

当記事はケーススタディの連載となっています。目次は【こちら】です。

最新のソースコードは【GitHub】で公開中です。

サーバの責務はこちらで確認ください。


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実行が失敗しないようにしています。


2.playbookファイルの相関


3.playbook(site.yml)

${ANSIBLE_HOME}/site.yml

メインとなるplaybook(site.yml)参照


4.JDK・TOMCATインストール/設定のplaybook(/operations/1021_javatomcat.yml)

${ANSIBLE_HOME}/operations/1021_javatomcat.yml

playbook中のコメントの補足に関しては「6.補足説明」を参照。

# ========================================================

# 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)

---

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)

---

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 処理順説明


Java/Tomcatのインストールは以下の手順で行います。

1. Javaが既にインストールされているか確認。(インストールされていれば以降の処理を実行しない(冪等性担保)

2. NFS上に存在するJavaインストール用のrpmを使用してJavaインストール

3. NFS情報TOMACATのtarボールを展開する

4. TOMCATルートディレクトリを/opt配下に移動

5. TOMCAT起動の環境変数設定のファイル(sentenv.sh)をNFS上からコピーしてTOMCATルートディレクトリ配下にコピー

6. SYSTEMDから起動する際のTOMCAT用環境変数設定のファイル(tomcatenviroment)をNFS上からコピーしてTOMCATルートディレクトリ配下にコピー

7. TOMCATのパーミッション/オーナー設定

8. SystemDで起動できるようにSYSTEMDの設定ファイルを配置

9. TOMCATのserver.xmlをNFSからコピー

10. server.xmlにはadminserv01とapserv01でそれぞれ固有のIPアドレスを記述するようにしている為server.xml内の文字列を置換
11. TOMCATのWEBデプロイコンソールが利用できる用にユーザーを追加したファイルをNFSからコピー

12. SystemDで再スタート


※今回のjavaインストール関して冪等性の担保は

which javaが実行出来た場合にはJavaインストール処理は行わない。

tomcatの起動シェルが存在する場合にはTOMCATのインストール/設定処理は行わない。

とちょっと大雑把になっていますがバージョンアップや修正したい場合には

再度実行できないといけない為、もう少し考慮が必要かと思います。

簡単な方法はtagにtomate_reinstallやjava_reinstallが指定されていれば

指定のバージョンやミドルウェアがインストールされているか確認する

インストールされていればファイル削除やremoveを行う。

等のstatモジュールとregisterモジュールを使用して

冪等性の担保を行う等の余地があるかと思います。


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

上記にかきましたが事前にJavaインストールrpmをダウンロードしたものを

インストールするのではなく直接ansibleにてダウンロード/インストールする場合は以下でも可能です

(バージョンなんかは気にしてください)


get_urlモジュール,yumモジュール

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を使って確認後実行

とするのが冪等性を担保するうえでも良いかと思います。

# ========================================================

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

# ========================================================

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


パーミッション/オーナーの設定 (fileモジュール)

今までも沢山出てきていますが、fileモジュールで行います。

file:

recurse = %YES=ディレクトリの場合再帰的に設定%
group = %ファイル/ディレクトリの所有グループ名%
mode = %パーミッション%
owner = %ファイル/ディレクトリの所有者%
path = %ファイル/ディレクトリのパス%
state = %file=ファイル , directory=ディレクトリ , absent-削除 , hard/link=リンク , touch=touch%

fileモジュールという名前ですがディレクトリに対しても実行可能です。

ここが役に立ちます。ファイルモジュール(日本語)

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

連載の目次は【こちら】です。