Docker for Mac でのWebSphere環境構築（プラグイン連携編）

[前回](https://qiita.com/ch7821/items/fb0468a44353998f059f)は`docker`コンテナへのインストールのみ実施しました。今回はIBM HTTP Server（IHS）からWebSphere Application Server（WAS）への連携（プラグイン連携）を設定していきます。
今のところでは以下のような構成になっています。
<img width="576" alt="スクリーンショット 2018-01-23 16.38.29.png" src="https://qiita-image-store.s3.amazonaws.com/0/232587/71de880e-81fe-c5f0-c710-455d9fff6150.png">
独立してIHSとWASのホスト（dockerコンテナ）が立っているだけです。お互いの存在はお互いに全く知りません。

# 1. Toolboxのインストール
まずは前回入れ忘れたToolbox（プラグインを構成するためのツール）をihsコンテナにインストールします。

* [x] WebSphere Customization Toolbox 9.0.0.6
* [x] IBM SDK, Java Technology Edition, Version 8 8.0.5.7

```bash
mac:$ docker start ihs was        # とりあえず両方起動
mac:$ docker exec -it ihs bash
root:# /opt/IBM/InstallationManager/eclipse/tools/imcl -c   # インストーラ起動
```

インストールは対話型ですので、レスポンスファイルを載せておきます。

```xml:toolbox.xml
<?xml version='1.0' encoding='UTF-8'?>
<agent-input>
  <variables>
    <variable name='sharedLocation' value='/opt/IBM/IMShared'/>
  </variables>
  <server>
    <repository location='https://www.ibm.com/software/repositorymanager/V9WASSupplements'/>
  </server>
  <profile id='WebSphere Customization Toolbox V9.0' installLocation='/opt/IBM/WebSphere/Toolbox'>
    <data key='cic.selector.arch' value='x86_64'/>
    <data key='cic.selector.nl' value='en,ja'/>
  </profile>
  <install>
    <!-- WebSphere Customization Toolbox 9.0.0.6 -->
    <offering profile='WebSphere Customization Toolbox V9.0' id='com.ibm.websphere.WCT.v90' version='9.0.6.20171205_1311' features='core.feature,pct,zpmt,zmmt'/>
    <!-- IBM SDK, Java Technology Edition, Version 8 8.0.5.7 -->
    <offering profile='WebSphere Customization Toolbox V9.0' id='com.ibm.java.jdk.v8' version='8.0.5007.20171218_1035' features='com.ibm.sdk.8'/>
  </install>
  <preference name='com.ibm.cic.common.core.preferences.eclipseCache' value='${sharedLocation}'/>
</agent-input>
```

# 2. プラグインの生成
CUI環境なので、プラグインは`wctcmd.sh`コマンド[^1]を実行して構成します。
[^1]: コマンドの詳細は[IBM Knowledge Center](https://www.ibm.com/support/knowledgecenter/ja/SSEQTP_9.0.0/com.ibm.websphere.base.doc/ae/tins_pctcl_using.html)を参照

フルパスは長いのでコマンド格納ディレクトリに移動します。

```bash
root:# cd /opt/IBM/WebSphere/Toolbox/WCT; pwd
/opt/IBM/WebSphere/Toolbox/WCT
```

プラグインを構成するのに必要となるレスポンスファイルを生成します。

```bash
root:# cat <<END_OF_CAT > response.txt
> configType=remote
> enableAdminServerSupport=true
> enableUserAndPass=true
> enableWinService=false
> ihsAdminCreateUserAndGroup=true
> ihsAdminUserID=ihsadmin
> ihsAdminPassword=ihsadminp@ssw0rd
> ihsAdminPort=8008
> ihsAdminUnixUserGroup=staff
> ihsAdminUnixUserID=piro
> mapWebServerToApplications=true
> wasMachineHostname=was.docker.mognet.net
> webServerConfigFile1=/opt/IBM/HTTPServer/conf/httpd.conf
> webServerDefinition=webserver1
> webServerHostName=www.docker.mognet.net
> webServerOS=Linux
> webServerPortNumber=80
> webServerSelected=ihs
> webServerType=IHS
> END_OF_CAT
```

プラグイン構成を生成します。`-defLocName`には任意の名前を指定します。`-defLocPathname`（注：nameの"n"が小文字）は、プラグインインストールパスを指定します。

```bash
root:# ./wctcmd.sh -tool pct -createDefinition -defLocName WebServerPlugin -defLocPathname /opt/IBM/WebSphere/Plugins -response response.txt
Importing definition location...

Definition location successfully imported

Launching tool pct ...

Tool execution completed successfully.
```

プラグインが正しく構成できていることを確認します。

```bash
root:# ./wctcmd.sh -tool pct -listDefinitions -defLocName WebServerPlugin
Definition location successfully imported

Launching tool pct ...


webserver1


Tool execution completed successfully.
```

# 3. adminサーバ（IHS管理サーバ）の起動
`response.txt`内でadminサーバを構成するよう指定したので、adminサーバを起動できるようになりました。adminサーバも`httpd`プロセスであり、特殊なコンテンツを保持しています（リッスンポートは`response.txt`内で`8008`に指定しました）。非常に広い意味でのRESTサービスであり、そのクライアントはWASです。WASからadminサーバへリクエストを送信することで、プラグインの伝搬やWEBサーバプロセスの制御（起動・停止・定義編集等）が可能になります。

この辺りは後で見ていくとして、とにかく起動します。起動には専用コマンドである`adminctl`を使います。

```bash
root:# /opt/IBM/HTTPServer/bin/adminctl -k start
root:# ps -ef | grep httpd | grep -v grep
root      4265     0  0 14:24 ?        00:00:00 /opt/IBM/HTTPServer/bin/httpd -d /opt/IBM/HTTPServer -f conf/admin.conf -k start
root      4266  4265  0 14:24 ?        00:00:00 /opt/IBM/HTTPServer/bin/httpd -d /opt/IBM/HTTPServer -f conf/admin.conf -k start
noody     4267  4265  0 14:24 ?        00:00:00 /opt/IBM/HTTPServer/bin/httpd -d /opt/IBM/HTTPServer -f conf/admin.conf -k start
root      4302     0  1 14:27 ?        00:00:00 /opt/IBM/HTTPServer/bin/httpd -d /opt/IBM/HTTPServer -k start
nobody    4303  4302  0 14:27 ?        00:00:00 /opt/IBM/HTTPServer/bin/httpd -d /opt/IBM/HTTPServer -k start
nobody    4304  4302  0 14:28 ?        00:00:00 /opt/IBM/HTTPServer/bin/httpd -d /opt/IBM/HTTPServer -k start
nobody    4305  4302  0 14:28 ?        00:00:00 /opt/IBM/HTTPServer/bin/httpd -d /opt/IBM/HTTPServer -k start
```

このようにadmin用と通常のWebサービス用の`httpd`プロセスが起動しています。

ついでに`entry.sh`を修正してコンテナ起動時に両方起動するようにしておきます。

```bash:/opt/IBM/entry.sh
#!/bin/bash
IHS_HOME=/opt/IBM/HTTPServer

${IHS_HOME}/bin/apachectl -k start
${IHS_HOME}/bin/adminctl -k start  # ←追加

while true; do
    sleep 10
done
```

# 4. WASとの連携設定
これでIHS側の準備は整いましたので、WAS側にWebサーバを登録します。やり方はいろいろありますが、一番簡単なのはプラグイン構成時に生成されたスクリプトをWAS稼働サーバで実行する、またはWASのWebコンソールを使用した方法です。

## 4.1 スクリプトによる手順
まずはスクリプトでやります。スクリプトはプラグイン構成時に`${WAS_PLUGIN_DIR}/bin`配下に格納され、その名も`configurewebserver1.sh`です。コンテナにリモートファイル転送系のサービスを入れていないので、`docker cp`でIHSサーバからホストOSを経由してWASサーバへスクリプトをコピーします。

```bash
mac:$ docker cp ihs:/opt/IBM/WebSphere/Plugins/bin/configurewebserver1.sh ./
mac:$ docker cp ./configurewebserver1.sh was:/opt/IBM/WebSphere/AppServer/profiles/AppSrv01/bin
```

コピーしたスクリプトをWAS側で実行します。`wsadmin.sh`コマンドが裏で実行されますが、これと同じディレクトリに配置する前提で動作します。従って、コピー先のディレクトリは上記のパスでなくてはいけないし、~~~実行時もそこに`cd`してからにする必要があります~~~（v8.5までは相対パス実行だった記憶がありますが、v9.0はちょっと違うようです）。

```bash
$ cd /opt/IBM/WebSphere/AppServer/profiles/AppSrv01/bin; pwd
/opt/IBM/WebSphere/AppServer/profiles/AppSrv01/bin
$ sh ./configurewebserver1.sh
Realm/Cell Name: <default>
Username: wsadmin
Password:         
 WASX7209I: Connected to process "adminagent" on node apserver using SOAP connector;  The type of process is: AdminAgent
WASX7303I: The following options are passed to the scripting environment and are available as arguments that are stored in the argv variable: "[webserver1, IHS, /opt/IBM/HTTPServer, /opt/IBM/HTTPServer/conf/httpd.conf, 80, MAP_ALL, /opt/IBM/WebSphere/Plugins, unmanaged, www.docker.mognet.net-node, www.docker.mognet.net, linux, 8008, ihsadmin, ihsadminp@ssw0rd]"
 
Input parameters: 
 
   Web server name             - webserver1 
   Web server type             - IHS 
   Web server install location - /opt/IBM/HTTPServer 
   Web server config location  - /opt/IBM/HTTPServer/conf/httpd.conf 
   Web server port             - 80 
   Map Applications            - MAP_ALL 
   Plugin install location     - /opt/IBM/WebSphere/Plugins 
   Web server node type        - unmanaged 
   Web server node name        - www.docker.mognet.net-node 
   Web server host name        - www.docker.mognet.net 
   Web server operating system - linux 
   IHS Admin port              - 8008 
   IHS Admin user ID           - ihsadmin 
   IHS Admin password          - ihsadminp@ssw0rd 
   IHS service name            - "" 
〜中略〜
Configuration save is complete.
```

一つ怖いのが、このスクリプトには`response.txt`に記載した内容が全て入っているので、IHS管理サーバのユーザ名・パスワードも平文で入力済みです。本番環境などで使う際は用済みになったら（あるいは使わなくても）削除しておく方が賢明です。というか、コマンドの実行直後にパラメタとしてパスワードも見えてます。セキュリティにうるさいところだと、一工夫いりそうなクセのあるスクリプトではあります。

## 4.2. Webコンソールによる手順
Webコンソールから実行する場合です（スクリプトにせよWebコンソールにせよ、裏で最終的に動いているのは`wsadmin.sh`コマンドです）。

1. Webコンソールを開きます（https://_[wasHostName]_:9043/ibm/console/logon.jsp）。
![スクリーンショット 2018-01-23 16.01.33.png](https://qiita-image-store.s3.amazonaws.com/0/232587/051dc3b8-bbcc-2b43-7301-06ec442f4197.png)
1. apserverを選択して続行します。
![スクリーンショット 2018-01-23 16.01.37.png](https://qiita-image-store.s3.amazonaws.com/0/232587/78219f76-65ca-f392-94e0-06b06e972122.png)
1. ユーザ名・パスワードを入力してログインします。
![スクリーンショット 2018-01-23 16.01.47.png](https://qiita-image-store.s3.amazonaws.com/0/232587/06507767-408a-4317-d4bd-a9b0b8dc21fb.png)
1. 左のガイドフレームから、「サーバー」ー「サーバータイプ」ー「Webサーバー」を選びます。
![スクリーンショット 2018-01-23 16.02.44.png](https://qiita-image-store.s3.amazonaws.com/0/232587/e42bdb6b-e118-852e-493d-770f6d248a8b.png)
1. 「新規作成」をクリックし、ウィザードに従って入力します。
![スクリーンショット 2018-01-23 16.02.49.png](https://qiita-image-store.s3.amazonaws.com/0/232587/7ae0c068-81ba-cf48-5c48-6509304da3d0.png)![スクリーンショット 2018-01-23 16.03.01.png](https://qiita-image-store.s3.amazonaws.com/0/232587/6181226c-7b4c-aaa1-51b0-3126fde26195.png)![スクリーンショット 2018-01-23 16.03.09.png](https://qiita-image-store.s3.amazonaws.com/0/232587/c50fd116-840f-795f-bdfe-2cab7465e504.png)![スクリーンショット 2018-01-23 16.03.16.png](https://qiita-image-store.s3.amazonaws.com/0/232587/0d98f487-90af-a21f-b13b-8f700d19feac.png)![スクリーンショット 2018-01-23 16.03.28.png](https://qiita-image-store.s3.amazonaws.com/0/232587/b20bb803-4627-e9c0-b54b-716981abfdcc.png)![スクリーンショット 2018-01-23 16.03.35.png](https://qiita-image-store.s3.amazonaws.com/0/232587/6045d6c7-8a93-0233-c51f-d6e1509f7cb2.png)![スクリーンショット 2018-01-23 16.04.00.png](https://qiita-image-store.s3.amazonaws.com/0/232587/9ab8cc0f-76f7-892c-f148-942bc5efad6a.png)![スクリーンショット 2018-01-23 16.04.11.png](https://qiita-image-store.s3.amazonaws.com/0/232587/436c5dba-347e-0284-d65d-cdc6f07cfe28.png)

これでWASへのWebサーバの登録は完了です。`webserver1`の「状況」が「始動済み（緑の右矢印アイコン）」になっているかと思います。`webserver1`の左にあるチェックボックスにチェックして、ボタンにあるような操作ができます。
ちなみに、WASの設定をWebコンソールから変更すると、ほぼ必ず「変更を有効にするには、サーバーの再始動が必要です」というメッセージが表示されますが、本当に必要なときは少ない気がします。英語版だと、"server __may__ need to be restarted"という表示だったと思います。

## 4.3. WASとの連携確認
まずはWASのウェブコンテナに直接アクセスしてみます。WASインストール時にオプションの「サンプルアプリケーション」を選択しているので、`snoop`というサーブレットが既に稼働しています。URLは`http://[_wasHostName_]:9080/snoop`です。
![スクリーンショット 2018-01-23 16.04.47.png](https://qiita-image-store.s3.amazonaws.com/0/232587/67dac119-df4f-a52e-7aa5-a6064571b311.png)
同様に、URLのホスト名を`[_ihsHostName_]`に変えてアクセスすると（`http://www.docker.mognet.net/snoop`）、、、
<img width="1383" alt="スクリーンショット 2018-01-23 16.07.20.png" src="https://qiita-image-store.s3.amazonaws.com/0/232587/2f2c7d8f-a5a8-a48f-ca47-22214265ac94.png">
はい、エラー（404 NotFound）になりました。まだWAS側のサーブレット情報がIHS側に連携されていません。そこで、同じくWebコンソールから、「プラグインの生成」と「プラグインの伝搬」を行います。
![スクリーンショット 2018-01-23 16.07.35.png](https://qiita-image-store.s3.amazonaws.com/0/232587/7ce6e6a4-705f-c863-1a0e-1e9ee8dbc954.png)![スクリーンショット 2018-01-23 16.07.42.png](https://qiita-image-store.s3.amazonaws.com/0/232587/bfe3de10-51bf-7913-ed97-946c8d7c8b41.png)
Webサーバを再起動して、再度IHS経由のURLでアクセスします。
<img width="1383" alt="スクリーンショット 2018-01-23 16.30.03.png" src="https://qiita-image-store.s3.amazonaws.com/0/232587/f2044f8b-312a-4cb0-9410-78204a966f35.png">
無事に`snoop`サーブレットの画面が表示されました。

なお、初期設定ではプラグインはアプリケーションがデプロイされるたびに、自動で生成されてWEBサーバまで伝搬されます。WEBサーバ側ではこれも初期設定でプラグインを60秒間隔でリロードします。待てないときは、`apachectl reload`あたりか、プロセス再起動します。

# 5. まとめ
<img width="576" alt="スクリーンショット 2018-01-23 16.38.29のコピー.png" src="https://qiita-image-store.s3.amazonaws.com/0/232587/adaa6a65-a562-5395-3534-af68acf8dc55.png">

IHSとWASとを連携（Apache+Tomcatでいうところの`mod_proxy_ajp`）させるために、以下を実施しました。

+ IHS側でプラグインのインストール

実体として、`httpd.conf`にプラグインモジュールを読込む設定が追加され、さらにIHS管理サーバが起動可能状態になります（ただの`httpd`プロセスなのでツールを使わなくても起動は可能ですが）。

```text:http.conf
LoadModule was_ap24_module /opt/IBM/WebSphere/Plugins/bin/64bits/mod_was_ap24_http.so
WebSpherePluginConfig /opt/IBM/WebSphere/Plugins/config/webserver1/plugin-cfg.xml
```
+ WAS側でIHSを登録

スクリプトまたはWebコンソールを使ってWASにWebサーバを登録したことで、WAS側からIHSを操作できるようになりました。操作する際は、WASからIHS管理サーバへHTTPアクセスします。

+ WAS側でプラグインを生成

IHSがどのリクエストをWASへ送ればよいかはWAS側しか知りませんので、WAS上でプラグインファイル（`plugin.xml`）を生成します。このファイルに`/snoop`はWASへリクエストを転送するような設定が書かれます。

+ IHSへプラグインファイル（`plugin.xml`）を伝搬

WASで生成したプラグインファイルをIHSへ伝搬（転送）することで、IHSとWASの連携設定は完了です。

今回は以上です。WASの構築ネタはもう少しだけ続きます。