原文はこちら。
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):
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' );
if v_jdbc_target = = 'None' :
v_any_targets = 'None' ;
v_no_of_targets = 1 ;
else :
v_any_targets = 'Use v_jdbc_target' ;
v_no_of_targets = len (v_jdbc_target);
except :
v_any_targets = 'None' ;
v_no_of_targets = 1 ;
print "IGNORE this exception" ;
|
0 件のコメント:
コメントを投稿