Chefを使ってWebLogic Serverの基本ドメインを作ってみた


# 概要
Chefを使ってWebLogic Serverのサイレント・インストールを行いました。

- [Chefを使ってWebLogic Serverをサイレント・インストールしてみた](http://qiita.com/shinyay/items/318f60bb01caade47a00 "サイレント・インストール")

WebLogicはインストールした後に、**WebLogic Server ドメイン**という論理的な管理グループを作成する必要があります。
このWebLogic ServerドメインをChefを使って作成してみます。

# WebLogic Server ドメイン
マニュアルでは次の箇所にWebLogic Server ドメインについて記載があります。

- [Oracle® Fusion Middleware Oracle WebLogic Serverの理解: WebLogic Serverドメイン](http://docs.oracle.com/cd/E72987_01/wls/INTRO/domains.htm#INTRO173 "WebLogic Serverドメイン")

WebLogic Server ドメインは論理的な管理グループとお伝えしましたが、その管理対象に含まれる要素は以下のものがあります。

- サーバ
    - 管理サーバ：ドメインに必ず１つ必要なドメインの設定を管理するサーバ
    - 管理対象サーバ：アプリケーションやサービスをホストするサーバであり、管理サーバから設定を取得
- マシン：ハードウェアの境界（ノードマネージャを使用する場合は必須）
- クラスタ：アプリケーションに可用性と拡張性を提供するサーバの論理的なグループ

このWebLogic Server ドメインは論理的な単位なので、どのように区分するかは制限がありません。
基本的には、運用ポリシーやルール、サービスレベルが同じアプリケーションやサーバは同一のドメインに含めるようにします。

# Chefを使ってやりたい事
Chefを使って１ドメイン中に１管理サーバのみの最もシンプルなWebLogic Server ドメインを作成します。

## 今回作成するRecipe
- WLSTのスクリプト・モードでWebLogic Server ドメインを作成します。
    - 使用するドメイン・テンプレートは「Basic WebLogic Server Domain Template」
    - ドメイン構成は１サーバインスタンス（管理サーバ）/１マシン

# Recipe. WebLogic Server ドメインの作成
以下の３種類のファイルを作成します。
- Recipe
- Template
- Attribute

Templateでは、WebLogic Server ドメイン作成用のWLSTスクリプトを用意します。

- Template

以下の箇所でドメイン・テンプレート「Basic WebLogic Server Domain」を適用しています。

```templates/default/create_domain.py.erb
selectTemplate('Basic WebLogic Server Domain', '12.2.1.0')
loadTemplates()
```

以下の箇所で管理サーバのポートを指定しています。

```templates/default/create_domain.py.erb
cd('Servers/AdminServer')
set('ListenAddress','')
set('ListenPort', 7001)
create('AdminServer','SSL')
cd('SSL/AdminServer')
set('Enabled', 'True')
set('ListenPort', 7002)
```

そして以下の箇所で管理ユーザとパスワードの指定を行います。

```templates/default/create_domain.py.erb
cd('/')
cd('Security/base_domain/User/<%= node['weblogic-domain']['admin_user'] %>')
cmo.setPassword('<%= node['weblogic-domain']['admin_password'] %>')
```

WebLogic Serverは起動時に**開発者モード**と**プロダクションモード**の異なる起動サーバモードがあります。
以下で、起動モードを設定します。Attributeで開発者モード(dev)を設定しています。

```templates/default/create_domain.py.erb
setOption('ServerStartMode', '<%= node['weblogic-domain']['startmode'] %>')
```

最後にドメイン構成情報を書き込みます

```templates/default/create_domain.py.erb
writeDomain('<%= node['weblogic-domain']['domain_home'] %>/<%= node['weblogic-domain']['domain_name'] %>')
closeTemplate()
```

- Attribute

Attributeでは各デフォルト値を設定しています。

- default['weblogic-domain']['startmode']
    - WLSTスクリプトの**ServerStartMode**の設定
        - [(参考)Oracle® Fusion Middleware WebLogic Server WLSTコマンド・リファレンス](http://docs.oracle.com/cd/E72987_01/wls/WLSTC/toc.htm)

```attributes/default.rb
default['weblogic-domain']['startmode'] = 'dev'
# default['weblogic-domain']['startmode'] = 'prod'
```

- ['weblogic-domain']['domain_home']
- ['weblogic-domain']['domain_name']
    - WebLogic Server ドメインの構成場所とドメインの名前を指定

```attributes/default.rb
default['weblogic-domain']['domain_home'] = '/u01/app/oracle/config/domains'
default['weblogic-domain']['domain_name'] = 'mydomain'
```

- Recipe

RecipeではWLSTをスクリプト・モードで実行しています。
-[(参考)スクリプト・モード](http://docs.oracle.com/cd/E72987_01/wls/WLSTG/using_wlst.htm#i1080500)

```recipes/create.rb
execute "wlst.sh create_#{node['weblogic-domain']['domain_name']}_domain.py" do
  environment "CONFIG_JVM_ARGS" => "-Djava.security.egd=file:/dev/./urandom"
  command <<-EOH
    . #{node['weblogic-domain']['wls_home']}/server/bin/setWLSEnv.sh
    #{node['weblogic-domain']['oracle_common']}/common/bin/wlst.sh #{node['weblogic-domain']['response_file_dir']}/create_#{node['weblogic-domain']['domain_name']}_domain.py
  EOH
  user node['weblogic-domain']['user']
  group node['weblogic-domain']['group']
  action :run
  creates "#{node['weblogic-domain']['domain_home']}/#{node['weblogic-domain']['domain_name']}/bin"
end
```

- **WLS_HOME/server/bin/setWLSEnv.sh**で、必要な環境変数を設定しています。
- **ORACLE_HOME/oracle_common/common/bin/wlst.sh** WLSTスクリプトファイル(xxx.py)で、WLSTをスクリプト・モードとして実行しています。


# Chefの実行イメージ
![chef-oracle-weblogic-domain.gif](https://bytebucket.org/shinyay/images-for-blog/raw/1e5f3f6e7c41393ae192447a8f76b4cfeea7d1a4/qiita/160615_chef-oracle-weblogic-domain/chef-oracle-weblogic-domain.gif)

# まとめ
WebLogic Serverの導入は構成ウィザードを用いたGUIによる対話的な操作と、今回利用したWLSTスクリプトによるサイレント実行が可能です。
WLSTスクリプトはドメイン構成情報をテンプレート化しているので、Chefと組み合わせての環境の冪等性を担保するInfrastructure as Codeとして便利に利用できます。

- [今回のレシピ：https://github.com/shinyay/chef-oracle-weblogic-domain/tree/publish_20160615](https://github.com/shinyay/chef-oracle-weblogic-domain/tree/publish_20160615 "chef-oracle-weblogic-domain
")
  - WebLogic Server ドメインを作成するCookbookです。