[WLS] WLST Offline Script to Create Summary of WebLogic Domain

原文はこちら。
https://blogs.oracle.com/fmwinstallproactive/entry/wlst_offline_script_to_create

Introduction

問題の調査において、早い段階でより大きい絵を把握することが重要であると常に信じています。例えば、管理対象サーバが問題のある挙動を示している場合、ログを見るだけでなく、背景も知りたいと考えています。例えば…
  • サーバーはクラスタメンバーか?
  • WebLogic Serverドメインに何個のサーバー/クラスターが存在するか?
  • ドメインは複数のマシンにまたがって展開しているか?
  • システムリソース(JDBC、JMSなど)が動作しているか?
WebLogic Serverスクリプティング(WLST)は長年使われており、ブログやウェブサイト、フォーラムで非常に数多くのサンプルがUpされています。大半は、オンラインモードでスクリプトを実行することを前提としていますが、WLSTのオンライン接続が確立できない場合はどうでしょうか。
手動で<DOMAIN_HOME>/config/config.xmlファイルを調べることもできますが、いくつかの構成はconfig.xmlが参照している他のXMLファイルにあるため、これはあまりいい方策とは言えません。きっと別の方法があるはずです。何しろ、WebLogic Serverはドメイン構成をMBeanに保持しているわけですから。そんなわけで、WLSTを検討してみました。

WLST's readDomain Function

WLSTのreadDomain関数をオフラインモードで利用し、ドメインのMBean構成階層/ツリーをロードすることができます。これは以下のように簡単です。

例:Unixマシンの場合
WL_HOME=/oracle/middleware/wlserver_10.3
DOMAIN_HOME=/oracle/middleware/user_projects/domains/MyDomain
$WL_HOME/common/bin/wlst.sh

wls:/offline/readDomain('/oracle/middleware/user_projects/domains/MyDomain')
cdやlsスタイルの構文を使って、ツリーを移動する準備が整いました。
wls:/offline/MyDomain/ls()

drw-   AnyMachine
drw-   AppDeployment
drw-   Cluster
drw-   EmbeddedLDAP
drw-   FileStore
drw-   JDBCSystemResource
drw-   JMSServer
drw-   JMSSystemResource
drw-   Library
drw-   MigratableTarget
drw-   Security
drw-   SecurityConfiguration
drw-   Server
drw-   ShutdownClass
drw-   StartupClass
drw-   WLDFSystemResource

-rw-   Active                                        false
-rw-   AdminServerName                               AdminServer
-rw-   AdministrationMBeanAuditingEnabled            false
-rw-   AdministrationPort                            9002
......(略)

wls:/offline/MyDomain/cd ('Server')
wls:/offline/MyDomain/Server/ls()

drw-   AdminServer
drw-   MyManagedServer
drw-   MyManagedServer01

wls:/offline/MyDomain/Server/cd ('MyManagedServer')
wls:/offline/MyDomain/Server/MyManagedServer/ls()

drw-   DataSource
drw-   NetworkAccessPoint
drw-   SSL
drw-   ServerDiagnosticConfig


-rw-   AcceptBacklog                                 300
-rw-   AdminReconnectIntervalSeconds                 10
-rw-   AdministrationPort                            0
-rw-   AdministrationPortEnabled                     false
-rw-   AdministrationProtocol                        null

...

-rw-   JavaCompilerPostClassPath                     null
-rw-   JavaCompilerPreClassPath                      null
-rw-   JavaStandardTrustKeyStorePassPhraseEncrypted  null
-rw-   JdbcLoginTimeoutSeconds                       0
-rw-   KeyStores                                     null
-rw-   ListenAddress                                 127.0.0.1
-rw-   ListenDelaySecs                               0
-rw-   ListenPort                                    7021
-rw-   ListenPortEnabled                             true

... (略)

wls:/offline/MyDomain/Server/MyManagedServer/foo = get('ListenPort')
wls:/offline/MyDomain/Server/MyManagedServer/print foo

7021

Sample Script and Output

MBeanのツリーを横断して検索する機能がオンラインモードに比べて限られているので、サマリーに有用な属性の中から情報を自動的に取得、表示するスクリプトを書くことは難しいものです。ほとんどの場合、cd()、ls()、get()で立ち往生していますが、IFとFORループ構文を使ってちょっと工夫すると、プログラムでツリーを探索し、きれいなフォーマットで出力することができます。今回のサンプルではHTMLの表を使いました。

Sample Output

サンプル出力結果例はこちらです。スクリーンショットは以下の通りです。

Download Sample Script

サンプルスクリプトはこちらからどうぞ。

Instructions to Run:

1. 起動ラッパースクリプト(UNIXの場合startWLSofflineCollection.sh、Windowsの場合、startWLSofflineCollection.cmd)の環境変数を皆さんの環境に合わせて変更します。

例:startWLSofflineCollection.sh
WL_HOME=/oracle/middleware/wlserver_10.3
DOMAIN_HOME=/oracle/middleware/user_projects/domains/MyDomain; export DOMAIN_HOME
WLST_OUTPUT_PATH=/temp/wlst/; export WLST_OUTPUT_PATH
WLST_OUTPUT_FILE=WLST_MBean_Config_Summary.html; export WLST_OUTPUT_FILE

${WL_HOME}/common/bin/wlst.sh CollectWLSConfigOffline.py
(注意)WLST_OUTPUT_PATH ディレクトリの値はスラッシュ(/)(Windowsの場合は\)で終わる必要があります。スラッシュがないと、スクリプトはエラーになって動作しません。

2. ラッパースクリプトを実行します。wlst.cmdを呼び出し、MBeanの値を収集してHTMLファイルに描画するはずです。
(スクリプトがWLSTシェルを呼び出しますが、Pythonスクリプトの実行は5~10秒程度です)

Disclaimer

これはMS Windows、Linuxで動作するWebLogic Server 10.3.6のドメインに対しテストしたサンプルスクリプトです。皆様の環境でエラーが発生しないとか、期待した結果を出すことを保証できません。数多くの同僚がこのスクリプトを使い、そのフィードバックをもっていくつかの問題を解決しました。もしフィードバックすべきことがあれば、このブログエントリのコメントにお願いいたします。WLSTコードの問題を修正するようにつとめます。

Credits

以下のエントリが非常に参考になりました。
Invoking FMW Application MBeans in Weblogic  (Java / Oracle SOA blog)
http://biemond.blogspot.co.uk/2010/02/invoking-fmw-application-mbeans-in.html
WLST By Examples
http://wlstbyexamples.blogspot.co.uk/

Some Pitfalls (which required coding around)

Checking whether Configuration MBean Hierarchy Exists

クラスタやJDBC、JMS、ファイルストアなどのサービスや機能が構成されていない場合、間rねするMBean階層がドメインレベルでのリストに現れません。例えば、ClusterやJDBC、JMS、ファイルストアが構成されていない場合、ls()を使うと以下のように表示されます。
wls:/offline/MyDomain/ls()

drw-   AnyMachine
drw-   AppDeployment
drw-   EmbeddedLDAP
drw-   Library
drw-   MigratableTarget
drw-   Security
drw-   SecurityConfiguration
drw-   Server
drw-   ShutdownClass
drw-   StartupClass
drw-   WLDFSystemResource
プログラムでcdで表示されないディレクトリに移動しても以下のようなエラーが返ります。
Error: cd() failed. Do dumpStack() to see details.
これを回避するため、スクリプトにはカスタムのfindMBean関数が含まれています。この関数はreturnmapパラメータを使う配列にls()のコンテンツを格納しますので、配列を使って繰り返し処理をして指定した文字列(MBeanディレクトリ名)が存在するかどうかをチェックすることができます。
def findMBean(v_pattern):
    # get a listing of everything in the current directory
    mydirs = ls(returnMap='true');

    v_compile_pattern = java.util.regex.Pattern.compile(v_pattern);

    found = 'Nope not here';

    for mydir in mydirs:
        x = java.lang.String(mydir);
        v_matched = v_compile_pattern.matcher(x);
        if v_matched.find():
            found = 'true';
    return found;

AnyMachine v Machines

WebLogic Server 10.3では、ドメインに複数のマシンが構成されている(つまりマシンに関連するノードマネージャがある)場合、ドメインレベルでのls()は以下のように表示されます。
wls:/offline/MyDomain/ls()

drw-   AnyMachine
しかし、cd ('AnyMachine')は失敗します。正しいcdの構文は以下の通りです。
wls:/offline/MyDomain/cd ('Machines')

Identifying Target Information

JDBCシステムリソースやクラスタのような機能にはターゲットがある場合とない場合があります。存在しないMBeanディレクトリへ移動しようとしたり、存在しないMBean属性を取得しようとすると、エラーが発生し、スクリプトは以後の処理を継続できません。これを回避するためには、TRY/ECXEPT構文を使うことができます。以下のサンプルスクリプトでは、JDBCシステムリソースターゲットを取得し処理しています。
try:
    v_any_targets = '';
    v_jdbc_target = get('Target');

    # Even if the get fails, the variable is assigned a value of none, set the flag variable accordingly
    if v_jdbc_target == 'None':
        v_any_targets = 'None';
        v_no_of_targets = 1;
    else:   
        # If the get has succeeded then set flag accordingly and obtain length of array returned by the get
        # The array length will be used to determine the HTML rowspan value

        v_any_targets ='Use v_jdbc_target';
        v_no_of_targets = len(v_jdbc_target);

except:

    # Setting flag and rowspan variable here as well .. belt and braces
    v_any_targets = 'None';
    v_no_of_targets = 1;

    # The exception will still display to standard out, which may cause alarm
    # So adding this message telling the user the exception is expected and can be ignored
    print "IGNORE this exception";

0 件のコメント:

コメントを投稿