Red Hat Training

A Red Hat training course is available for Red Hat JBoss Operations Network

JBoss ON コマンドラインスクリプトの作成

Red Hat JBoss Operations Network 3.3

JBoss ON CLI およびリモート API の使用

Jared イタリア

zach Rhoads

ella Deon Baard

概要

JBoss Operations Network は、JBoss ON サーバーと直接対話できる独自のコマンドシェルを提供します。この CLI は JBoss ON のリモート API を使用して、JBoss ON GUI で利用可能なほとんどのタスクや、サーバー設定のインポートおよびエクスポート、履歴メトリックデータのエクスポートなどの追加の操作を実行します。CLI を使用すると、管理者は JBoss ON デプロイメントをスクリプトおよび自動化できるため、インフラストラクチャーの管理が容易になります。
本ガイドでは、JBoss ON CLI のインストールおよび使用の基本について説明し、一般的なタスクのスクリプトの例を紹介します。主に、デフォルトの JBoss ON CLI を使用して JBoss ON を管理する管理者を対象としています。本ガイドには、プラグイン作成者と、リモート API を活用するカスタムアプリケーションを作成する開発者の 2 つ目の対象ユーザーがいます。

パート I. 使ってみる

JBoss ON では、異なる方法でスクリプトを使用できます。具体的には、達成すべき API に応じて、さまざまな API を利用できます。JBoss ON サーバーがさまざまなインターフェースを使用してクライアントと対話する方法を理解すると、さまざまな管理シナリオ向けにスクリプトの計画および書き込み方法を簡単に理解できます。スクリプトの改善(およびスクリプトを使用した JBoss ON の実行内容の理解が改善)により、IT 環境でのリソースの管理方法を自動化する機能が強化されます。

第1章 JBoss ON Server および CLI でのスクリプトの仕組み

JBoss Operations Network CLI およびサーバー側のスクリプトは、JBoss ON サーバー自体のコア機能の多くを公開し、JBoss ON のリソースを管理する上で IT 管理者に多くの制御を付与します。
JBoss ON のリモート API とそれを活用するスクリプトは、JBoss ON サーバーに直接アクセスする方法を提供します。これにより、管理者は厳密に UI ベースのデプロイメントとは異なる方法で JBoss ON と対話できます。
異なる JBoss ON API と JBoss ON サーバーとの対話方法を理解すると、管理者は CLI をプログラムで使用するために必要なスクリプトを計画し、アラートのプランニング、およびクライアントの設計に役に立ちます。

1.1. JBoss ON のパブリック API の概要

JBoss ON には関連するパブリック API が 3 つあり、それぞれが JBoss ON サーバーと異なる操作(リモート API、ドメイン API、およびプラグイン API)とは異なります。

表1.1 JBoss ON API

API description
remote
インベントリーの管理、設定変更、コンテンツのアップロードおよび管理、オペレーションの開始、メトリクスとアラートの表示、設定のドリフトの管理、グループの作成、ユーザーおよびロールの作成および管理などのタスク用のリソース管理機能。
リモート API は、標準の Java エンタープライズクライアントメカニズムまたはサーブレットベースの JBoss リモーティングエンドポイントを使用してアクセスできます。
domain
特に機能領域の設定方法において、サーバーのローカルマネージャー Bean を並行する機能。
クライアントはリモート API を使用してアクションをスクリプト化します。リモート API はドメイン API を使用して、オブジェクト検索に使用する基準やリソース設定を表示するさまざまなプロパティーなど、そのほとんどの機能を提供します。
プラグイン 両方のエージェント(リソース)プラグインに関連する機能。これは、JBoss ON CLI またはサーバー側のスクリプトで全く使用されません。API は、エージェントと JBoss ON サーバーとの間で情報を受信し、配信するためにエージェントプラグインによって使用されます。

1.2. JBoss ON Server およびインターフェース

JBoss ON サーバーは Java アプリケーションです。リソースおよびグループ、監視、アラート、ドリフト、プロビジョニングなどのサブシステムはすべて、サーバーのエンタープライズ JavaBean に含まれます。異なる JBoss ON API はこれらの EJB と対話します。
特に、サーバー EJB のほとんどはステートレスセッション bean(SLSB)です。これらのコアサーバー SLSB は、特定の命名ロジックに従います。
  • 実装クラスは *ManagerBean です。これにより、ローカル API とリモート API の両方が実装されます。
  • サーバーが内部的に使用された SLSB は *ManagerLocal です
  • リモート API を定義する SLSB は *ManagerRemote です
各 SLSB は、命名規則 *Manager で CLI でリモートインターフェースを公開します。たとえば、リソースの管理に関連するすべてのメソッドは ResourceManager に属します。
サーバー自体は EJB を使用してデータ構造を作成します。CLI は、リモート API、を使用してサーバー EJB と対話します。 *managers.リモート API は、のコンパイルです。 *remote サーバーの EJB のインターフェース。

図1.1 サーバーインターフェースおよびクライアントの対話

サーバーインターフェースおよびクライアントの対話
そのため、JBoss ON サーバーに適合し、サーバー側のスクリプトを使用する方法は?
異なる API はすべてクライアントと対話し、サーバーと若干異なる方法で対話します。
エージェントおよびそれらの基盤のリソースおよびリソースプラグインは、プラグイン API を使用してコアサーバー(リモーティングフレームワーク上)と通信します。エージェントとサーバープラグインは、JBoss ON の機能を拡張するために頻繁にペアで機能します。たとえば、バンドルの追加レシピスタイルを実装するには、サーバー側のデータ構造を操作するために、リソースと対応するサーバープラグインと連携するためにエージェントプラグインが必要になります。
JBoss ON CLI は、リモートおよびドメイン API を使用して、リモーティングフレームワークを介してコアサーバーと通信します。エージェントとは異なり、CLI は機能を実装しません(またはそれ以上は含まれません)、既存の機能上で管理タスクを実行します。
JBoss ON サーバーによってホストされる GUI は、ローカルインターフェースを直接使用します。GUI は CLI とは異なる API を使用するため、CLI(「JBoss ON CLI と JBoss ON GUI 操作の相違点」)ではなく、GUI で実行できる内容に若干の違いがあります。

1.3. JBoss ON CLI スクリプトおよび JBoss ON Server スクリプト

JBoss ON CLI と別の JBoss ON サーバースクリプトを使用して、リモート API にアクセスする方法は 2 つあります。
スクリプト自体は、JBoss ON CLI が対話的に実行されるメソッドの一部を除き、すべて同じです。CLI スクリプトとサーバー側のスクリプトはいずれも JavaScript で記述され、主にリモート API を使用します。ドメイン API からのサポートでは、検索などのタスクに対応します。
主な違いは、スクリプトが呼び出される方法にあります。
  • JBoss ON CLI は手動で実行し、スクリプトファイルを実行でき、cron などのシステムツールによって自動的に呼び出されることもできます。CLI は任意の JBoss ON サーバーに接続でき、リモートで実行できます。
    基本的に、CLI はスクリプト実行エンジンです。これは、スクリプト言語でリモート API を公開し、JBoss ON サーバーを動的に対話すると便利になります。
  • サーバー側のスクリプトは、JBoss ON サーバーデータベースで管理されるコンテンツリポジトリーにアップロードされ、起動されたアラートに対して呼び出されます。サーバー側のスクリプトがサーバーにありますが、同じ API を使用して他の CLI スクリプトとしてサーバーと通信します。

1.3.1. JBoss ON CLI および Server Scripts での CommonJS の使用

JBoss ON は、スクリプト間の依存関係を表す CommonJS モジュールローディングメカニズムの使用にも対応しています。CommonJS は、CLI と、変数を使用してスクリプトの検索およびロードに require 関数を使用するサーバースクリプトの両方でサポートされます。
重要
CLI インタラクティブセッションでレガシー exec 関数の使用はサポートされますが、推奨されるメソッドではありません。CommonJS がサポートするロードメカニズムにポートスクリプトを設定することが推奨されます。これは、よりセキュアで移植可能で、拡張可能なためです。
CommonJS の使用に関する詳細は、スクリプトソースのリスト、CLI およびサーバースクリプトとの互換性、およびスクリプトの検索および読み込み方法などを参照してください 6章依存関係とカスタム機能のスクリプトモジュールの使用

1.4. JBoss ON CLI と JBoss ON GUI 操作の相違点

JBoss ON UI と CLI スクリプトで実行できる内容には多くの重複がありますが、完全パリティーはありません。重要な違いがいくつかあります。
  • アラート定義の設定。これはおそらく最も重要な違いです。アラートが発生したアラートは CLI およびスクリプトから取得できますが、アラート定義を作成または編集したり、アラート通知を設定したり、アラート条件を設定する方法がありません。
  • 子リソースの手動作成
  • サーバーのフェイルオーバー一覧の定義
  • エージェントのアフィニティーグループの定義
他のローカルマネージャーはサーバーで内部的に使用されているため、リモート API 経由で公開またはアクセスする理由はありません。
  • raw 測定データの圧縮
  • 処理、キャッシング、およびロギングアラートの状況
  • パーティションイベントの処理
  • ロールメンバーシップに基づくリソースへの認可の判断
  • メトリクスコレクション、ドリフト検出、およびその他のスケジュール済みイベントのロードバランサーのスケジュール

1.5. 他のクライアントの使用

JBoss ON は API を介して多くの機能を公開するため、管理タスクを実行するための複数の異なるクライアントやリソースデータのカスタム表示またはビューを提供することができます。
JBoss ON 用に記述できるクライアントには、さまざまなタイプがあります。
  • アラートやモニタリングのチャートを表示するデスクトップアプリケーションなどの Java クライアント。JBoss ON CLI 自体は、スクリプト実行エンジンとして動作する Java シェルです。
  • JVM 互換言語のクライアント(Scalala、Groovy など)
カスタムクライアントの作成および使用については、本ガイドの対象外となります。しかし、JBoss ON の API の幅と柔軟性は、組織が JBoss ON を他のアプリケーションと統合したり、独自の環境固有のクライアントを作成し、インフラストラクチャーの管理を容易にする機会を高めます。

1.6. その他のリソース

JBoss ON サーバースクリプトの作成と JBoss ON CLI の使用では、Java の原則や JavaScript の記述にある程度の理解があることが前提となります。これらは、Java および JavaScript の理解を向上させるための優れたチュートリアルとリファレンスです。

第2章 JBoss ON CLI のインストール

JBoss ON サーバースクリプトを実行する方法は 2 つあります。
  • アラートへの対応
  • CLI ユーティリティーの使用
アラートの一部としてスクリプトを実行することはアラート定義で設定され、他のユーザーの介入は必要ありません。
スクリプトを手動で実行するには、CLI ユーティリティーをインストールする必要があります。

2.1. CLI のインストール

CLI ユーティリティーは、JBoss ON サーバーまたはエージェントがインストールされているシステムだけでなく、すべてのシステムにインストールできます。この CLI ユーティリティーパッケージは、必要な場所に単に展開されます。
注記
Java 6 JDK がシステムにインストールされている。
重要
アプリケーションサーバー内のクライアントからリモート API を実行 できません。たとえば、EAP インスタンス内のクライアントからリモート API を実行できず、以下のようなエラーで失敗します。
Caused by: java.lang.IllegalArgumentException: interface
org.rhq.enterprise.server.auth.SubjectManagerRemote is not visible from class
loader
at java.lang.reflect.Proxy.getProxyClass(Proxy.java:353)
at java.lang.reflect.Proxy.newProxyInstance(Proxy.java:581)
at
org.rhq.enterprise.client.RemoteClientProxy.getProcessor(RemoteClientProxy.java:69)
  1. JBoss ON GUI を開きます。
    http://server.example.com:7080
  2. トップメニューの Administration タブをクリックします。
  3. Downloads メニュー項目を選択します。
  4. Command Line Client Download セクションまでスクロールし、をクリックし Download CLI 4.9.JON.3.3ます。
  5. CLI がインストールされているディレクトリーに .zip ファイルを保存します。
  6. パッケージを展開します。例:
    [jsmith@server opt]$ unzip rhq-remoting-cli-4.9.JON.3.3.zip

2.2. CLI 環境変数の設定

JBoss ON CLI ユーティリティーは Java アプリケーションであるため、多くの環境変数、JVM 設定、およびその他の Java オプションをサポートします。
Java 設定および環境変数は rhq-cli-env.sh|bat ファイルに定義されます。
ヒント
rhq-cli-env.sh|bat ファイルには完全にアノテーションが付けられるため、利用可能なパラメーターがすべて詳細な説明が記載されます。JVM 設定またはパラメーターの一部を変更する場合は、rhq-cli-env.sh|bat ファイルで読み、利用可能なパラメーターを把握します。
ほとんどの引数にはデフォルト値が指定され、ほとんどのオペレーティング環境ではデフォルト値で十分です。
すべてのインストール(Java ホームディレクトリー)に設定する必要のある環境変数が 1 つあります。これは、rhq-cli-env.sh|bat ファイルで RHQ_CLI_JAVA_HOME または RHQ_CLI_JAVA_EXE_FILE_PATH 変数を編集して設定できます。例:
RHQ_CLI_JAVA_HOME="/usr/lib/jvm/java-1.6.0-openjdk-1.6.0.0.x86_64/jdk"
重要
ファイルを編集したり、その rhq-cli.sh|bat ファイルで環境変数を設定したりしないでください。環境変数と Java オプションは、rhq-cli-env.sh|bat ファイルでのみ設定する必要があります。
rhq-cli.sh|bat ファイルを編集すると、予期しない動作が発生したり、ユーティリティーを実行できなくなる可能性があります。

2.3. CLI ファイルおよびディレクトリー

これらは、CLI ユーティリティーのディレクトリーおよび関連ファイルです。

表2.1 重要な CLI ユーティリティーディレクトリーおよびファイル

ファイルまたはディレクトリー description
cliRoot/rhq-remoting-cli-4.9.0.JON320GA インストールディレクトリー。CLI ユーティリティーは単に展開されるため、インストールディレクトリーはシステム上の任意の場所になります。
CLI スクリプト
cliRoot/rhq-remoting-cli-4.9.0.JON320GA/bin CLI ユーティリティー用の Linux(shell)および Windows(batch)スクリプトの両方が含まれています。
rhq-cli.sh | rhq-cli.bat CLI ユーティリティー。
rhq-cli-env.sh | rhq-cli-env.bat Java ホームディレクトリーや Java オプションなど、CLI ユーティリティーの環境変数を設定します。
cliRoot/rhq-remoting-cli-4.9.0.JON320GA/samples/modules/ CommonJS モジュールのサンプルが含まれます。これは、modules:/ URI を使用して CommonJS モジュールを読み込むデフォルトのディレクトリーでもあります。
util.js
オブジェクトの配列を使用して繰り返し処理する検索関数を定義します。foreach)をクリックし、最初に一致するオブジェクト(find)または、一致するすべてのオブジェクトを返します(findAll).また、情報を JavaScript ハッシュから JBoss ON 設定オブジェクトへ変換する機能も含まれています。
samples/util.js スクリプトと同じですが、CommonJS モジュールとして記述されます。
bundles.js
バンドルの作成およびデプロイ、バンドル宛先の作成、リソースのサポートされるベースディレクトリーへの情報の取得などを行う関数を定義します。
samples/bundles.js スクリプトと同じですが、CommonJS モジュールとして記述されます。
drift.js
スナップショットの作成および配布、定義を取得し、リソースまたは特定ファイルの履歴を表示する関数を定義します。
samples/drift.js スクリプトと同じですが、CommonJS モジュールとして記述されます。
jbossas.js
Web アプリケーションのデプロイや EAP クラスターの管理など、EAP 6 / AS 7 リソースを管理する複数の機能を定義します。
CommonJS モジュールとして組み合わせ、記述された samples/deploy-to-and-restart-JBAS.js samples/add-as7-standalone-server-to-cluster.js スクリプトはおよびスクリプトと同じです。
サンプル
cliRoot/rhq-remoting-cli-4.9.0.JON320GA/samples サンプル JavaScript ファイルと、他のスクリプトと連携するように調整できる補助 JavaScript ファイルが含まれています。
util.js オブジェクトの検索、マッピング、および一覧表示の追加機能を提供するユーティリティースクリプト。
measurement_utils.js メトリクススケジュールの更新を簡素化するユーティリティースクリプト。基本的な測定 API を理解する代わりに、平易な(UI)名に基づいて変更するメトリクスを定義する方法を提供し、続いてより単純な用語で有効に/無効化、コレクション間隔を設定します。
drift.js スナップショットの作成、特定のドリフト定義の検索、スナップショットの比較、およびドリフト履歴の表示を行う関数を含むサンプルスクリプト。
bundles.js バンドル定義を設定するサンプルスクリプト。これには、バンドルアーカイブの生成、宛先グループの作成、バンドルのデプロイが含まれます。
deploy-to-and-restart-JBAS.js JBoss サーバーのグループに新しいバンドルまたは更新されたバンドルをデプロイし、宛先グループのサーバーを再起動するサンプルスクリプト。
モジュールサンプルスクリプト 
logging
cliRoot/rhq-remoting-cli-4.9.0.JON320GA/conf CLI ユーティリティーに log4j ロガーを設定する XML ファイルが含まれます。
log4j.xml
log4j-debug.xml
CLI ユーティリティーの通常のロギングおよびデバッグロギングの設定を設定します。
cliRoot/rhq-remoting-cli-4.9.0.JON320GA/logs CLI ユーティリティーのエラーログが含まれます。このディレクトリーは、CLI の初回実行時に作成されます。
rhq-server-cli.log CLI ユーティリティーのエラーログ。
ライブラリー
cliRoot/rhq-remoting-cli-4.9.0.JON320GA/lib プロキシーリソースや CLI 固有のコマンドのライブラリーなど、CLI ユーティリティーによって使用されるすべてのライブラリーが含まれます。

パート II. CLI での JBoss ON スクリプトの実行の基本例

JBoss ON サーバーでスクリプトを実行する方法の 1 つは、JBoss ON CLI を介して実行されます。[1] JBoss ON CLI は基本的に、JavaScript をインタラクティブに処理するかファイルから処理し、Java 仮想マシン内で実行します。CLI はサーバーのリモート API、基礎となるドメイン API、および独自の CLI 固有のメソッドを使用して、共通のタスクの実行を容易にします。
リモート API、ドメイン API、および CLI 固有のメソッドは、CLI およびスクリプトに公開され、簡単に使用できるようになります。


[1] 他の方法には、アラートスクリプトやカスタムクライアントが含まれます。

第3章 CLI を使用したコマンドおよびオプション

JBoss Operations Network CLI はサーバー上でスクリプトを実行する唯一の方法ですが、スクリプトを作成および実行する柔軟性と強力な方法です。
JBoss ON CLI は基本的に、JavaScript をインタラクティブに処理するかファイルから処理し、Java 仮想マシン内で実行します。(CLI の背景概念については、で詳細に説明されてい 1章JBoss ON Server および CLI でのスクリプトの仕組み ます。)
JBoss ON CLI は、スクリプトの作成とリソースの管理を容易にする独自の内部コマンド、オプション、およびメソッドを使用して定義されたリモートおよびドメイン API 上にビルドされます。最も大きなアセットの 1 つは、リソースプロキシーを作成する機能です。この プロキシーは単純化されたリソース (使用が容易)のリソースオブジェクトです。
本セクションでは、CLI オプションと基本的な使用方法のヒントを中心に説明します。スクリプトの基本は、を参照してください 12章短い例

第4章 互換性のある CLI およびサーバーバージョンの確認

エージェントおよびその他の JBoss ON コンポーネントと同様に、CLI ユーティリティーにはバージョンがあります。CLI ユーティリティーは、接続先の JBoss ON サーバーと同じバージョンである必要があります。
ローカル JBoss ON CLI が接続しようとしている JBoss ON サーバーと同じバージョンでない場合、接続は拒否されます。
注記
CLI ユーティリティーは、他のバージョンの JBoss ON サーバーと互換性がなく、新しいバージョンも以前のバージョンも互換性がありません。
この動作は設定可能です。一部のインスタンスは、外部クライアントまたはラッパーがサーバーバージョンに一致しない JBoss ON CLI と使用されることがあります。クライアント接続が拒否されないようにするには、Java オプションを追加して、CLI 設定ファイルのバージョンチェックプロパティーを無効にします。
[root@server ~]# vim cliRoot/rhq-remoting-cli-4.9.0.JON320GA/bin/rhq-cli-env.sh

RHQ_CLI_ADDITIONAL_JAVA_OPTS=-Drhq.client.version-check=false

第5章 JBoss ON CLI コマンド構文

JBoss ON CLI はシェルおよびインタープリターであるため、コマンドおよびステートメントを JBoss ON サーバーに対して対話的に実行できます。ファイルに保存されたスクリプトも実行できるため、JBoss ON サーバーの操作を自動化できます。

5.1. CLI スクリプト

CLI スクリプトは、cli-install-dir/bin ディレクトリーから直接実行されます。JBoss ON CLI の起動に関連するファイルが 2 つあります。
  • スクリプト(rhq-cli.sh|bat)
  • 環境変数のファイル(rhq-cli-env.sh|bat)
    rhq-cli-env.sh|bat ファイルの環境変数は、ほとんどのデプロイメントで妥当なデフォルトを使用するため、このファイルを編集する必要はありません。変数をリセットして、仮想マシンやデフォルト以外の JVM などのデフォルトのインストールに従わないサーバーをポイントすることができます。rhq-cli-env.|bat ファイルの上部にあるコメントには、利用可能な環境変数の詳細リストが含まれます。
    重要
    rhq-cli.sh|bat ファイルは編集しないでください。スクリプト自体ではなく、ターミナルまたは rhq-cli-env.sh|bat ファイルで環境変数のみを設定します。
注記
にある Java 6 インストールへの正しいパスを必ず設定してください。 RHQ_CLI_JAVA_HOME または RHQ_CLI_JAVA_EXE_FILE_PATH 変数。
この rhq-cli.sh|bat スクリプトには、以下の一般的な構文があります。
rhq-cli.sh|bat options
ユーザー名の指定など、引数を指定せずに CLI スクリプトを起動できます。これにより、サーバーに接続 せず に CLI クライアントが開きます。
[jsmith@server bin]$ cliRoot/rhq-remoting-cli-4.9.0.JON320GA/bin/rhq-cli.sh
RHQ - RHQ Enterprise Remote CLI 
unconnected$
スクリプトはログインせずに実行できますが、CLI の機能の多くは利用できません。JBoss ON CLI を実際に使用するには、ユーザー名とパスワードを渡すか、CLI の起動後に login コマンドを使用して、JBoss ON ユーザーとしてサーバーにログインします。
[jsmith@server bin]$ rhq-cli -u rhqadmin -p rhqadmin
CLI では、対話モードと非対話式の 2 つの操作モードを利用できます。
インタラクティブモードは、個別のステートメントを実行します。インタラクティブモードは、CLI のプロトタイプ、テスト、学習、および検出のためのシンプルな環境を提供します。
非対話モードは指定のスクリプトファイルを読み込み、複数のコマンドを順番に実行します。非対話モードでは、管理リソースでのメトリクスの収集やスケジュールされた操作の実行などのタスクを自動化する機能を提供します。
重要
このようなネイティブコマンドは quit、などのネイティブコマンドは対話モードでのみ利用できます。ファイルからスクリプトを実行する場合など、CLI が非対話モードで使用されている場合はスクリプトで使用 できません。このような場合には、Java メソッドを使用します。
ログイン後、コマンド(で確認 「インタラクティブな CLI コマンド」)をサーバーに渡すことができます。
重要
CLI をどのユーザーが実行する場合でも(つまり、システムユーザーが rhq-cli.sh スクリプトを実行するもの)は、CLI の logs/ ディレクトリーへの書き込みアクセスが必要になります。
CLI が root としてインストールされている場合は、通常ユーザーは CLI を実行できず、書き込みエラーで失敗します。

5.2. CLI スクリプトのオプション

の両方 rhq-cli.batrhq-cli.sh スクリプトは、に記載されているオプションを受け入れ 表5.1「コマンドラインオプション」 ます。

表5.1 コマンドラインオプション

短いオプション 長いオプション description
-h --help CLI のコマンドラインオプションのヘルプテキストを表示します。
-u --user JBoss ON サーバーにログインするために使用されるユーザー名。
-p --password JBoss ON サーバーにログインするために使用されるパスワード。
-P 入力が画面にエコーされないパスワードプロンプトを表示します。
-s --host CLI がコマンドを実行する JBoss ON サーバー。デフォルトは localhost です。
-t --port JBoss ON サーバーが HTTP リクエストを受け入れるポート。デフォルトは 7080 です。
-c --command 実行するコマンド。コマンドは二重引用符で囲む必要があります。コマンドの実行が終了すると、CLI が終了します。
-f --file 実行するスクリプトの完全パスとファイル名。
--args-style は、スクリプトに渡される引数のタイプまたは形式を示します。
-v --version CLI に接続したら、CLI と JBoss ON のサーバーバージョン情報を表示します。
--transport CLI と JBoss ON サーバー間の通信層プロトコルに SSL を使用するかどうかを決定します。指定しない場合、値は {port} オプションで決定されます。443 で終わるポートを使用する場合、SSL が使用されます。JBoss ON サーバーが 443 で終了しないポートで SSL をリッスンしている場合のみ、明示的にトランスポートを指定する必要があります。

5.3. インタラクティブな CLI コマンド

org.rhq.enterprise.client.commands CLI JAR 自体にはネイティブコマンドの一部が含まれています。これらのコマンドは CLI 自体の一部です。JBoss ON CLI の他の入力は JavaScript インタープリターを介してサーバーに渡されます。これらのコマンドは CLI モジュールに渡されます。
重要
これらのネイティブコマンドは対話モードでのみ利用できます。ファイルからスクリプトを実行する場合など、CLI が非対話モードで使用されている場合はスクリプトで使用 できません。このような場合には、Java メソッドを使用する必要があります。

5.3.1. login

指定されたユーザー名とパスワードで JBoss ON サーバーにログインします。
オプションで、ホスト名(または IP アドレス)およびポートを指定できます。ホスト名のデフォルトは localhost で、ポートのデフォルトは 7080 です。
SSL を使用してサーバーと通信するかどうかを設定するトランスポートプロトコルを指定することもできます。トランスポートが指定されていない場合、CLI はポートに基づいてトランスポートを評価します。443 で終わるポートは自動的に SSL を使用しますが、他のすべてのポートは標準接続を使用します。トランスポートメソッドを明示的に設定する唯一の理由は、サーバーが 443 で終了しないポートで SSL 上でリッスンしている場合のみです。
login username password [host] [port]
login コマンドは、モジュールスクリプトまたは rhq-cli.sh --f オプションで使用できます。

5.3.2. logout

CLI から存在せずに JBoss ON サーバーからログアウトします。
logout
logout コマンドは、モジュールスクリプトまたは rhq-cli.sh --f オプションで使用できます。

5.3.3. quit

CLI を終了します。
quit
これは、CLI が対話的に実行している場合にのみ機能します。スクリプトで、を使用します。 java.lang.System.exit.

5.3.4. record

ユーザー入力コマンドをファイルに記録します。これは、CLI を対話的に実行し、後で CLI で非対話的に実行する、またはアラートサーバー側のスクリプトとしてテストする場合に非常に便利です。
record [-b | -e] [-a] -f filename
オプション description
-b, --start
録画を開始するには、このオプションを指定します。
-e、--end
録画を停止するには、このオプションを指定します。
-a、--append
ファイルの最後に出力を追加します。指定されていない場合は、ファイルの最初に出力が書き込まれます。
-f, --file
出力が書き込まれるファイル。

5.3.5. EXEC(非推奨)

注記
exec コマンドを使用して外部スクリプトを CLI セッションに読み込むことはできますが、カスタムスクリプトおよび関数を読み込むこの方法は非推奨になりました。開発者は CommonJS モジュールスクリプトを使用することが推奨されます。モジュールスクリプトのデフォルトの場所は cliRoot/rhq-remoting-cli-4.9.0.JON320GA/samples/modules です。
指定されたファイル名でステートメントまたはスクリプトを実行します。ステートメントはバックスラッシュを使用して複数の行にラップします。
オプション description
-f, --file
実行するスクリプトの完全パスファイル名。完全パスが指定されるか、または CLI がスクリプトを見つけることができません。
-s, --style=named|indexed
は、スクリプトに渡される引数のタイプまたは形式を示します。indexed またはのいずれかの値が必要です named

第6章 依存関係とカスタム機能のスクリプトモジュールの使用

管理タスクを自動化したり、JBoss ON と対話するためにクライアントを作成する場合、カスタムクラスや関数の作成に頻繁に必要になります。JBoss ON CLI は CommonJS を実装し、スクリプトモジュール をサポートします。
注記
スクリプトモジュールは JavaScript で記述されています。

6.1. スクリプト依存関係とエクスポート機能について

rhq-cli.sh -f オプションを使用してファイルからスクリプトを実行する場合、外部ファイル内で明示的な依存関係を定義する方法はありません。このスクリプトに必要な関数は、スクリプトに含めるか、またはスクリプトからアクセスできる必要があります。
JBoss ON CLI は CommonJS を使用してスクリプト モジュール をサポートします。CommonJS は、スクリプト間の依存関係を表すロードメカニズムとして設計されています。スクリプトがデフォルトのモジュールディレクトリーにある場合、スクリプトは CLI セッションに読み込むことも、スクリプトで参照でき、エクスポートした機能は CLI で利用できます。モジュールは、他のモジュールを CLI セッションにロードするためにも使用できます。
公開されるスクリプトの唯一の部分は、で始まる関数 exports (CommonJS 規則に従う)です。
たとえば、サンプル util.js ファイルはをエクスポートします。 foreach JBoss ON のすべてのオブジェクトを検索でき、汎用オブジェクト、配列、基準(検索)オブジェクト、またはマップとして検索できます。
exports.foreach = function (obj, fn) {
  var criteriaExecutors = {
  Alert: function(criteria) { return AlertManager.findAlertsByCriteria(criteria); },
  ... 8< ...
  }
エクスポートされて いない 機能およびオブジェクトはすべてプライベートで、モジュールの外部では使用できません。
他のモジュールを要件としてリストすることで、モジュールを別のモジュールに読み込むことができます(依存関係の作成)。要件コードには存在 .js でき ますが、これを除外することが推奨されます。
var printResults = require("modules:/modules/util");
ヒント
エクスポートされた関数のみが利用できるため、スクリプトで定義した変数でのみ利用できます。たとえば、 printResults 変数、 foreach 関数が利用可能です。 printResults.foreach.
つまり、異なるスクリプトモジュールが同じ名前で定義されている関数を持つことはできますが、変数名前空間が異なるため、競合がないことを意味します。

6.2. スクリプトモジュールソースのデフォルトの場所

require ステートメントは、スクリプトで使用される特定された場所からモジュールを読み込みます。JBoss ON CLI、CLI スクリプト、またはサーバー側のスクリプトは、ローカルソースとリモートソースの両方に対して、複数の場所からモジュールを読み込むことができます。
require 行の形式は sourceType :/path/moduleFile です
デフォルトのモジュールの場所は、以下の一覧で定義されます。
Modules Directory
説明: ローカルシステム上に設定された場所から指定されたモジュールファイルを読み込みます。CLI には、モジュールのデフォルトディレクトリーを定義するシステムプロパティー(RHQ_CLI_MODULES_DIR)があります。
以下の例のように、rhq-cli-env.sh ファイルを更新するか、コマンドラインで場所を設定または変更できます。
RHQ_CLI_MODULES_DIR=/opt/rhq/modules
RHQ_CLI_MODULES_DIR=/opt/rhq/modules; bin/rhq-cli.sh
利用可能な CLI
ローカルファイルシステム
指定したモジュールファイルをローカルシステムの絶対パスから読み込みます。
形式 - ファイル:/path
例:
var myModule = require("file:/opt/jon/js-modules/myModule"); //This will load the module from a file called "myModule_js" in the /opt/jon/js-modules directory on the local filesystem.
利用可能な CLI
JBoss ON リポジトリー
指定された JBoss ON リポジトリーから指定のモジュールファイルをダウンロードします。これはサーバーに接続するため、ユーザーは最初に JBoss ON サーバーにログインする必要があります。
Format — rhq://repositories/repo_name/module_name
例:
var myModule = require("rhq://repositories/myRepo/myModule"); //This will load the module stored in the RHQ server repository "myRepo" called "myModule_js"
CLI および Server で利用可能
JBoss ON ダウンロード
JBoss ON サーバー上のダウンロード場所から指定のモジュールファイルをダウンロードします。JBoss ON では、アラートサーバー側のスクリプトまたは CLI に使用できる一部のスクリプトを利用できるようにできます。これはサーバーに接続するため、ユーザーは最初に JBoss ON サーバーにログインする必要があります。
形式 - rhq://downloads/path/module_name
例:
var myModule = require("rhq://downloads/script-modules/util"); //This will load the module stored in the RHQ server downloads section called "js/util_js"
利用可能 - CLI、サーバー

6.3. 新規モジュールソースタイプの作成

JBoss ON は、ローカルディレクトリーとリモートリポジトリーの両方を含む、さまざまな場所から CommonJS スクリプトモジュールをロードできます。
URL などの異なるソースからモジュールを読み込むサポートを作成できます。新しいモジュールソースの場所を作成するには、以下の 3 つの項目が必要です。
  • 新規の作成 ScriptSourceProvider インターフェース。
  • クラスの JAR の META-INF/services ディレクトリーに Java サービスエントリーを追加します。
  • 新しい JAR をクライアントおよび JBoss ON サーバーで使用できるように lib/ CLI インストールディレクトリーのディレクトリーに serverRoot/jon-server-3.3/modules/org/rhq/server-startup/main/deployments/rhq.ear/lib 配置し、サーバー側のスクリプト(alert スクリプト)で使用できるようにします。

例6.1 HTTP モジュールソースの場所

このスクリプトソースプロバイダーは、Java バージョンが HTTP または HTTPS プロトコルに対応している限り、指定の URI からスクリプトモジュールをダウンロードします。
  public class URLScriptSourceProvider implements ScriptSourceProvider {
  public Reader getScriptSource(URI scriptUri) {
  if (scriptUri == null) {
  return null;
  }
  try {
  return new InputStreamReader(scriptUri.toURL().openStream())
  } 
  catch (MalformedURLException e) {
  return null;
  } 
  catch (IOException e) {
  return null;
  }
  }
}
スクリプトプロバイダー JAR の META-INF ディレクトリーに services ディレクトリーを作成します。
次に、META-INF/services/ ディレクトリー内に、というファイルを作成します。 org.rhq.scripting.ScriptSourceProvider.JAR に実装されたソースプロバイダーの完全なクラス名(行ごとに 1 つ)を追加します。たとえば、 URLScriptSourceProvider 唯一のソースプロバイダーです。
com.example.URLScriptSourceProvider
これは JAR のレイアウトです。
* com
* example 
* URLScriptSourceProvider.class
* META-INF 
* services 
* org.rhq.scripting.ScriptSourceProvider
この JAR は、lib CLI インストールディレクトリーに ba を追加する必要があります。その後、スクリプトは、そのシステムの JBoss ON CLI で実行され、HTTP プロバイダーを使用してネットワークからファイルをダウンロードできます。
var myModule = require("http://server.example.com/rhq-scripts/stuff_js");
同じソースプロバイダーをアラートスクリプトで使用できるようにするには、JAR を JBoss ON サーバーの modules/org/rhq/server-startup/main/deployments/rhq.ear/lib/ ディレクトリーに追加する必要があります。

第7章 JBoss ON API での利用可能なインプリシット変数

Java プログラミング言語では、java.lang パッケージのクラスをインポートする必要はありません。これらは自動的に利用可能になります。ただし、他のパッケージのクラスは明示的にインポートする必要があります。
JBoss ON CLI では、定期的な使用されるドメイン API からクラスが多数あります。JBoss ON CLI の使用を簡素化するには、以下のすべて org.rhq.core.domain クラスは自動的にインポートされるため、CLI を使用してリソース、アラート、およびその他の設定エリアの管理が容易になります。例: クラス org.rhq.core.domain.criteria.ResourceCriteria 一般的には、リソースのクエリーに使用されます。クラスパス全体はそのクラスを呼び出すときに指定できます。
var criteria = new org.rhq.core.domain.criteria.ResourceCriteria();
var resource = new org.rhq.core.domain.resource.Resource();
ドメインクラスがすでにインポートされているため、以下のように記述されやすい場合があります。
var criteria = new ResourceCriteria();
var resource = new Resource();
CLI スクリプトで使用する一般的な変数はに記載されてい 表7.1「デフォルトで使用できる変数は JBoss ON CLI です。」 ます。これらの変数のメソッドおよび他の情報については、を参照してください 8章JBoss ON CLI に固有するメソッド

表7.1 デフォルトで使用できる変数は JBoss ON CLI です。

変数 type description Access Requires ログイン
rhq org.rhq.enterprise.client.Controller インタラクティブ CLI に組み込みコマンド(login、logout、quit、exec、および version)を提供します。これらのメソッドの 2 つ(login および logout)は、以下のようなサーバースクリプトファイルで呼び出すことができます。 rhq.login('rhqadmin', 'rhqadmin').
subject org.rhq.core.domain.auth.Subject ユーザーにログインしている現在のユーザーを表します。セキュリティー上の理由から、すべてのリモートサービスの呼び出しでは、サブジェクトを渡す必要がありますが、CLI は暗黙的にサブジェクトを渡します。
assert org.rhq.bindings.util.ScriptAssert CLI スクリプト用のアサーションユーティリティーを提供します。 いいえ
pretty
org.rhq.enterprise.client.TabularWriter
タブ形式の印刷とオブジェクトの変換(パッケージ内のドメインオブジェクト)を提供し org.rhq.core.domain、コンソールで表示に適した形式にします。 いいえ
unlimitedPC org.rhq.core.domain.util.PageControl いいえ
pageControl org.rhq.core.domain.util.PageControl データ取得操作でページングとソートを指定するために使用されます。 いいえ
exporter
org.rhq.enterprise.client.Exporter
出力をファイルにエクスポートするために使用されます。サポートされる形式はプレーンテキストで、表形式および CSV です。 いいえ
ProxyFactory
org.rhq.bindings.client
いいえ
scriptUtil
org.rhq.enterprise.client.utility.ScriptUtil
では、スクリプトを作成する際に便利なメソッドを提供します。 いいえ
AlertManager org.rhq.enterprise.server.alert.AlertManagerRemote alerts サブシステムにインターフェースを提供します。
AlertDefinitionManager org.rhq.enterprise.server.alert.AlertDefinitionManagerRemote アラート定義サブシステムにインターフェースを提供します。
AvailabilityManager org.rhq.enterprise.server.measurement.AvailabilityManagerRemote リソースの可用性を判断するために使用できる measurement サブシステムへのインターフェースを提供します。
CallTimeDataManager org.rhq.enterprise.server.measurement.CallTimeDataManagerRemote コールタイムメトリックデータを取得するために、measurement サブシステムにインターフェースを提供します。
RepoManager org.rhq.enterprise.server.content.RepoManagerRemote リポジトリーを操作するために、Content サブシステムにインターフェースを提供します。
ConfigurationManager org.rhq.enterprise.server.configuration.ConfigurationManagerRemote configuration サブシステムにインターフェースを提供します。
DataAccessManager org.rhq.enterprise.server.report.DataAccessRemote ユーザー定義のクエリーを実行するインターフェースを提供します。
EventManager org.rhq.enterprise.server.event.EventManagerRemote events サブシステムにインターフェースを提供します。
MeasurementBaselineManager org.rhq.enterprise.server.measurement.MeasurementBaselineManagerRemote 測定ベースラインを操作するための measurement サブシステムへのインターフェースを提供します。
MeasurementDataManager org.rhq.enterprise.server.measurement.MeasurementDataManagerRemote 測定データを操作するための measurement サブシステムへのインターフェースを提供します。
MeasurementDefinitionManager org.rhq.enterprise.server.measurement.MeasurementDefinitionManagerRemote 測定定義を使用するための measurement サブシステムへのインターフェースを提供します。
MeasurementScheduleManager org.rhq.enterprise.server.measurement.MeasurementScheduleManagerRemote 測定スケジュールを操作するための measurement サブシステムへのインターフェースを提供します。
OperationManager org.rhq.enterprise.server.operation.OperationManagerRemote 操作サブシステムにインターフェースを提供します。
ResourceManager org.rhq.enterprise.server.resource.ResourceManagerRemote resource サブシステムにインターフェースを提供します。
ResourceGroupManager org.rhq.enterprise.server.resource.group.ResourceGroupManagerRemote リソースグループサブシステムにインターフェースを提供します。
GroupDefinitionManager org.rhq.enterprise.server.resource.group.definition.GroupDefinitionManagerRemote dynagroups を作成および管理するインターフェースを提供します。
ResourceTypeManager org.rhq.enterprise.server.resource.ResourceTypeManagerRemote リソースタイプと連携するためのインターフェースを resource サブシステムに提供します。
RoleManager org.rhq.enterprise.server.authz.RoleManagerRemote セキュリティールールおよびロールを操作するためのインターフェースを security サブシステムに提供します。
SubjectManager org.rhq.enterprise.server.auth.SubjectManagerRemote ユーザーと連携するためのインターフェースを security サブシステムに提供します。
SupportManager org.rhq.enterprise.server.support.SupportManagerRemote 管理リソースのレポートを取得するためのインターフェースを reporting サブシステムに提供します。

第8章 JBoss ON CLI に固有するメソッド

JBoss ON CLI および JBoss ON のサーバースクリプトは、通常の API には含まれない一部のクラスおよびメソッドを使用できます。

第9章 CLI およびサーバースクリプトで利用可能な方法

9.1. assert

CLI スクリプト用のアサーションユーティリティーを提供します。Java アサーションの使用に関する詳細は、Java 言語のドキュメントを参照してください
method 署名
Assert.assertEquals
assertEquals(float, float, float, String)
assertEquals(short, short, String)
assertEquals(double, double, double)
assertEquals(long, long, String)
assertEquals(byte, byte, String)
assertEquals(Object, Object)
assertEquals(char, char, String)
assertEquals(Object, Object, String)
assertEquals(double, double, double, String)
assertEquals(byte[], byte[])
assertEquals(boolean, boolean)
assertEquals(Object[], Object[], String)
assertEquals(Collection, Collection)
assertEquals(Object[], Object[])
assertEquals(byte, byte)
assertEquals(float, float, float)
assertEquals(char, char)
assertEquals(int, int)
assertEquals(long, long)
assertEquals(Collection, Collection, String)
assertEquals(short, short)
assertEquals(String, String, String)
assertEquals(byte[], byte[], String)
assertEquals(boolean, boolean, String)
assertEquals(String, String)
assertEquals(int, int, String)
Assert.assertEqualsNoOrder
assertEqualsNoOrder(Object[], Object[], String)
assertEqualsNoOrder(Object[], Object[])
Assert.assertExists
assertExists(String)
Assert.assertFalse
assertFalse(boolean)
assertFalse(boolean, String)
Assert.assertNotNull
assertNotNull(Object)
assertNotNull(Object, String)
Assert.assertNotSame
assertNotSame(Object, Object, String)
assertNotSame(Object, Object)
Assert.assertNull
assertNull(Object)
assertNull(Object, String)
Assert.assertNumberEqualsJS
assertNumberEqualsJS(double, double, String)
Assert.assertSame
assertSame(Object, Object, String)
assertSame(Object, Object)
Assert.assertTrue
assertTrue(boolean, String)
assertTrue(boolean)
Assert.fail
fail()
fail(String, Throwable)
fail(String)

9.2. subject

現在のログイン済み JBoss ON ユーザーを表します。
method 署名
subject.addLdapRole
addLdapRole(Role)
subject.addRole
addRole(Role)
addRole(Role, boolean)
subject.department 現在のユーザーの部門値(存在する場合)を出力します。
subject.emailAddress 現在のユーザーのメールアドレスを出力します。
subject.factive ユーザーアカウントがアクティブであるかどうかを出力します。
subject.firstName ユーザー名を出力します。
subject.fsystem
subject.id JBoss ON 内のユーザーアカウントの ID 番号を出力します。
subject.lastName ユーザーの接頭辞を出力します。
subject.ldapRoles 現在のユーザーがメンバーとなっている LDAP グループに関連付けられたロールを一覧表示します。
subject.name 現在のユーザーの JBoss ON ユーザー ID を出力します。
subject.ownedGroups
subject.phoneNumber 現在のユーザーの電話番号を出力します。
subject.removeLdapRole
removeLdapRole(Role)
subject.removeRole
removeRole(Role)
subject.roles ロール名、パーミッション、関連付けられた LDAP ユーザーおよびグループ、関連するリソースグループ、および現在のユーザーが属するすべてのロールに関するその他の情報を表示します。
subject.sessionId 現在のセッション ID 番号を出力します。
subject.smsAddress ユーザーのページ番号(存在する場合)を返します。
subject.toString
String toString()
subject.userConfiguration 設定されたポートレット、ダッシュボード、ログインユーザー固有の設定に基づいて、ダッシュボード情報をすべて返します。

9.3. pretty

CLI オブジェクト(特に検索結果およびその他のドメインオブジェクト)を出力の Pretty 形式に変換します。
method 署名
pretty.exportMode サーバーの現在のエクスポート設定を出力します。
pretty.print
print(String[][])
print(PropertySimple, int)
print(Configuration)
print(PropertyMap, int)
print(PropertyList, int)
print(Collection)
print(Map)
print(Object[])
print(Object)
pretty.width コンソール表示の現在の幅設定を出力します。

9.4. unlimitedPC および pageControl

返されたデータのページングとソートを設定します。
method 署名
unlimitedPC.addDefaultOrderingField
addDefaultOrderingField(String, PageOrdering)
addDefaultOrderingField(String)
unlimitedPC.clone
clone()
unlimitedPC.firstRecord 結果ページの最初のレコードを返します。
unlimitedPC.getExplicitPageControl
PageControl getExplicitPageControl(int, int)
unlimitedPC.getSingleRowInstance
PageControl getSingleRowInstance()
unlimitedPC.getUnlimitedInstance
PageControl getUnlimitedInstance()
unlimitedPC.initDefaultOrderingField
initDefaultOrderingField(String)
initDefaultOrderingField(String, PageOrdering)
unlimitedPC.orderingFields
unlimitedPC.orderingFieldsAsArray
unlimitedPC.pageNumber ページ化された結果の現在のページ番号を返します。
unlimitedPC.pageSize 現在の設定されたページサイズを返します(ページごとに返されたエントリーの数)。
unlimitedPC.primarySortColumn
unlimitedPC.primarySortOrder
unlimitedPC.removeOrderingField
removeOrderingField(String)
unlimitedPC.reset
reset()
unlimitedPC.setPrimarySort
setPrimarySort(String, PageOrdering)
unlimitedPC.setPrimarySortOrder
setPrimarySortOrder(PageOrdering)
unlimitedPC.sortBy
sortBy(String)
unlimitedPC.startRow 現在の開始行番号を返します。
unlimitedPC.toString
String toString()
unlimitedPC.truncateOrderingFields
truncateOrderingFields(int)

9.5. exporter

CLI 出力を指定されたファイルに書き込みます。
method 署名
exporter.close
close()
exporter.file
exporter.format は、現在設定されている出力形式を表示します。
exporter.pageWidth 出力ファイルのコンテンツの設定済み行の長さを表示します。
exporter.setFormat
setFormat(String)
exporter.setFile
setFile(String)
exporter.setPageWidth
setPageWidth(int)
exporter.setTarget
setTarget(String, String)
exporter.write
write(Object)

9.6. ProxyFactory

リソースオブジェクトを管理しやすく、より簡単に管理するための特殊な方法を提供します。
method 署名
ProxyFactory.getResource
ResourceClientProxy getResource(int)
ProxyFactory.outputWriter
ProxyFactory.remoteClient リモートクライアントによって使用されるマネージャーおよび設定に関する情報を返します。インタラクティブ CLI では、インタラクティブ CLI によって使用されるマネージャー Bean に関する情報が出力されます。
ProxyFactory.resource

9.7. scriptUtil

CLI スクリプトの作成に使用するユーティリティーを提供します。
method 署名
scriptUtil.findResources
PageList<Resource> findResources(String)
scriptUtil.getFileBytes
byte[] getFileBytes(String)
scriptUtil.isDefined
boolean isDefined(String)
scriptUtil.saveBytesToFile
saveBytesToFile(byte[], String)
scriptUtil.sleep
sleep(long)
scriptUtil.waitForScheduledOperationToComplete
ResourceOperationHistory waitForScheduledOperationToComplete(ResourceOperationSchedule, long, int)
ResourceOperationHistory waitForScheduledOperationToComplete(ResourceOperationSchedule)

9.8. プロキシーリソースに使用できる方法

ProxyFactory クラスは、監視データの表示、実行中の操作、リソースやプラグイン設定の変更など、多くの一般的なリソース管理タスクのショートカットを提供します。これらのメソッドは通常の API には含まれませんが、JBoss ON CLI と JBoss ON サーバー側のスクリプトの両方で使用できます。
ProxyFactory で利用可能なショートカットやメソッドは、リソースの種類によって異なります。メソッドは、リソースタイプが機能エリアをサポートしている場合にのみ利用できます。
このセクションでは、3 つの最も一般的なリソース種別を一覧表示します。
ヒント
インタラクティブ CLI でタブ補完を使用して、リソースタイプに使用できる特定の方法を検索するか、個別のメソッドのメソッド署名を取得します。
プロキシーリソースの使用については、を参照してください 「リソースプロキシーの使用」

表9.1 プラットフォームのプロキシーメソッド

情報メソッド
measurements 利用可能なメトリック、現在の値、プラットフォームリソースのすべての測定値の説明をプリントする一覧を表示します。
operations リソースタイプに使用できる操作を表示します。
ショートカットメトリックメソッド
osname OSVersion アーキテクチャー createdDate
description distributionName distributionVersion freeMemory
freeSwapSpace hostname idle TotalMemory
systemLoad totalSwapSpace usedSwapSpace usedMemory
userLoad modifiedDate waitLoad version
ショートカットリソースエントリーメソッド
ID(インベントリー ID 番号) resourceType name(インベントリー名)
ショートカット操作メソッド
manualAutodiscovery cleanYumMetadataCache viewProcessList
ショートカット設定メソッド
editPluginConfiguration() pluginConfiguration
pluginConfigurationDefinition
ショートカットコンテンツメソッド
contentTypes
ショートカットのインベントリーメソッド
method 署名
platform.getChild
ResourceClientProxy getChild(String)
platform.getMeasurement
Measurement getMeasurement(String)
platform.updatePluginConfiguration
PluginConfigurationUpdate updatePluginConfiguration(Configuration)
platform.toString
String toString()

表9.2 JBoss AS/EAP サーバーのプロキシーメソッド

情報メソッド
measurements 利用可能なメトリクス、現在の値、および JBoss リソースのすべての測定値の詳細をプリントする一覧を表示します。
operations リソースタイプに使用できる操作を表示します。
ショートカットメトリックメソッド
JVMFreeMemory JVMMaxMemory JVMTotalMemory activeThreadCount
activeThreadGroupCount buildDate createdDate description
modifiedDate startDate totalTransactions totalTransactionsperMinute
transactionsCommitted transactionsCommittedperMinute transactionsRolledback transactionsRolledbackperMinute
partitionName versionName version
ショートカットリソースエントリーメソッド
ID(インベントリー ID 番号) resourceType name(インベントリー名)
ショートカット操作メソッド
restart shutdown start
ショートカット設定メソッド
editPluginConfiguration() pluginConfiguration
pluginConfigurationDefinition
ショートカットコンテンツメソッド
contentTypes
ショートカットのインベントリーメソッド
method 署名
jbossas.getChild
ResourceClientProxy getChild(String)
jbossas.getMeasurement
Measurement getMeasurement(String)
jbossas.updatePluginConfiguration
PluginConfigurationUpdate updatePluginConfiguration(Configuration)
jbossas.toString
String toString()

表9.3 コンテンツソースのプロキシーメソッド(EAR、WAR、JAR)

情報メソッド
measurements 利用可能なメトリック、現在の値、およびコンテンツリソースのすべての測定値の説明をプリントする一覧を表示します。
operations リソースタイプに使用できる操作を表示します。
ショートカットメトリックメソッド
createdDate modifiedDate description
path version Exploqued
ショートカットリソースエントリーメソッド
ID(インベントリー ID 番号) resourceType name(インベントリー名)
ショートカット操作メソッド
元に戻す
ショートカット設定メソッド
editPluginConfiguration() pluginConfiguration
pluginConfigurationDefinition
ショートカットコンテンツメソッド
contentTypes backingContent
ショートカットのインベントリーメソッド
method 署名
content.getChild
ResourceClientProxy getChild(String)
content.getMeasurement
Measurement getMeasurement(String)
content.updatePluginConfiguration
PluginConfigurationUpdate updatePluginConfiguration(Configuration)
content.toString
String toString()
content.retrieveBackingContent
retrieveBackingContent(String fileName)
content.updateBackingContent
updateBackingContent(String filename, String displayVersion)

第10章 JBoss ON CLI スクリプトでの一般的なアクション

重要
アプリケーションサーバー内のクライアントからリモート API を実行 できません。たとえば、EAP インスタンス内のクライアントからリモート API を実行できず、以下のようなエラーで失敗します。
Caused by: java.lang.IllegalArgumentException: interface
    org.rhq.enterprise.server.auth.SubjectManagerRemote is not visible from class
    loader
    at java.lang.reflect.Proxy.getProxyClass(Proxy.java:353)
    at java.lang.reflect.Proxy.newProxyInstance(Proxy.java:581)
    at
    org.rhq.enterprise.client.RemoteClientProxy.getProcessor(RemoteClientProxy.java:69)

10.1. ログイン

CLI は、GUI 経由で接続するのと同様に、実際に JBoss ON サーバーに接続します。つまり、ほとんどのタスクを実行する前にサーバーにログインする必要があります。
CLI を使用してサーバーにログインする方法は 2 つあります。
  • rhq-cli.sh スクリプトの実行時にユーザーの認証情報を渡す。
  • スクリプト command で、またはサーバーに接続せずに CLI を起動した後。
サーバーにログインする際に、サーバー名やポート番号などの他の接続情報は login コマンドで指定できます。

例10.1 指定のサーバーへのログイン

これにより、CLI に接続され、ポート 70443 経由で 192.168.1.100 の JBoss ON サーバーにログインします。ポート番号は 443 で終わるため、CLI は SSL 経由で自動的に接続を試みます。
rhq-cli.sh -u rhqadmin -p rhqadmin -s 192.168.1.100 -t 70443

例10.2 パスワードのプロンプト

パスワードをクリアテキストで送信する代わりに、サーバープロンプトでパスワードを指定することができます。これは、ローカルホストのサーバーに接続する場合に必要になる可能性がありますが、ターゲット JBoss ON サーバーが異なるシステムに接続する場合に便利です。
rhq-cli.sh -u rhqadmin -P

10.2. リソースプロキシーの使用

JBoss ON CLI は、リソースオブジェクトを処理するリモート API を介して JBoss ON サーバーと直接対話し、検索などのタスクのドメイン API を介して直接対話します。
JBoss ON CLI 自体は、一般的な操作を実行しやすい別の API レイヤーを提供します。CLI は CLI で リソースプロキシーオブジェクトを 作成し、オブジェクトが利用可能なクラスを使用できます。 ProxyFactory リモートおよびドメイン API と対話する。
注意することが、プロキシーリソースがリモートおよびドメイン API を引き続き使用していることです。プロキシー API は、多くの操作をスクリプト作成しやすい リモートおよびドメイン API 上 に単純で明確な API を提供します。
注記
The ProxyFactory は、対話モードで JBoss ON CLI を使用するか、スクリプトファイルを使用する場合に使用できます。これは、アラートに使用されるスクリプトなど、サーバースクリプトでも利用できます。
The ProxyFactory のリソースに関する情報を取得します。 getResource() リソースの ID 番号を指定する方法。
最も簡単なものProxyFactory 現在の監視データや特性、リソース名、利用可能なメトリック、利用可能な操作、コンテンツ情報、子インベントリーなど、指定されたリソースに関する完全なサマリーを返します。すべてのリソースはリソースタイプに依存します。例:
rhqadmin@localhost:7080$ ProxyFactory.getResource(10001)
ResourceClientProxy_$$_javassist_0:
                               OSName: Linux
                            OSVersion: 2.6.32-220.4.1.el6.x86_64
                         architecture: x86_64
                             children:
                         contentTypes: {rpm=RPM File}
                          createdDate: Mon Feb 06 11:24:50 EST 2012
                          description: Linux Operating System
                     distributionName: Red Hat Enterprise Linux Server
                  distributionVersion: release 6.2 (Santiago)
                           freeMemory: 16.7GB
                        freeSwapSpace: 25.6GB
                              handler:
                             hostname: server.example.com
                                   id: 10001
                                 idle: 70.8%
                         measurements: [Wait Load, Used Memory, System Load, Distribution Version, Total Memory, OS Name, Free Memory, Hostname, Architecture, Distribution Name, Idle, Total Swap Space, Used Swap Space, User Load, OS Version, Free Swap Space]
                         modifiedDate: Mon Feb 06 11:24:50 EST 2012
                                 name: server.example.com
                           operations: [viewProcessList, cleanYumMetadataCache, manualAutodiscovery]
                  pluginConfiguration:
        pluginConfigurationDefinition: ConfigurationDefinition[xml:id=10009, name=Linux]
                         resourceType: Linux
                           systemLoad: 0.0%
                          totalMemory: 23.5GB
                       totalSwapSpace: 25.6GB
                           usedMemory: 6.8GB
                        usedSwapSpace: 0.0B
                             userLoad: 15.8%
                              version: Linux 2.6.32-220.4.1.el6.x86_64
                             waitLoad: 0.0%
リソースを完全に管理するには、 ProxyFactory リソースプロキシーオブジェクトを作成します。

例10.3 プラットフォームプロキシーリソースの定義

var rhelServerOne = ProxyFactory.getResource(10001)
リソースプロキシーで使用できる方法は、リソースタイプとリソース自体の設定によって異なります。リソースプロキシーで実行できる主な操作には 5 つのタイプがあります。
  • リソースの基本情報(子など)の表示
  • 測定情報の取得
  • 操作の実行
  • リソースおよびプラグイン設定の変更
  • コンテンツの更新および取得
各リソースタイプについて、メソッドが公開され、リソースに関する特定の情報を見つけ、使用できます。さらに、プロキシー API には、監視情報の取得などの一般的なリモート API タスクを実行するためにパラメーターを使用せずに 1 つのキーワードメソッドを提供する「shortcuts」が含まれています。
一般的なリソースタイプのプロキシー API はに記載されてい 「プロキシーリソースに使用できる方法」 ます。
ヒント
インタラクティブ CLI でタブ補完を使用して、リソースタイプに使用できる特定の方法を検索するか、個別のメソッドのメソッド署名を取得します。

例10.4 リソースの表示

ProxyFactory すべてのプロキシーオブジェクトにメソッドがあります。。プロキシーリソースの子をすべて表示します。
var rhelServerOne = ProxyFactory.getResource(10001)

rhqadmin@localhost:7080$ platform.children
Array of org.rhq.bindings.client.ResourceClientProxy
[10027] Bundle Handler - Ant (Ant Bundle Handler::AntBundlePlugin)
[10026] CPU 6 (CPU::Platforms)
[10025] CPU 0 (CPU::Platforms)
[10024] CPU 5 (CPU::Platforms)
[10023] CPU 1 (CPU::Platforms)
[10022] CPU 4 (CPU::Platforms)
[10021] CPU 2 (CPU::Platforms)
[10020] CPU 3 (CPU::Platforms)
[10019] CPU 7 (CPU::Platforms)
[10018] /boot (File System::Platforms)
[10017] / (File System::Platforms)
[10016] /dev/shm (File System::Platforms)
[10015] /home (File System::Platforms)
[10014] eth1 (Network Adapter::Platforms)
[10013] eth2 (Network Adapter::Platforms)
[10012] eth0 (Network Adapter::Platforms)
[10011] lo (Network Adapter::Platforms)
[10004] postgres (Postgres Server::Postgres)
[10003] AS server.example.com RHQ Server (JBossAS Server::JBossAS)
[10002] RHQ Agent (RHQ Agent::RHQAgent)

例10.5 リソースメトリクスの表示

ProxyFactory リソースタイプの個別の測定に対して、ショートカットメトリックのセットを提供します。これは、 findLiveData() リモート API のメソッドは、簡単にモニタリング情報を取得でき、利用可能なメトリクスを特定する方が簡単です。
単一の測定値を取得するには、そのリソースタイプに方法を使用します。(タブ補完を使用してプロキシーオブジェクトのすべてのメソッド一覧を取得します。)
var jbossas = ProxyFactory.getResource(14832)
	
rhqadmin@localhost:7080$ jbossas.JVMTotalMemory
Measurement:
                name: JVM Total Memory
        displayValue: 995.3MB
	description: The total amount of memory currently available in the app server JVM for current and fut...
アイコンは、を使用して現在の値を持つメトリクスの一覧を取得するだけです。 measurements 方法:
var rhelServerOne = ProxyFactory.getResource(10001)

rhqadmin@localhost:7080$ rhelServerOne.measurements
Array of org.rhq.bindings.client.ResourceClientProxy$Measurement
name                 displayValue                         description
-----------------------------------------------------------------------------------------------------------------------
Wait Load            0.0%                                 Percentage of all CPUs waiting on I/O
Used Memory          6.3GB                                The total used system memory
System Load          0.0%                                 Percentage of all CPUs running in system mode
Distribution Version release 6.2 (Santiago)               version of the Linux distribution
Total Memory         31.4GB                               The total system memory
OS Name              Linux                                Name that the operating system is known as
Free Memory          25.2GB                               The total free system memory
Hostname             server.example.com                   Name that this platform is known as
Architecture         x86_64                               Hardware architecture of the platform
Distribution Name    Red Hat Enterprise Linux Server      name of the Linux distribution
Idle                 92.6%                                Idle percentage of all CPUs
Total Swap Space     33.6GB                               The total system swap
Used Swap Space      0.0B                                 The total used system swap
User Load            16.7%                                Percentage of all CPUs running in user mode
OS Version           2.6.32-220.4.2.el6.x86_64            Version of the operating system
Free Swap Space      33.6GB                               The total free system swap
16 rows

例10.6 プロキシーでの操作の実行

ProxyFactory リソースで利用可能なすべての操作には、ショートカットメソッドがあります。
まず、operations メソッドを使用して、リソース種別で利用可能な操作のリストを取得します。
var rhelServerOne = ProxyFactory.getResource(10001)

rhqadmin@localhost:7080$ rhelServerOne.operations
Array of org.rhq.bindings.client.ResourceClientProxy$Operation
name                  description
-----------------------------------------------------------------------------------------------------------------------
viewProcessList       View running processes on this system
cleanYumMetadataCache Deletes all cached package metadata
manualAutodiscovery   Run an immediate discovery to search for resources
3 rows
次に、指定の操作メソッドを実行します。
rhqadmin@localhost:7080$ rhelServerOne.viewProcessList();
Invoking operation viewProcessList
Configuration [11951] - null
  processList [305] {
pid   name                                        size       userTime kernelTime
------------------------------------------------------------------------------------------------------------------
1     init                                        19865600   150      10050
....
26285 httpd                                       214618112  90       80
26286 httpd                                       214618112  90       80
26288 httpd                                       214618112  110      70
26289 httpd                                       214618112  90       80
27357 java                                        4734758912 1289650  373890
30458 postgres                                    218861568  1820     27440
30460 postgres                                    180985856  1210     5330
30462 postgres                                    218984448  13080    42200
30463 postgres                                    218861568  3970     26940
30464 postgres                                    219328512  10600    15320
30465 postgres                                    181407744  18680    78760
30482 httpd                                       185905152  1660     7520
32410 bash                                        108699648  0        10
32420 java                                        6024855552 3890240  669810
305 rows
}

例10.7 設定プロパティーの変更

リソースタイプがリソース設定の編集をサポートする場合や、リソースタイプにプラグイン接続プロパティーがある場合、リソースプロキシーにはメソッドがあります。 editResourceConfiguration() および editPluginConfiguration()それぞれ - それらのプロパティーを編集します。
現在の設定は、を使用して出力できます。 get*Configuration).たとえば、プラグイン設定の場合は以下のようになります。
var rhelServerOne = ProxyFactory.getResource(10001)			 
			 
rhqadmin@localhost:7080$ rhelServerOne.getPluginConfiguration()
Configuration [10793] - null
  metadataCacheTimeout = 1800
  enableContentDiscovery = false
  yumPort = 9080
  enableInternalYumServer = false
  logs [0] {
  }
The edit*Configuration() メソッドを使用すると、すべてのプロパティーを個別に処理し、各値を保持または変更するよう指示する設定ウィザードが表示されます。このプロパティーは、JBoss ON の Web UI が使用する組織に従ってグループ化されます。例:
rhqadmin@localhost:7080$ rhelServerOne.editPluginConfiguration();
Non-Grouped Properties:
Group: Content
enableContentDiscovery[false]:
enableInternalYumServer[false]:
yumPort[9080]:
metadataCacheTimeout[1800]:
Group: Event Logs
[R]eview, [E]dit, Re[V]ert [S]ave or [C]ancel:
...
各グループの後に、変更を元に戻すか、保存するオプションがあります。変更が保存されると、即座に JBoss ON サーバーで更新されます。
キー action
return プロパティーのデフォルトまたは既存の値を選択します。
ctrl-d 設定 UI で unset チェックボックスを選択する場合と同じです。
ctrl-k 設定ウィザードを終了します。
ctrl-e 現在のプロパティーのヘルプの説明を表示します。

例10.8 リソースのコンテンツの管理

リソースの種類によっては、そのリソースに関連するコンテンツがあります。これらは、通常アプリケーションサーバー内の EAR または WAR リソースです。その EAR/WAR リソースに実際に関連付けられる コンテンツファイルは、バッキングコンテンツと呼ば れます。これらは通常 JAR です。
このコンテンツは、リソースから更新またはダウンロードできます。
バッキングコンテンツ(JAR/EAR/WAR ファイルのダウンロード)を取得するには、アプリケーションサーバーでファイル名とファイルパスを指定し ます。例:
var contentResource = ProxyFactory.getResource(14932)
contentResource.retrieveBackingContent("/resources/backup/original.war")
リソースのコンテンツを更新するには、以下を使用します。 updateBackingContent コンテンツとバージョン番号を配置するために、アプリケーションサーバーのパスでファイル名を指定して方法を指定します。例:
contentResource.updateBackingContent("/resources/current/new.war", "2.0")

10.3. コマンドとスクリプト引数を渡す

CLI に接続する場合は rhq-cli.sh、コマンドまたは完全なスクリプトを同時に渡すことができます。CLI は対話モードで接続されるのではなく、指定されたコマンドまたはスクリプトを実行し、終了するため、CLI に接続する非対話的な方法です。

例10.9 変数をサーバーに渡す

1 つのコマンドは、を使用して CLI に渡すことができ -cます。この例では、サーバーは、サーバーのサポートされるすべてのリソースタイプを検索してプリントし、結果を出力します。 resource_types.txt
rhq-cli.sh -u rhqadmin -p rhqadmin -c "pretty.print(ResourceTypeManager.findResourceTypesByCriteria(new ResourceTypeCriteria()))" > resource_types.txt
The ResourceTypeManager.findResourceTypesByCriteria(new ResourceTypeCriteria()) クラスが呼び出されます。 findResourceTypesByCriteria 操作オン ResourceTypeManager.新しい ResourceTypeCriteria オブジェクトは引数として渡されます。
criteria オブジェクトに何も指定されていないため、すべてのリソースタイプが返されます。
pretty は、CLI がコマンドおよびスクリプトで使用できる暗黙的なオブジェクトです。これは、ドメインオブジェクト用に設計された、読み取り可能な表形式でオブジェクトを出力する際に便利です。
この単一コマンドは、インベントリー内のリソースタイプの適切なテキストベースのレポートを提供します。

例10.10 スクリプトの実行

これにより、スクリプトファイルが実行され my_script.jsます。スクリプトの実行が終了すると、CLI はすぐに終了します。
cliRoot/rhq-remoting-cli-4.9.0.JON320GA/bin/rhq-cli.sh -f /export/myScripts/my_script.js

例10.11 スクリプト引数の処理

ほとんどのプログラミング言語に共通する機能として、実行するプログラムに引数を渡す機能があります。Java では、プログラムへのエントリーポイントはクラスの メインメソッド であり、String 配列を引数として取ります。この配列は、プログラムに渡される引数を保持します。同様に、引数は CLI スクリプトに渡すことができます。スクリプトに渡される引数は、暗黙的な args アレイ でアクセスできます。
if (args.length < 2) {
      throw "Not enough arguments!";
      }
      
      for (i in args) {
      println('args[' + i + '] = ' + args[i]);
      }
カスタム args 変数は、CLI スクリプトで明示的に定義されているか、cliRoot/rhq-remoting-cli-4.9.0.JON320GA/samples/modules ディレクトリーのモジュールとして追加されている場合にのみ利用できます。
インデックスベースの引数の従来のスタイルのほかに、名前付き引数をスクリプトに渡すこともできます。
[jsmith@server ~]$ cliRoot/rhq-remoting-cli-4.9.0.JON320GA/bin/rhq-cli.sh -s jon-server.example.com -u rhqadmin -p rhqadmin -t 7080 echo_args.js --args-style=named x=1 y=2
たとえば echo_args.js、は、スクリプトの呼び出し(x および y)でという名前の 2 つのオプションを受け入れるように記述されています。
for (i in args) {
      println('args[' + i + '] = ' + args[i]);
      }
      println('named args...');
      println('x = ' + x);
      println('y = ' + y);
この単純なスクリプトは、指定の x および y の値をエコーします。
args[0] = 1
      args[1] = 2
      named args...
      
      x = 1
      y = 2
以下の点に注意してください。
  • --args-style オプションで名前付き引数を使用することを明示的に指定します。
  • 名前付き引数の値は、暗黙的な args アレイから引き続きアクセスできます。
  • x およびなどの名前付き引数は y、変数としてスクリプトコンテキストにバインドされます。

例10.12 1 つのステートメントの実行

CLI を対話的に実行する場合、で -c オプションを使用する場合と同じように、コマンドを渡して実行でき rhq-cli.shます。
localhost:7080> var x = 1

例10.13 複数ラインステートメントの実行

CLI は Java シェルインタープリターで、マルチラインステートメントを適切に処理できます。同じステートメントの新しい行を指定するには、バックスラッシュ(\)文字を使用します。
localhost:7080(rhqadmin)> for (i = 1; i < 3; ++i) { \
      localhost:7080(rhqadmin)>    println(i); \
      localhost:7080(rhqadmin)> }
      1
      2
      
      localhost:7080(rhqadmin)>

例10.14 スクリプトの実行

ファイルからスクリプトを実行するには、rhq-cli.sh|bat スクリプトに -f オプションを使用します。
この -f オプションは、スクリプトと同じディレクトリーにある場合でも、スクリプトの場所を絶対的に指定する必要があり rhq-cli.sh ます。CLI は、相対パスのみを持つスクリプトを見つけることはありません。
[jsmith@server ~]$ cliRoot/rhq-remoting-cli-4.9.0.JON320GA/bin/rhq-cli.sh -u rhqadmin -p rhqadmin -s jon-server.example.com -t 7080 -f /absolute/path/to/myscript.js

例10.15 引数を使用したスクリプトの実行

スクリプトは、引数を受け入れるか、または必要とするように記述できます。詳細はを参照してください 「CLI スクリプトの引数とその他のパラメーターの定義」。インデックス化された引数は、JavaScript ファイルで指定されているように適切な順序で指定することで簡単に渡すことができます。
[jsmith@server ~]$ cliRoot/rhq-remoting-cli-4.9.0.JON320GA/bin/rhq-cli.sh -u rhqadmin -p rhqadmin -s jon-server.example.com -t 7080 -f /absolute/path/to/myscript.js 1 2 3

例10.16 名前付き引数でのスクリプトの実行

スクリプト引数はインデックス化または名前を付けることができます。
[jsmith@server ~]$ cliRoot/rhq-remoting-cli-4.9.0.JON320GA/bin/rhq-cli.sh -u rhqadmin -p rhqadmin -s jon-server.example.com -t 7080 --args-style=named -f /absolute/path/to/myscript.js x=1 y=2 y=3

10.4. Pretty-Print 出力の表示

JBoss ON CLI には JBoss ON の情報をテーブル形式の出力にフォーマットする特別なクラスがあります。このクラス(TabularWriter)は、すべての CLI コマンドに暗黙的であるため、ほとんどすべての出力は自動的にフォーマットされます。このクラスは、pretty と呼ばれる暗黙的な変数としても利用できます。これは、スクリプトを作成する際に便利です。
例:
rhqadmin@localhost:7080$ criteria = ResourceCriteria()
    rhqadmin@localhost:7080$ criteria.addFilterResourceTypeName('service-alpha')
    rhqadmin@localhost:7080$ criteria.addFilterParentResourceName('server-omega-0')
    rhqadmin@localhost:7080$ resources = ResourceManager.findResourcesByCriteria(criteria)
    id    name            version resourceType
    ------------------------------------------------
    11373 service-alpha-8 1.0     service-alpha
    11374 service-alpha-1 1.0     service-alpha
    11375 service-alpha-0 1.0     service-alpha
    11376 service-alpha-4 1.0     service-alpha
    11377 service-alpha-2 1.0     service-alpha
    11378 service-alpha-3 1.0     service-alpha
    11379 service-alpha-5 1.0     service-alpha
    11380 service-alpha-9 1.0     service-alpha
    11381 service-alpha-6 1.0     service-alpha
    11382 service-alpha-7 1.0     service-alpha
    10 rows
pretty ドメイン(org.rhq.core.domain)パッケージで定義されたオブジェクトのフォーマット。
出力を出力すると、読み書きがはるかに低くなります。
rhqadmin@localhost:7080$ println(resources)
    PageList[Resource[id=11373, type=service-alpha, key=service-alpha-8, name=service-alpha-8, version=1.0],
    Resource[id=11374, type=service-alpha, key=service-alpha-1, name=service-alpha-1, version=1.0], 
    .... 8< ....
単一オブジェクトの場合pretty サマリー情報(@Summary)をチェックし、情報のサブセットのみを表示します。その後、単一オブジェクトの概要情報がフォーマットされたリストとして出力されます。例:
rhqadmin@localhost:7080$ pretty.print(resources.get(0))
    Resource:
    id: 11373
    name: service-alpha-8
    version: 1.0
    resourceType: service-alpha

10.5. 出力のエクスポート

export は、出力を指定されたファイルに書き込むもう 1 つの暗黙的なスクリプト変数です。exporter 使用方法 pretty.print インタラクティブ表示で使用されるテーブル形式のフォーマットに一致するプレーンテキストファイルにすべての情報を出力するには、以下を実行します。
rhqadmin@localhost:7080$ exporter.setTarget('raw', 'output.txt')
    rhqadmin@localhost:7080$ exporter.write(resources)
ファイルを開く、または閉じるなどのファイル IO 操作は問題にはなりません。 exporter IO 操作を処理します。
チェル、exporter raw リソースまたは他の情報を CSV ファイルに書き込むことができます。
rhqadmin@localhost:7080$ exporter.setTarget('csv', 'output.csv')
    rhqadmin@localhost:7080$ exporter.write(resources)

第11章 CLI の使用に関するヒント

JBoss ON CLI スクリプトを使用すると、検出されたリソースをインポートして複雑な管理操作を実行し、設定のドリフトまたは Web アプリケーションのアップグレードをスケジュールするだけでタスクを自動化できます。
JBoss ON CLI には、スクリプトの開発にインタラクティブに使用したり、タスク自動化を支援するシステムツールと統合したり、より多用途でリアルタイムのアプリケーション向けにカスタム関数を作成したりできます。

11.1. タブ Complete の使用

インタラクティブモードでは、JBoss ON CLI はドメイン API および JBoss ON リモート API の暗黙的な変数(7章JBoss ON API での利用可能なインプリシット変数)と、特定の CLI コマンドおよびメソッド(8章JBoss ON CLI に固有するメソッド)を認識します。CLI を対話的に実行すると、Tab complete を使用してこれらのメソッドを入力できます。
クラスの一部に入力すると、一致するクラス(または一致する場合はコマンド)が一覧表示されます。例:
[jsmith@server bin]# ./rhq-cli.sh -u rhqadmin -p rhqadmin
  RHQ Enterprise Remote CLI 3.3
  Remote server version is: 3.3 (2484565)
  Login successful
  rhqadmin@localhost:7080$ Resource

  ResourceFactoryManager   ResourceGroupManager     ResourceManager
  ResourceTypeManager

  rhqadmin@localhost:7080$ ex

  exporter   exec
クラスを選択すると、そのクラスのメソッド Tab がすべてヒットされます。
rhqadmin@localhost:7080$ ResourceManager.

  availabilitySummary           disableResources
  enableResources               findChildResources
  findResourceLineage           findResourcesByCriteria
  getAvailabilitySummary        getLiveResourceAvailability
  getParentResource             getResource
  getResourcesAncestry          liveResourceAvailability
  parentResource                resource
  toString                      uninventoryResources
  updateResource
ヒットを Tab 2 回入力すると、完全なメソッド署名が出力されます。
rhqadmin@localhost:7080$
  
           List<Integer> enableResources(GenericArrayTypeImpl[int])
           Resource updateResource(Resource resource)
           List<Integer> uninventoryResources(GenericArrayTypeImpl[int] resourceIds)
	   ResourceAvailabilitySummary getAvailabilitySummary(int resourceId)
           PageList<Resource> findChildResources(int resourceId, PageControl pageControl)
           Map<Integer,String> getResourcesAncestry(GenericArrayTypeImpl[Integer] resourceIds, ResourceAncestryFormat format)
           List<Integer> disableResources(GenericArrayTypeImpl[int])
           List<Resource> findResourceLineage(int resourceId)
	   ResourceAvailability getLiveResourceAvailability(int resourceId)
           PageList<Resource> findResourcesByCriteria(ResourceCriteria criteria)
           Resource getResource(int resourceId)
           String toString()
	   Resource getParentResource(int resourceId)
AutoComplete は、暗黙的に利用できるメソッドまたはオブジェクトの検索、基準ベースの検索(基準の選択が簡単)、およびサーバースクリプトの開発に非常に便利です。

11.2. CLI の対話およびファイルとの相違点

スクリプトは、-f オプションを使用してスクリプトファイルを CLI に直接入力するか(インタラクティブモードで)、または CommonJS モジュールスクリプトで関数を定義して、CLI で実行できます。
ファイルにインタラクティブに入力されたスクリプトとスクリプトは、サブセットが同じで、例外があります。インタラクティブモードでは、CLI には一連のコマンド(「インタラクティブな CLI コマンド」)があります。これらのコマンドは CLI の一部で、コマンドのほとんどは対話モードで のみ 利用できます。これらのコマンドは、参照されたスクリプトファイル内で参照できません。
  • quit(CLI を終了する)
  • record
login コマンドおよび logout コマンドは直接利用できませんが、ログインおよびログアウト機能はスクリプト内で使用できます。
rhq.login('rhqadmin', 'rhqadmin');

  rhq.logout();
GUI、CLI、およびアラートスクリプトの違いと同様に、コンテキストの問題です。CLI 定義のコマンドのほとんどは、入力されたコマンドの記録など、インタラクティブな環境でのみ有効です。インタラクティブなコンテキスト以外では、他の Java メソッドを使用する必要があります。

11.3. リソースタイプおよびバージョン間の API の相違点

JBoss ON のオブジェクト構造を覚えることが重要なのは、各リソースタイプが独自のプラグイン記述子で個別に定義されることです。(単一のプラグイン記述子では複数のリソースタイプを使用でき、これらはすべて親リソースタイプと子リソースタイプとして関連します。)
各リソースタイプには、ソフトウェアアプリケーションを反映する管理 API が異なります。Tomcat サーバーは Postgres データベースとは異なるため、メトリクス、操作、設定プロパティーが異なります。リソースの停止や起動などの一般的な特性は、リソースタイプ記述子によって異なります。Tomcat には正常に停止する操作があります(データベースまたはほとんどのサービスでは必要ありません)。一方、JBoss AS 5 サーバーは停止され、1 つのステップで再起動せずに別のタスクとして開始されます。
エージェントプラグインは、アプリケーションやサービスだけでなく、そのアプリケーションやサービスのバージョンによってもリソースタイプを定義します。EJB リソースは、定義が異なる EJB3 リソースとは異なります。
この違い - 同じアプリケーションの異なるバージョンを異なるリソース種別として扱われることが、特にサーバーリソースにとって特に重要になります。
リソースタイプが異なると、設定プロパティーと操作を使用できます。これにより、このようなリソースを管理するために作成された CLI スクリプトに影響する可能性があります。たとえば、JBoss AS 5 リソース用に作成されたスクリプトは、異なるリソースに API が異なるため、JBoss AS 4 または JBoss AS 7 リソースでは機能しない場合があります。
異なるバージョンのサーバーに使用されるスクリプトを作成する場合は、まずリソースタイプを特定してから適切なメソッドを呼び出す CLI スクリプトを作成します。

11.4. 利用可能なユーティリティーとサンプルスクリプト

検索結果の解析、バンドルのデプロイ、またはドリフトの管理を行うための簡単な関数など、追加機能を提供するスクリプトがいくつか提供されます。この ユーティリティースクリプト は、具体的なタスクを実行せずに関数を追加します。これらは、カスタムスクリプトの参照および拡張の参照として利用できます。これらのサンプル関数は、のようにスクリプトファイルにコピーすることも、スクリプトの実行前にロードすることもでき 「スクリプト依存関係とエクスポート機能について」 ます。
いくつかのスクリプトを使用して、(参照用または使いやすさのため)追加機能を提供し、実行時に管理タスクを実行することもできます。このスクリプトは、カスタムスクリプトを作成せずにリソースを管理するために直接使用できます。
重要
ユーティリティーおよびサンプルスクリプトは広範囲にテストされておらず、リリース間で更新されない可能性があります。これらは利便性のためと、実際に使用するサーバースクリプトの完全な例に含まれます。
ご使用の環境内の品質と一貫性のために、これらのスクリプトをテストします。

表11.1 ユーティリティーおよびサンプルスクリプト

script description location
CommonJS モジュールユーティリティースクリプト
util.js
オブジェクトの配列を使用して繰り返し処理する検索関数を定義します。foreach)をクリックし、最初に一致するオブジェクト(find)または、一致するすべてのオブジェクトを返します(findAll).また、情報を JavaScript ハッシュから JBoss ON 設定オブジェクトへ変換する機能も含まれています。
samples/util.js スクリプトと同じですが、CommonJS モジュールとして記述されます。
cliRoot/rhq-remoting-cli-4.9.0.JON320GA/samples/modules/
bundles.js
バンドルの作成およびデプロイ、バンドル宛先の作成、リソースのサポートされるベースディレクトリーへの情報の取得などを行う関数を定義します。
samples/bundles.js スクリプトと同じですが、CommonJS モジュールとして記述されます。
cliRoot/rhq-remoting-cli-4.9.0.JON320GA/samples/modules/
drift.js
スナップショットの作成および配布、定義を取得し、リソースまたは特定ファイルの履歴を表示する関数を定義します。
samples/drift.js スクリプトと同じですが、CommonJS モジュールとして記述されます。
cliRoot/rhq-remoting-cli-4.9.0.JON320GA/samples/modules/
jbossas.js
Web アプリケーションのデプロイや EAP クラスターの管理など、EAP 6 / AS 7 リソースを管理する複数の機能を定義します。
CommonJS モジュールとして組み合わせ、記述された samples/deploy-to-and-restart-JBAS.js samples/add-as7-standalone-server-to-cluster.js スクリプトはおよびスクリプトと同じです。
cliRoot/rhq-remoting-cli-4.9.0.JON320GA/samples/modules/
ユーティリティースクリプト
util.js オブジェクトの配列を使用して繰り返し処理する検索関数を定義します。foreach)をクリックし、最初に一致するオブジェクト(find)または、一致するすべてのオブジェクトを返します(findAll).また、情報を JavaScript ハッシュから JBoss ON 設定オブジェクトへ変換する機能も含まれています。 cliRoot/rhq-remoting-cli-4.9.0.JON320GA/samples/
measurement_utils.js メトリックスケジュールを有効または無効にする関数を定義します。 cliRoot/rhq-remoting-cli-4.9.0.JON320GA/samples/
bundles.js バンドルの作成およびデプロイ、バンドル宛先の作成、リソースのサポートされるベースディレクトリーへの情報の取得などを行う関数を定義します。 cliRoot/rhq-remoting-cli-4.9.0.JON320GA/samples/
drift.js スナップショットの作成および配布、定義を取得し、リソースまたは特定ファイルの履歴を表示する関数を定義します。 cliRoot/rhq-remoting-cli-4.9.0.JON320GA/samples/
サンプルスクリプト
add-as7-standalone-server-to-cluster.js 指定された AS 7 をクラスターに追加する一連の関数を定義します。 cliRoot/rhq-remoting-cli-4.9.0.JON320GA/samples/
deploy-to-and-restart-JBAS.js 新しいコンテンツを EAP サーバーにデプロイし、既存のコンテンツを更新する 2 つの機能を定義します。適切な変数を設定すると、このスクリプトを直接実行してコンテンツをデプロイし、指定のアプリケーションサーバーを再起動することができます。 cliRoot/rhq-remoting-cli-4.9.0.JON320GA/samples/
fix-bundle-deployment.js バンドルデプロイメントを指定されたバージョンに戻すサーバー側のアラートスクリプトの例。 serverRoot/jon-server-3.3/jbossas/server/default/deploy/rhq.ear/rhq-downloads/cli-alert-scripts/

11.5. カスタム関数の定義

カスタム機能は、適切に構造化され、JBoss ON のリモート API に準拠している限り、CLI スクリプトでは許容され、サポートされます。

11.6. Cron を使用したスクリプトの実行スケジュール

管理者は、データベースのパフォーマンスを改善するために古いバンドルバージョンを削除する場合や、新しく検出されたリソースをインベントリーに自動的に追加するなど、JBoss ON システムで定期的なメンテナンスを実行するスクリプトを作成する場合があります。
スクリプトは、簡単な cron ジョブを使用して JBoss ON CLI で実行できます。たとえば、管理者が検出されたリソース import.js をインベントリーに自動的に追加し、毎日実行するように書き込みます。
vim /etc/cron.daily/rhq-cli

#!/bin/sh
# run JON CLI every morning to import new resources
cliRoot/rhq-remoting-cli-4.9.0.JON320GA/bin/rhq-cli.sh -u rhqadmin -p rhqadmin -f /export/scripts/import.js
cron を使用したジョブのスケジュール設定の詳細は、crontab の man ページを参照してください

11.7. Wrapper スクリプトの使用

最終的に、JBoss ON CLI スクリプトは通常の JavaScript ファイルです。簡素化やプログラミングを容易にするため、それぞれ異なるタスクを実行するか、または異なるリソースタイプに対して実行するスクリプトを多数記述できます。
この一連のスクリプトはラッパースクリプトで制御できます。シンプルなシェルスクリプトを使用すると、JBoss ON CLI スクリプトをよりユーザーフレンドリーに実行したり(優れたインターフェースを提供)したり、特定のリソースを管理する変数を渡すことが容易になります。
のラッパースクリプトを使用する簡単な例があり 18章例: グループ化されたサーバーの管理(JBoss EAP 5) ます。

11.8. JBoss ON ユーザーの権限と設定

ログイン時または rhq.login メソッド経由の CLI スクリプトはすべて JBoss ON ユーザーによって JBoss ON サーバーで実行されます。
JBoss ON CLI では、JBoss ON CLI スクリプトによってリソースに対するアクセス制御が強制されます。つまり、スクリプトのユーザーは、指定の操作を実行するために GUI ユーザーと同じ認可要件を満たす必要があります。
さらに、CLI スクリプトを実行するユーザーは、ユーザーとして JBoss ON に すでに存在している 必要があります。JBoss ON サーバーが LDAP ユーザーを作成するよう設定されている場合、これらのユーザーは JBoss ON の Web UI に最初にログインしたときに自動的に作成されます。CLI でログインすると、同じアカウントの作成は行われません。そのため、LDAP ユーザーは JBoss ON CLI を実行する前に Web UI にログインする必要があります。

第12章 短い例

CLI スクリプトは、イベントの特定のフローに従います。リソースやオブジェクトの検索、オペレーションの実行など、そのワークフロー内の各機能要素は、リモート API に独自のクラスを持ちます。
JBoss ON CLI スクリプトのほとんどのアクションは繰り返し可能です。プラットフォームの検索を実行するか、メトリックのライブデータを取得する部分は、CLI スクリプトで非常に似ています。
本セクションでは、1 つの特定の機能タスクを実行する基本的な例を紹介します。これらのスクリプトサンプルは、大規模なスクリプトワークフローで一貫して使用でき、タスク自動化の一部として使用できます。

12.1. 検索

すべてのオブジェクトマネージャーは、データ取得の操作を定義します。ほとんどのマネージャーはデータ取得の 基準ベース の操作を定義します。つまり、検索は JBoss ON オブジェクト内の属性を基にできます。
基準ベースの検索には、フォームにメソッドが含まれる findオブジェクトByCriteriaそのため、リソース find メソッドは以下のようになります。 findResourcesByCriteria グループの検索方法は findResourceGroupsByCriteria.
検索は、対応する JPA-QL クエリーに変換されます。
org.rhq.core.domain.criteria パッケージに存在する基準クラス。

12.1.1. 基本検索基準の設定

最も簡単な基準は、追加の検索パラメーターを使用せずに、リソースタイプなどのものに基づいて結果を定義することです。
たとえば、リソースタイプや ID で制限するフィルターがないため、これによりインベントリー内のコミットされたリソースがすべて取得されます。
rhqadmin@localhost:7080$ var criteria = new ResourceCriteria() // this sets the criteria to use for the search
rhqadmin@localhost:7080$ criteria.clearPaging() // this clears the 200 item page size to return all entries
rhqadmin@localhost:7080$ var resources = ResourceManager.findResourcesByCriteria(criteria) // this actually runs the search
rhqadmin@localhost:7080$ pretty.print(resources) // this prints the search results
id    name   versio curren resour
-------------------------------------------------------------------------------
10001 server Linux  UP     Linux
10002 server AS 4.2 UP     JBossA
10392 full-h        UP     Profil
10014 AlertH        UP     EJB3 S
10015 Adviso        UP     EJB3 S
10016 DataAc        UP     EJB3 S
10017 Affini        UP     EJB3 S
10011 Access        UP     Access
10391 ha            UP     Profil
...8<...
Which findResourcesByCriteria() は、検索を実行するもの、 pretty.print 結果を表示するには、メソッドが必要です。
この基本基準検索は、以下の JPA-QL クエリーに変換されます。
SELECT r
FROM Resource r
WHERE ( r.inventoryStatus = InventoryStatus.COMMITTED

12.1.2. ソートの使用

基本的な検索基準を調整して、リソースの結果をプラグインでソートできるようにします。
ソートを追加するには、呼び出します。 criteria.addSortPluginName().ソート基準には、フォームにメソッドが含まれる AddSortXXX(PageOrdering order).
例:
rhqadmin@localhost:7080$ var criteria = new ResourceCriteria() 
rhqadmin@localhost:7080$ criteria.addSortPluginName(PageOrdering.ASC) // adds a sort order to the results
rhqadmin@localhost:7080$ resources = ResourceManager.findResourcesByCriteria(criteria)
この基準は以下の JPA-QL クエリーに変換されます。
SELECT r
FROM Resource r
WHERE ( r.inventoryStatus = InventoryStatus.COMMITTED )
ORDER BY r.resourceType.plugin ASC

12.1.3. フィルターの使用

この例のリソース名など、追加の一致する基準を追加すると、検索結果をさらに絞り込むことができます。フィルタリングをすべての基準に追加するには、フォームのメソッドを使用します。 addFilterXXX().
rhqadmin@localhost:7080$ var criteria = new ResourceCriteria() 
rhqadmin@localhost:7080$ criteria.addFilterResourceTypeName('JBossAS Server') // a search filter
rhqadmin@localhost:7080$ resources = ResourceManager.findResourcesByCriteria(criteria)
結果として、JPA-QL クエリーは以下のようになります。
SELECT r
FROM Resource r
WHERE ( r.inventoryStatus = InventoryStatus.COMMITTED
AND LOWER( r.resourceType.name )  like 'JBossAS Server' ESCAPE '\\' )
このコードはインベントリー内のすべての JBoss サーバーを取得します。1 つの検索で使用するフィルターが複数になる可能性があります。たとえば、特定のエージェントによって登録された JBoss サーバーを検索します。
rhqadmin@localhost:7080$ var criteria = new ResourceCriteria()
rhqadmin@localhost:7080$ criteria.addFilterResourceTypeName('JBossAS Server')
rhqadmin@localhost:7080$ criteria.addFilterAgentName('localhost.localdomain')
rhqadmin@localhost:7080$ resources = ResourceManager.findResourcesByCriteria(criteria)
これにより、以下の JPA-QL クエリーが生成されます。
SELECT r
FROM Resource r
WHERE ( r.inventoryStatus = InventoryStatus.COMMITTED
AND LOWER( r.agent.name )  like 'localhost.localdomain' ESCAPE '\\' )

12.1.4. 関連付けの取得

関連付け は、親および子リソースの階層を示します。リソースを取得したら、特別な フェッチ メソッドを使用して、関連する親リソースまたは子リソースを表示できます。
指定のサーバーに子リソースがある場合でも、検索後に子の一覧を出力すると失敗します。
...8<...
rhqadmin@localhost:7080$ resource = resources.get(0)
rhqadmin@localhost:7080$ if (resource.childResources == null) print('no child resources')
そのため、1 対多の関連において、レイジーロードがドメインレイヤー全体で使用されます。子リソースは遅延的にロードされるため、子のリストは検索基準でフェッチとして明示的に設定する必要があります。
例:
rhqadmin@localhost:7080$ criteria.addFilterResourceTypeName('JBossAS Server')
rhqadmin@localhost:7080$ criteria.fetchChildResources(true)
rhqadmin@localhost:7080$ resources = ResourceManager.findResourcesByCriteria(criteria)
rhqadmin@localhost:7080$ resource = resources.get(0)
rhqadmin@localhost:7080$ if (resource.childResources == null) print('no child resources'); else pretty.print(resource.childResources)
id  name                               versio resourceType
-----------------------------------------------------------
222 AlertManagerBean                   EJB3 Session Bean
222 SchedulerBean                      EJB3 Session Bean
222 AlertDefinitionManagerBean         EJB3 Session Bean
222 AlertConditionConsumerBean         EJB3 Session Bean
222 PartitionEventManagerBean          EJB3 Session Bean
...8<...
この出力は、その出力によって異なります。これらは JBoss ON サーバーの子リソースです。生成される JPA-QL クエリーは以下のようになります。
SELECT r
FROM Resource r
LEFT JOIN FETCH r.childResources
WHERE ( r.inventoryStatus = InventoryStatus.COMMITTED
AND LOWER( r.resourceType.name )  like 'JBossAS Server' ESCAPE '\\' )

12.1.5. ページサイズの設定

ほとんどの検索では、ページ化された結果のリストが返されます。デフォルトでは、ページ化された結果は 200 エントリーに制限されます。たとえば、インベントリーのすべてのリソースを返そうとすると、最初の 200 リソースのみが返されますが、データベースを直接クエリーすると、複数のリソースが返される可能性があります。
The 条件 クラスは、検索結果のページサイズを制御するために使用できるメソッドを定義します。

例12.1 ページサイズの消去

200 を超える結果がある場合は、一致するすべてのリソースを 1 つの結果セットに含める必要がある場合は、ページ制限を以下で消去することができます。 clearPaging
var criteria = new ResourceCriteria()
criteria.clearPaging()
var resources = ResourceManager.findResourcesByCriteria(criteria)

例12.2 ページサイズの設定

異なるページ制限を使用する必要がある場合がありますが、明確さや制御のために、ページングを有効にする必要があります。
The setPaging method は、指定の検索のページ数とページサイズを設定します。通常、ページは 1 つのみであるため、ページ番号は 0 に設定され、必要に応じてページサイズをリセットできます。
rhqadmin@localhost:7080$ var criteria = new ResourceCriteria()

rhqadmin@localhost:7080$ criteria.getPageSize()
200

rhqadmin@localhost:7080$ criteria.getPageNumber()
0

rhqadmin@localhost:7080$ criteria.setPaging(0,300)

rhqadmin@localhost:7080$ var resources = ResourceManager.findResourcesByCriteria(criteria)
id    name                                          currentAvailability resourceType
------------------------------------------------------------------------------------------------------------------
10032 RHQDS                                         UP                Datasource
10033 ResourceFactoryManagerBean                    UP                EJB3 Session Bean
10034 CoreTestBean                                  UP                EJB3 Session Bean
10035 rhq-postinstaller.war (//localhost/installer) UP                Web Application (WAR)
10036 ResourceMetadataManagerBean                   UP                EJB3 Session Bean
10037 SystemInfoManagerBean                         UP                EJB3 Session Bean
10105 wstools.sh                                    UP                Script
10038 PartitionEventManagerBean                     UP                EJB3 Session Bean
10039 CallTimeDataManagerBean                       UP                EJB3 Session Bean
10040 AlertDefinitionManagerBean                    UP                EJB3 Session Bean
10041 DiscoveryTestBean                             UP                EJB3 Session Bean
10123 wsconsume.sh                                  UP                Script
10042 ROOT.war (//localhost/)                       UP                Web Application (WAR)
10044 AlertManagerBean                              UP                EJB3 Session Bean
10045 AgentManagerBean                              UP                EJB3 Session Bean
... 8< ...
300 rows

12.2. オブジェクトの JBoss ON ID の取得

JBoss ON のすべてのリソース、設定プロパティー、バンドルアーカイブ、テンプレート、アラート、すべては一意の ID 番号で識別されます。これらの ID 番号のほとんどは、そのオブジェクトの詳細ページに移動する URL の一部として Web UI に表示されます。
すべての ID が簡単に見つかった訳ではありません。たとえば、メトリクステンプレートの検索にはリソースタイプ ID が必要ですが、リソースタイプ ID は検索が困難です。
他のインスタンスでは、複数のリソースに対してスクリプトを実行することもできます。つまり、スクリプトを作成する際に明示的に認識されないリソース ID が複数あることを意味します。
リソース(「検索」)を検索すると、その ID を含むリソースの詳細を取得します。
rhqadmin@localhost:7080$ criteria = new ResourceCriteria();
  ResourceCriteria:
  inventoryManagerRequired: false
  persistentClass: class org.rhq.core.domain.resource.Resource

  rhqadmin@localhost:7080$ criteria.addFilterResourceTypeName('Linux')

  rhqadmin@localhost:7080$ ResourceManager.findResourcesByCriteria(criteria);
  one row
  Resource:
  id: 10001
  name: gs-dl585g2-01.rhts.eng.bos.redhat.com
  version: Linux 2.6.32-220.el6.x86_64
  currentAvailability: UP
  resourceType: Linux
これはいずれでも当てはまります。 *criteria 検索します。ID が明示的に表示されない場合でも、オブジェクトの ID が検索されます。
この ID は他の操作で使用できます。
rhqadmin@localhost:7080$ var metrics = MeasurementDataManager.findLiveData(resources.get(0).id, [mdefs.get(0).id]);

12.3. 単一および複数リソースのデータの取得

操作または関数を実行すると、その操作(データ)から別の関数に結果をプルする必要があります。
たとえば、以下は、data 変数の結果をエクスポートおよび書き込みします。
exporter.write(data.get(0))
を使用し get(0) て、返された最初のオブジェクトを取得します。
スクリプトの次のステップで使用する可能性があるオブジェクトが多数返される場合があります。また、複数の異なる方法で処理する方法がいくつかあります。
ではなく、の 1 つのオプションは get(0)、リストの各オブジェクトで段階的に機能することです。たとえば、これにより、リソースのメトリック定義(i)のデータを取得します。

例12.3 get(i)

if( mdefs != null ) {
  if( mdefs.size() > 1 ) {
     for( i =0; i < mdefs.size(); ++i) {
          mdef = mdefs.get(i);
          var data = MeasurementDataManager.findDataForResource(resources.get(0).id,[mdef.id],start,end,1)

	  exporter.write(data.get(0));
     }
  }
  ...8<...
他のオブジェクトをアレイに送信し、そのアレイの各オブジェクトに対して操作またはタスクを実行できます。この例では、すべての JBoss AS 5 サーバーを検索し、結果をアレイに送信し、各サーバーで再起動操作を実行します。

例12.4 アレイ

//find the resources
//use a plugin filter to make sure they are all of the same type
criteria = new ResourceCriteria();
criteria.addFilterPluginName('JBossAS5')

var resources = ResourceManager.findResourcesByCriteria(criteria).toArray();
var resType = ResourceTypeManager.getResourceTypeByNameAndPlugin('JBossAS Server', 'JBossAS5');

// go through the array
var idx=0;
var jbossServers = new Array();

for( i in resources ) {
     if( resources[i].resourceType.id == resType.id ) {
          jbossServers[idx] = resources[i];
          idx = idx + 1;     
     }
}

// restart the resources
for( a in resources ) {
     var jboss = ProxyFactory.getResource(jbossServers[a].id);
     jboss.restart()
}
util.js サポートスクリプトには、アレイ、コレクション、マップ、汎用オブジェクトを使用して正しく反復する foreach 関数があります。
複数のオブジェクトを処理するために使用する方法、または複数のオブジェクトを処理する方法は、スクリプトの種類や目的によって異なります。これらは、留意すべきオプションです。

12.4. リソースおよびグループ

12.4.1. コンテンツバックアップリソース(Web アプリケーション)の作成および更新

Web アプリケーション(EAR および WAR)は、コンテンツベースのリソース であり、管理されたリソースとコンテンツパッケージとの間にまたがるリソースです。
CLI スクリプトの実行時に、リソースのコンテンツを取得または作成するために特別に使用できるメソッドがいくつかあります。
コンテンツベースのリソースを作成するには、指定のバージョン番号でファイルをアップロードします。
このスクリプトの手順は以下のとおりです。
  1. コンテンツをアップロードするリソースを検索します。この例では、JBoss AS 5 サーバーを検索します。
  2. サーバーが稼働していることを確認します。コンテンツが正常にデプロイするには、JBoss サーバーを稼働する必要があります。

例12.5 コンテンツバックアップリソースの作成

// fill this information in before running the script
var pathName = '/home/jon/myExampleApp.ear'

var resTypeName = 'JBossAS Server'
var pluginName = "JBossAS5"
var appTypeName = "Enterprise Application (EAR)"

// define a custom function to parse the filename and path info
function PackageParser(pathName) {
    var file = new java.io.File(pathName);
    var fileName = file.getName();
    var packageType = fileName.substring(fileName.lastIndexOf('.')+1);
    var tmp = fileName.substring(0, fileName.lastIndexOf('.'));
    var version = 1;
    var realName = tmp;
    var packageName = fileName;
    
    // parse the package version, only if version is included   
    if(tmp.indexOf('-') != -1){
	realName = tmp.substring(0, tmp.lastIndexOf('-'));
	version = tmp.substring(tmp.lastIndexOf('-') + 1);			
        packageName = realName + "." + packageType;
    }	
	
    this.packageType = packageType.toLowerCase();
    this.packageName = packageName;
    this.version     = version;
    this.realName    = realName;
    this.fileName    = fileName;
}

criteria = new ResourceCriteria();
criteria.addFilterResourceTypeName(resTypeName);
criteria.addFilterPluginName(pluginName);
var resources = ResourceManager.findResourcesByCriteria(criteria);

// create the config options for the new EAR 
var deployConfig = new Configuration();
deployConfig.put( new PropertySimple("deployExploded", "false"));
deployConfig.put( new PropertySimple("deployFarmed", "false"));
 

// stream in the file bytes
var file = new java.io.File(pathName);
var inputStream = new java.io.FileInputStream(file);
var fileLength = file.length();
var fileBytes = java.lang.reflect.Array.newInstance(java.lang.Byte.TYPE, fileLength);
for (numRead=0, offset=0; ((numRead >= 0) && (offset < fileBytes.length)); offset += numRead ) {
    numRead = inputStream.read(fileBytes, offset, fileBytes.length - offset); 	
}

// parse the filename and path info
PackageParser(pathName);

// identifies the type of resource being created
var appType = ResourceTypeManager.getResourceTypeByNameAndPlugin(appTypeName, pluginName);

// create the new EAR resource on each discovered app server
if( resources != null ) {
  for( i =0; i < resources.size(); ++i) {
       var res = resources.get(i);println("res: " + res);
       ResourceFactoryManager.createPackageBackedResource(
           res.id,
           appType.id, 
           packageName,
           null,  // pluginConfiguration
           packageName,
           version,
           null, // architectureId        
           deployConfig,
           fileBytes,
           null // timeout
       );
  }
}
パッケージの更新は若干簡単です。これには、新規ファイルとバージョン番号を既存の EAR リソースに送信する必要があります。

例12.6 コンテンツバックアップリソースの更新

// update this
var fullPathName = '/export/myfiles/updatedApp.ear'

// define a custom function to parse the filename and path info
function PackageParser(pathName) {
    var file = new java.io.File(pathName);
		
    var fileName = file.getName();
    var packageType = fileName.substring(fileName.lastIndexOf('.')+1);
    var tmp = fileName.substring(0, fileName.lastIndexOf('.'));
    var version = 1;
    var realName = tmp;
    var packageName = fileName;
    
    // parse the package version, only if version is included   
    if(tmp.indexOf('-') != -1){
        realName = tmp.substring(0, tmp.lastIndexOf('-'));
        version = tmp.substring(tmp.lastIndexOf('-') + 1);			
        packageName = realName + "." + packageType;
    }	
	
    this.packageType = packageType.toLowerCase();
    this.packageName = packageName;
    this.version     = version;
    this.realName    = realName;
    this.fileName    = fileName;
}

// parse the filename and path info
PackageParser(fullPathName);
                
// search for the JBoss AS 5 server by name
criteria = new ResourceCriteria();
criteria.addFilterName('My JBoss AS 5 Server');
var res = ResourceManager.findResourcesByCriteria(criteria);

var jboss = ProxyFactory.getResource(res.get(0).id);

var children = jboss.children;
for( c in children ) {
    var child = children[c];
    if( child.name == packageName ) {
        child.updateBackingContent(fullPathName,version);
    }
}
コンテンツベースのリソースは、ソフトウェアパッケージ(ソフトウェアパッケージ)であるかのように追加または更新されますが、リソースのように削除されます。
注記
削除は、リソースのインベントリー解除とは異なります。Uninventorying はインベントリーからリソースを削除しますが、プラットフォーム上にはそのままにしておきます。リソースを削除すると、プラットフォーム自体からリソースが削除されます。

例12.7 コンテンツバックアップリソースの削除

// search for the content resource by name
criteria = new ResourceCriteria();
criteria.addFilterName('updatedApp.ear');
var res = ResourceManager.findResourcesByCriteria(criteria);

ResourceFactoryManager.deleteResource(res.get(0).id)

12.4.2. リソースグループの作成およびメンバーの追加

グループはスクリプトによって作成されると、最初に混合グループとして作成されます。すべての空のグループは混合グループとして処理されます。メンバーが追加されると、すべてのメンバーが同じリソースタイプである場合、グループは互換性のあるグループとして自動的にタグ付けされます。
互換性のあるグループは、各メンバーに対して同じ操作または設定変更を繰り返すことができるため、スクリプト化された管理タスクには適しています。
スクリプトの手順は次のとおりです。
  1. リソースタイプを検索します。
  2. リソースタイプに基づいてグループを作成します。
  3. そのリソースタイプのリソースを見つけます。
  4. 返されたリソースを繰り返し処理し、そのリソースをグループに追加します。

例12.8 アノテーション付きの例

// search for the resource type to use for the compat group
var resType = ResourceTypeManager.getResourceTypeByNameAndPlugin("Linux","Platforms");

//create the new resource group
var rg = new ResourceGroup(resType);
rg.setRecursive(false);
rg.setName('Linux Group - ' + java.util.Date());

rg = ResourceGroupManager.createResourceGroup(rg);

//find resources to add to the group based on their resource type
criteria = new ResourceCriteria();
criteria.addFilterResourceTypeId(resType.id);

var resources = ResourceManager.findResourcesByCriteria(criteria);

// add the found resources to the group
if( resources != null ) {
  for( i =0; i < resources.size(); ++i) {
       var resource = resources.get(i);
       ResourceGroupManager.addResourcesToGroup(rg.id, [resource.id]);
  }
}

12.4.3. Dynagroups の作成および編集

動的グループは、インベントリーの検索に使用する検索用語を指定し、グループに属する一致するリソースを特定します。検索結果は、結果が追加および削除されると自動的に変更されるため、グループメンバーシップは常に変更され、常に最新の状態になります。
動的グループ(または dynagroups) は、グループを作成および更新するための独自のクラスがあります。
dynagroup は、一致するメンバーのインベントリーを検索するために使用する検索フィルターである式のセットを定義することで作成されます。グループメンバーシップは(このような式を使用して)管理タスクによって算出されます。
注記
Dynagroups 式は、『『Users Guide』』 で広範囲に説明されています。
両方の Dynagroup を編集する場合は、グループメンバーシップを再計算して、一致するメンバーへの変更を取得する必要があります。また、インベントリーに変更が加えられるたびにグループメンバーシップを再作成して、新しいメンバーで dynagroups を更新することも適切です。

例12.9 Dynagroup の作成

これは、簡単な式を使用してグループメンバーを特定します。
// create the new dynagroup
var dynaGroupDef = new GroupDefinition("Linux Group");
var expr = "resource.type.name=Linux" + "\n" + "resource.type.category=Platform"
dynaGroupDef.setExpression(expr);
var def = GroupDefinitionManager.createGroupDefinition(dynaGroupDef);

// calculate the group members
GroupDefinitionManager.calculateGroupMembership(def.getId());
setExpression 値内で groupby などのより複雑な式を使用できます。

例12.10 Dynagroup の編集

これにより、別の式が dynagroup に追加され、定義が更新されてからグループメンバーシップが再計算されます。
// search for the dynagroup
criteria = new ResourceGroupDefinitionCriteria()
criteria.addFilterName("Linux Group");
var orig = GroupDefinitionManager.findGroupDefinitionsByCriteria(criteria)

// get the dynagroup entry
var originalGroupDef = orig.get(0)

// add the new expression
var expr = "resource.type.name=Linux" + "\n" + "resource.type.category=Platform" + "\n" + "resource.availability=UP"
originalGroupDef.setExpression(expr);
var def = GroupDefinitionManager.updateGroupDefinition(originalGroupDef);

// calculate the group members
GroupDefinitionManager.calculateGroupMembership(def.getId());
Dynagroup メンバーシップは、計算操作後にのみ更新されます。したがって、dynagroup 式自体に変更がなくてもインベントリーに変更がある場合は、メンバーを更新するために dynagroup を更新する必要があります。

例12.11 グループ定義の再計算

これにより、グループ名に基づいて単一の dynagroup が更新されます。
// search for the dynagroup
criteria = new ResourceGroupDefinitionCriteria()
criteria.addFilterName("All agents");
var orig = GroupDefinitionManager.findGroupDefinitionsByCriteria(criteria)

// calculate the group members
GroupDefinitionManager.calculateGroupMembership(orig.getId());
検索結果をインクリメントし、calculatedGroupMembership() メソッドを実行することで、すべての dynagroups または dynagroups のセットを再計算できます。これは、で説明してい 「単一および複数リソースのデータの取得」 ます。

12.5. リソース設定

リソース設定には、以下の 2 つのエリアがあります。
  • プラグインの設定。Web UI では、これは 接続設定 と呼ばれます。これは、エージェントが PID ファイルパスやポート番号などのリソースを検出し、接続するのに使用する情報です。
    すべてのリソースには、何らかのプラグイン設定があります。
  • リソース設定。設定プロパティーは、.conf またはなどのリソースの設定ファイルから提供され .xmlます。JBoss ON 内で公開される設定ファイルおよびプロパティーは、プラグイン記述子に定義されます。
    リソース設定はオプションであり、多くのリソースは設定の編集や、可能なプロパティーのサブセットのみをサポートしません。
ヒント
リソースの設定を変更する場合、「の設定 『プロパティーの変更』 」のように、プロキシーリソースで設定エディターを使用することが最も簡単です 「リソースプロキシーの使用」
設定エディターはインタラクティブ CLI でのみ利用できます。アラートスクリプトまたはリソース設定への自動変更を実行する場合には、リモート API を直接使用できます。

12.5.1. 現在の設定の表示

プラグイン(接続設定)の設定とリソース設定は、リソースタイプのプラグイン記述子でリソースタイプごとに定義されます。
The get*ConfigurationDefinitionForResourceType メソッドは、リソース タイプの設定 に使用される記述子定義のテンプレートを表示できます。これらは、そのタイプのすべてのリソースで使用できる設定プロパティーです。

例12.12 リソースタイプのプラグイン設定の表示

rhqadmin@localhost:7080$ var res = ResourceTypeManager.getResourceTypeByNameAndPlugin('Linux','Platforms') //get the resource type ID

rhqadmin@localhost:7080$ ConfigurationManager.getPluginConfigurationDefinitionForResourceType(res.id) //use the type ID to search for the resource type template

ConfigurationDefinition:
         configurationFormat: Structured
             defaultTemplate: ConfigurationTemplate[id=10443, name=default, config=Linux]
                 description:
            groupDefinitions: [PropertyGroupDefinition[id=10058, name=Content], PropertyGroupDefinition[id=10059, name=Event Logs]]
                          id: 10437
                        name: Linux
        nonGroupedProperties: []
         propertyDefinitions: {logs=PropertyDefinitionList[id=11792, name=logs, config=Linux, group=Event Logs], metadataCacheTimeout=SimpleProperty[metadataCacheTimeout] (Type: INTEGER)(Group: Content), enableContentDiscovery=SimpleProperty[enableContentDiscovery] (Type: BOOLEAN)(Group: Content), enableInternalYumServer=SimpleProperty[enableInternalYumServer] (Type: BOOLEAN)(Group: Content), yumPort=SimpleProperty[yumPort] (Type: INTEGER)(Group: Content)}
           	  templates: {default=ConfigurationTemplate[id=10443, name=default, config=Linux]}
propertyDefinitions パラメーターには、設定できる設定プロパティーに関する情報が含まれます。これには、設定プロパティーの設定の詳細が含まれます。たとえば、イベントログ設定の場合は以下のようになります。
logs=[id=11792, name=logs, config=Linux, group=Event Logs]
プロパティー名は logs で、プロパティーのタイプはリストである PropertyDefinitionList です。プロパティーリスト ID は 11792 ですが、すべて のタイプのプロパティーにテンプレート ID があるわけではありません。イベントログプロパティーは、Event Logs グループにまとめられています。
cache timeout プロパティーは、設定が若干異なります。これは単純なプロパティータイプ(SimpleProperty)、予想される値は Type: 要素に指定されます。プロパティーのグループは Content です。
metadataCacheTimeout=SimpleProperty[metadataCacheTimeout] (Type: INTEGER)(Group: Content)
プロパティーのグループ設定は、主に Web UI で論理組織を作成するために使用されます。イベントログ設定の場合、プロパティー一覧のすべてのメンバーはグループに属し、それらの値のみになります。キャッシュタイムアウトの場合、これはコンテンツグループに属しますが、個別プロパティーもグループに属するため、グループの定義方法は異なります。
リソース設定テンプレートは、プラグインの設定テンプレートを取得するために同様に取得できます。

例12.13 リソースタイプの設定プロパティーの表示

rhqadmin@localhost:7080$ var res = ResourceTypeManager.getResourceTypeByNameAndPlugin('Samba Server', 'Samba') //get the resource type ID

rhqadmin@localhost:7080$ ConfigurationManager.getResourceConfigurationDefinitionForResourceType(res.id)
ConfigurationDefinition:
         configurationFormat: Structured
             defaultTemplate: ConfigurationTemplate[id=11123, name=default, config=Samba Server]
                 description:
            groupDefinitions: [PropertyGroupDefinition[id=10905, name=Basic Configurations], PropertyGroupDefinition[id=10906, name=Security], PropertyGroupDefinition[id=10907, name=Printing], PropertyGroupDefinition[id=10908, name=Active Server Directory]]
                          id: 11087
                        name: Samba Server
        nonGroupedProperties: []
         propertyDefinitions: {winbind enum groups=SimpleProperty[winbind enum groups] (Type: BOOLEAN)(Group: Active Server Directory), winbind separator=SimpleProperty[winbind separator] (Type: STRING)(Group: Active Server Directory), cups options=SimpleProperty[cups options] (Type: STRING)(Group: Printing), workgroup=SimpleProperty[workgroup] (Type: STRING)(Group: Basic Configurations), encrypt passwords=SimpleProperty[encrypt passwords] (Type: BOOLEAN)(Group: Security), winbind enum users=SimpleProperty[winbind enum users] (Type: BOOLEAN)(Group: Active Server Directory), security=SimpleProperty[security] (Type: STRING)(Group: Security), template shell=SimpleProperty[template shell] (Type: STRING)(Group: Active Server Directory), password=SimpleProperty[password] (Type: PASSWORD)(Group: Active Server Directory), load printers=SimpleProperty[load printers] (Type: BOOLEAN)(Group: Printing), username=SimpleProperty[username] (Type: STRING)(Group: Active Server Directory), realm=SimpleProperty[realm] (Type: STRING)(Group: Active Server Directory), idmap gid=SimpleProperty[idmap gid] (Type: STRING)(Group: Active Server Directory), server string=SimpleProperty[server string] (Type: STRING)(Group: Basic Configurations), controller=SimpleProperty[controller] (Type: STRING)(Group: Active Server Directory), enableRecycleBin=SimpleProperty[enableRecycleBin] (Type: BOOLEAN)(Group: Basic Configurations), idmap uid=SimpleProperty[idmap uid] (Type: STRING)(Group: Active Server Directory)}
                   templates: {default=ConfigurationTemplate[id=11123, name=default, config=Samba Server]}
特定リソースのプロパティー値は、を使用して表示できます。 get*Configuration メソッド。
ヒント
リソース設定のみを表示し、インタラクティブ CLI を実行している場合、「の 『設定プロパティーの変更』 」と同様に、プロキシーリソースを使用してより簡単に実行でき 「リソースプロキシーの使用」 ます。

例12.14 リソースの設定の表示

rhqadmin@localhost:7080$ criteria = new ResourceCriteria(); // find the resource
rhqadmin@localhost:7080$ criteria.addFilterResourceTypeName('Samba')
rhqadmin@localhost:7080$ criteria.addFilterAgentName('agent1.example.com')
rhqadmin@localhost:7080$ var resource = ResourceManager.findResourcesByCriteria(criteria);

rhqadmin@localhost:7080$ ConfigurationManager.getResourceConfiguration(resource.get(0).id)
Configuration [12082] - Loaded from Augeas at Wed May 02 12:04:24 EDT 2012
  winbind separator = null
  winbind enum groups = null
  cups options = null
  workgroup = null
  winbind enum users = null
  encrypt passwords = null
  security = null
  template shell = null
  password = null
  load printers = null
  username = null
  realm = null
  idmap gid = null
  server string = null
  controller = null
  enableRecycleBin = false
  idmap uid = null

12.5.2. シンプル設定プロパティーの変更

設定プロパティーの編集方法は、プロパティーのタイプ(simple、list、または map のいずれか)によって異なります。設定の変更プロセスは、プラグイン設定プロパティーとリソース設定プロパティーの両方で同じです。
このスクリプトのステップ:
  1. リソースを検索します。
  2. 設定オブジェクトを作成します。
  3. 新しいプロパティー値を設定します。プロパティーを設定するメソッドは、プロパティーの形式によって異なります。この場合、これは単純なプロパティーな setSimpleValue ので使用されます。simple プロパティーの場合、値は渡して設定されます('property','value')。
  4. リソースの更新操作を実行します。リソース設定の更新では、メソッドは以下のようになります。 updateResourceConfiguration.プラグイン設定の更新では、 updatePluginConfiguration.

例12.15 シンプルプロパティーの変更

// find the resource
criteria = new ResourceCriteria(); 
criteria.addFilterResourceTypeName('Samba')
// this only updates the resource for this specific agent
criteria.addFilterAgentName('agent1.example.com')
var resources = ResourceManager.findResourcesByCriteria(criteria);

//get current configuration
var config = ConfigurationManager.getResourceConfiguration(resources.get(0).id);

//set the new value in the form 'property', 'value'
config.setSimpleValue("workgroup","example")

// run the update operation
ConfigurationManager.updateResourceConfiguration(resources.get(0).id,config)

12.6. operations

12.6.1. リソースの起動および停止

リソースは、操作を使用して簡単に開始できます。
この例では、特定のリソースを名前で検索し、start() 関数を実行します。

例12.16 簡易起動

//find the resource
criteria = new ResourceCriteria();
criteria.addFilterName('My JBossAS')

var servers = ResourceManager.findResourcesByCriteria(criteria);
var myJBossAS = ProxyFactory.getResource(servers.get(0).id)
myJBossAS.start()
リソースタイプごとに独自の定義操作があります。また、start や stop などの単純なタスクであっても、リソースによっては異なる方法を持つ場合があります。プロキシーリソースの使用を試み、利用可能な操作を一覧表示する operations 方法を試みます。
rhqadmin@localhost:7080$ server.operations
Array of org.rhq.bindings.client.ResourceClientProxy$Operation
name     description
-----------------------------------------------------------------------
restart  Shutdown and then start this application server.
start    Start this application server. 
shutdown Shutdown this application server via script or JMX.
3 rows
より複雑な起動または停止スクリプトを使用して、同じタイプのリソースの配列を繰り返し処理できます。

例12.17 アレイ 1 の起動

//find the resources
//use a plugin filter to make sure they are all of the same type
criteria = new ResourceCriteria();
criteria.addFilterPluginName('JBossAS5')

var resources = ResourceManager.findResourcesByCriteria(criteria).toArray();
var resType = ResourceTypeManager.getResourceTypeByNameAndPlugin('JBossAS Server', 'JBossAS5');

// go through the array
var idx=0;
var jbossServers = new Array();

for( i in resources ) {
     if( resources[i].resourceType.id == resType.id ) {
          jbossServers[idx] = resources[i];
          idx = idx + 1;     
     }
}

// restart the resources
for( a in resources ) {
     var jboss = ProxyFactory.getResource(jbossServers[a].id);
     jboss.restart()
}

例12.18 アレイ 2 の起動

//find the resources
//use a plugin filter to make sure they are all of the same type
criteria = new ResourceCriteria();
criteria.addFilterPluginName('JBossAS5')
criteria.addFilterResourceTypeName('JBossAS Server');

var jbossServers = ResourceManager.findResourcesByCriteria(criteria).toArray();

// restart the resources
for( a in jbossServers ) {
     var jboss = ProxyFactory.getResource(jbossServers[a].id);
     jboss.restart()
}

12.6.2. スケジューリング操作

最も簡単な方法として、リソースのプロキシーを作成し、そのプロキシーで proxyName.operationName() の形式で操作を実行します。

例12.19 即時操作

rhqadmin@localhost:7080$ var agent = ProxyFactory.getResource(10008)
rhqadmin@localhost:7080$ agent.executeAvailabilityScan(true)
Invoking operation executeAvailabilityScan
Configuration [13903] - null
  isChangesOnly = true
  agentName = server.example.com
  resourceAvailabilities [0] {
  }
操作はスケジュールで実行できます。スケジュールには、いくつかの設定項目が必要です。
  • リソース ID
  • 操作名
  • 遅延期間: 今後操作を開始するタイミング(任意)
  • 繰り返し間隔とカウント(オプション)
  • タイムアウト期間(任意)
  • 設定パラメーター(操作で必要な場合)
  • スケジュールされた操作の説明(任意)
この例では、特定のエージェントで可用性スキャンを実行します。

例12.20 スケジュールされた操作の例

// find the agent
var rc = ResourceCriteria();
rc.addFilterResourceTypeName("RHQ Agent");
rc.addFilterVersion("3.3");

var agent = ResourceManager.findResourcesByCriteria(rc);

//set the config properties for the operation
var config = new Configuration();
config.put(new PropertySimple("changesOnly", "true") );

//schedule the operation
OperationManager.scheduleResourceOperation(
          agent.get(0).id,
          "executeAvailabilityScan",
	  0, // 0 means that the delay was skipped
          1,
	  0, // this skips the repeat count
          10000000,
	  config, 
          "test from cli"
	  );
これにより、スケジュールされた操作の情報を即座に出力します。
ResourceOperationSchedule:
        resource: Resource[id=10008, uuid=e11390ec-34c4-49df-a4b6-c37c516f545c, type={RHQAgent}RHQ Agent, key=server.example.com RHQ Agent, name=RHQ Agent, parent=server.example.com, version=3.3]

12.6.3. 操作の結果の取得

一部の操作では成功または失敗のみが報告され、これだけが必要になります。その他の操作は、リソースから情報を取得したり、リソースの変更をより複雑な変更したりすることができます。その場合は、他のタスクで使用できるように、その情報を返す必要があります。
The fetchResults(true) メソッドを使用すると、操作履歴の検索の一部として操作の結果を返すことができます。
// find the resource
criteria = new ResourceCriteria(); 
criteria.addFilterResourceTypeName('Linux');
criteria.addFilterName('server.example.com');
ResourceManager.findResourcesByCriteria(criteria);

var resource = ResourceManager.findResourcesByCriteria(criteria);

// search for the operation history
var opcrit = ResourceOperationHistoryCriteria();
// get the operation for the resource ID
opcrit.addFilterResourceIds(resource.get(0).id);
// filter by the operation name
opcrit.addFilterOperationName("viewProcessList")
opcrit.fetchResults(true);

// get the data and print the results
var r = OperationManager.findResourceOperationHistoriesByCriteria(opcrit)
var h = r.get(0);
var c = h.getResults();
pretty.print(c)

例12.21 プロセススキャンの結果の出力

この例では、スクリプトが最初に操作(プラットフォーム上でのプロセススキャン)を実行し、結果を出力します。
スクリプトの最初の部分は、リソース ID の要件を設定し、そのリソースを検索します。
if (args.length != 1) {
    throw "we need a resource id as an argument";
}

var platform = ResourceManager.getResource(args[0]);
次の部分は、プロセスのスキャン操作をスケジュールします。の説明にあるように 「スケジューリング操作」、リソース ID、操作名、および操作設定が設定されます。
var ros = OperationManager.scheduleResourceOperation(
   platform.id,
   "viewProcessList",
   0,
   1,
   0,
   15,
   null,
   "test operation"
);
最後の部分は、2 つの検索設定で操作履歴を取得します。
  • fetchResults(true)。ステータスだけでなく、操作結果データを含めるために必要です。
  • この場合、ソートメソッド addSortStartTime
スクリプトには、スクリプトが結果の取得を試みる前に操作の完了時間を確保するためにもいくつかのスリープがあります。
var opcrit = ResourceOperationHistoryCriteria();
opcrit.addFilterResourceIds(platform.id);
opcrit.fetchResults(true); // request the additional optional data in the result
opcrit.addSortStartTime(PageOrdering.DESC); // sort by start time
java.lang.Thread.sleep(1000); // wait a second to make sure operation is in the history

// wait for up to 15 seconds for last operation to complete, then print result
now=new Date().getTime();
while (new Date().getTime() - now < 15000 ) {
   operations = OperationManager.findResourceOperationHistoriesByCriteria(opcrit);
   if (operations.get(0).getResults() == null) {
      println("operation still pending result");
      java.lang.Thread.sleep(1000);
   } else {
      pretty.print(operations.get(0).getResults());
      break;
   }
}
if (operations.get(0).getErrorMessage() != null) {
      println("Error getting process list: ");
      pretty.print(operations.get(0).getErrorMessage());
}
このスクリプトは、操作が正常に完了すれば、操作の結果を出力します。
   } else {
      pretty.print(operations.get(0).getResults());
      break;
   }

12.6.4. リソースの動作履歴の確認

リソースの操作履歴はオブジェクトとして存在するため、他のオブジェクトと同じ基準で検索できます。

例12.22 操作履歴の表示

// find the resource
var rc = ResourceCriteria();
rc.addFilterPluginName("RHQAgent");
rc.addFilterName("RHQ Agent");
rc.addFilterResourceTypeName("RHQ Agent");
rc.addFilterDescription("Agent");

var agent = ResourceManager.findResourcesByCriteria(rc);

// print the operation history for the resource
var opcrit = ResourceOperationHistoryCriteria()
opcrit.addFilterResourceIds(agent.get(0).id)
OperationManager.findResourceOperationHistoriesByCriteria(opcrit);
(successful)操作の結果は、results テーブルの Configuration オブジェクトに置かれます。
resource                                             results
-----------------------------------------------------------------------------------------------------------------
Resource[id=10008, uuid=e11390ec-34c4-49df-a4b6-c37c516f545c, type={RHQAgent}RHQ Agent, key=server.example.com RHQ Age Configuration[id=13903]
Resource[id=10008, uuid=e11390ec-34c4-49df-a4b6-c37c516f545c, type={RHQAgent}RHQ Agent, key=server.example.com RHQ Age Configuration[id=13913]
2 rows

12.7. 監視

12.7.1. リソースの可用性

新しい Web アプリケーションのデプロイなど、ターゲットリソースが実行している場合にのみ実行される必要があります。より大きなスクリプトに可用性チェックを含めると、状態依存操作が実行されるタイミングを制御するのに役立ちます。
スクリプトの手順は次のとおりです。
  1. リソースを検索します。この場合、スクリプトはリソースタイプ(Linux プラットフォーム)に一致するリソースのみを検索し、可用性スキャンに最初に一致します。
  2. 現在の可用性ステータスを取得します。

例12.23 現在の可用性

// get the resource ID
criteria = new ResourceCriteria();
criteria.addFilterResourceTypeName('Linux')

var res = ResourceManager.findResourcesByCriteria(criteria);

// check the current availability
AvailabilityManager.getCurrentAvailabilityForResource(res.get(0).id)
JBoss ON サーバーは、リソース情報、現在のステータス、および現在のステータスの開始時間を返します(サーバーが稼働している場合、サーバーが起動した時間)。
Availability:
        availabilityType: UP
                 endTime:
                      id: 10192
                resource: Resource[id=10001, uuid=null, type=<null>, key=null, name=null, parent=<null>]
	       startTime: 1335974397214

12.7.2. 特定のメトリクスの取得

JBoss ON のモニタリング情報はライブ読み取りではありません。スキャンには、ストリーミングではなく定期的にスキャンがあり、ベースラインと平均の情報は(集計)されるという 2 つの理由があります。
The findLiveData method は、現在の、対象外の、指定のメトリクスのライブ読み取りをプルする方法です。
スクリプトの手順は次のとおりです。
  1. リソースタイプに基づいて利用可能なメトリクス定義を検索し、単一のメトリクスに絞り込みます。この例では、Linux プラットフォームの空きメモリーメトリックを取得します。
  2. リソースを検索します。
  3. メトリックの現在の読み取りを取得します。
  4. ターミナルにデータを出力します。

例12.24 アノテーション付きの例

// search for the resource
criteria = new ResourceCriteria();
criteria.addFilterResourceTypeName('Linux');
var resources = ResourceManager.findResourcesByCriteria(criteria);

// search for the resource type to use in the metrics definition
var rt = ResourceTypeManager.getResourceTypeByNameAndPlugin("Linux", "Platforms");

// search for the metric definition
var mdc = MeasurementDefinitionCriteria();
mdc.addFilterDisplayName("Free Memory");
mdc.addFilterResourceTypeId(rt.id);
var mdefs =  MeasurementDefinitionManager.findMeasurementDefinitionsByCriteria(mdc);

//get the data
var metrics = MeasurementDataManager.findLiveData(resources.get(0).id, [mdefs.get(0).id]);

// as a nice little display, print the retrieved metrics value
if( metrics !=null ) {
        println(" Metric value for " + resources.get(0).id + " is " + metrics );
}
この例では、メトリックの現在のライブ読み取りが画面に出力されます。
 Metric value for 10001 is [MeasurementDataNumeric[value=[6.3932239872E10], MeasurementData [MeasurementDataPK: timestamp=[Tue May 08 20:10:15 EDT 2012], scheduleId=[10002]]]]

12.7.3. リソースのメトリックデータのエクスポート

raw メトリクスデータは、デフォルトで 1 週間のみデータベースに保存されます。その後、処理された(集計)データのみが保存されます。長期的な履歴データを保持できるように、raw 測定を CSV またはテキストファイルにエクスポートすると便利です。
スクリプトの手順は次のとおりです。
  1. リソースタイプに基づいて、利用可能なメトリック定義を検索します。この例では、Linux プラットフォーム用です。
  2. リソースを検索します。
  3. メトリック情報の日付範囲を設定します。これは、スクリプトが実行される時間との対比で秒単位で設定されます。
  4. データを書き込むファイル情報を設定します。
  5. リソースのすべてのメトリクス定義を繰り返し処理し、指定された CSV ファイルにデータを出力します。

例12.25 Linux サーバーのすべてのメトリクス定義のエクスポート

// search for the available metrics definitions
var rt = ResourceTypeManager.getResourceTypeByNameAndPlugin("Linux","Platforms")
var mdc = MeasurementDefinitionCriteria();
mdc.addFilterResourceTypeId(rt.id);
var mdefs =  MeasurementDefinitionManager.findMeasurementDefinitionsByCriteria(mdc);

// search for the resource
criteria = new ResourceCriteria();
criteria.addFilterResourceTypeName('Linux')
var resources = ResourceManager.findResourcesByCriteria(criteria);

// give the date range for the metrics collection
// this is in seconds
var start = new Date() - 8* 3600 * 1000;
var end = new Date()

// setup up the CSV to dump the data to
exporter.file = '/opt/myfile.csv'
exporter.format = 'csv'


// iterate through the metrics definitions for the resource
// and export all the collected metrics for all definitions
// within the given date range
if( mdefs != null ) {
  if( mdefs.size() > 1 ) {
     for( i =0; i < mdefs.size(); ++i) {
          mdef = mdefs.get(i);
          var data = MeasurementDataManager.findDataForResource(resources.get(0).id,[mdef.id],start,end,1)

	  exporter.write(data.get(0)); // write the data to the CSV file
     }
  }
  else if( mdefs.size() == 1 ) {
     mdef = mdefs.get(0);
     var data = MeasurementDataManager.findDataForResource(resources.get(0).id,[mdef.get(0).id],start,end,60)
     exporter.write(data.get(0))
  }
}

12.7.4. ベースラインの算出

ベースラインは、独自のパフォーマンスに基づく、特定リソースの通常の操作範囲です。
ベースラインの取得は非常に簡単です。必要なのはリソース ID です。
rhqadmin@localhost:7080$ MeasurementBaselineManager.findBaselinesForResource(10001)
one row
MeasurementBaseline:
        computeTime: Tue May 08 21:28:05 EDT 2012
                 id: 10001
                max: 6.4005419008E10
               mean: 6.3933904981333336E10
                min: 6.380064768E10
           schedule: [MeasurementSchedule, id=10002]
        userEntered: true

12.8. アラート

アラート定義は CLI を使用して作成または編集できませんが、引き続き実行できる管理タスクがあります。発生するアラート自体では、サーバー側のスクリプトをアラート応答(および暗黙的な変数として参照されるアラート)として使用することができます。また、発生するアラートは管理者が表示し、承認することができます。定義は有効または無効にできます。

12.8.1. スクリプトでのアラートの使用

アラートへの応答の 1 つが、サーバーが保存したサーバースクリプト(通常は保存された CLI スクリプトファイル)を自動的に実行することです。
そのサーバー側のアラートスクリプトは、トリガーされたアラートのアラートオブジェクトを参照できます。サーバーは暗黙的な アラート 変数を定義します。これは、アラート情報、ID、定義、および発生するアラートのその他の情報でプルします。
よって、 Alert メソッドはアラート定義を識別し、アラートをトリガーしたリソースを特定します。これにより、スクリプトに再利用可能なプロキシーリソース定義を作成できます。この定義は、そのアラートスクリプトを使用するリソースに適用できます。
例:
var myResource = ProxyFactory.getResource(alert.alertDefinition.resource.id)
注記
この方法は、対話式 CLI や外部 CLI スクリプトファイルではなく、アラートで使用されるサーバー側のスクリプトでのみ利用できます。

12.8.2. アラートの承認

アラートが発生した場合の一般的な管理アクションの 1 つが管理者が確認し、その後アラートを確認し、承認すると、効果的に閉じます。このスクリプト例は、すべての Linux プラットフォームリソースの現在のアラートをすべて認識します。
検索の基準は、特定のアラートのみ、または特定のリソースのみをアクションに含めるように制限されるよう設定することができます。
このスクリプトのステップ:
  1. 発生するアラートを検索します。この場合、検索はリソースタイプ(Linux)に基づいています。
  2. 検索結果のデータを取得します。
  3. 返されるすべてのアラートを確認します。

例12.26 プラットフォームリソースのアラートの承認

// set the criteria and search for the alerts
var criteria = new AlertCriteria() 
criteria.addFilterResourceTypeName('Linux')
var alerts = AlertManager.findAlertsByCriteria(criteria)

// go through the results and then acknowledge the alerts
if( alerts != null ) {
  if( alerts.size() > 1 ) {
     for( i =0; i < alerts.size(); ++i) {
          alert = alerts.get(i);
          AlertManager.acknowledgeAlerts([alert.id])
     }
  }
  else if( alerts.size() == 1 ) {
     alert = alerts.get(0);
     AlertManager.acknowledgeAlerts([alert.id])
  }
}

12.8.3. アラート定義の有効化または無効化

アラート定義は CLI で作成または編集できませんが、有効または無効にすることができます。
このサンプルスクリプトは、検索で返されたすべての定義を無効にします。実際のライフでは、定義の大きな blocs を無効にするのではなく、適切な定義のみを無効にするには、検索の基準が重要です。
このスクリプトのステップ:
  1. 優先度に基づいて一致するアラート定義を検索します(この場合は低速)。
  2. 検索結果のデータを取得します。
  3. 取得した検索リストの ID に基づいて、返されるすべてのアラート定義を無効にします。

例12.27 優先度に基づいてアラートの無効化

// set the search criteria for the alert definitions with a reasonable filter
var criteria = new AlertDefinitionCriteria()
criteria.addFilterPriority(AlertPriority.LOW)

//search for the alert definitions
alertdefs = AlertDefinitionManager.findAlertDefinitionsByCriteria(criteria)

//get the data from the results
alertdef = alertdefs.get(0);

println("  alert: " + alertdef.id );

//disable the matching alerts, based on ID
AlertDefinitionManager.disableAlertDefinitions([alertdef.id]);

12.9. ユーザーおよびロール

ロールは、JBoss ON の主なアクセス制御方法です。ロールは、ユーザーとリソース(リソースグループ経由)の関係を作成します。ロールに設定されたパーミッションは、ロールのリソースに対して付与するパーミッションを定義します。

12.9.1. ロールの作成

ユーザーは、ユーザーが属するロールにあるリソースのみを表示および管理できます。リソースがない場合、パーミッションに関係なく、ユーザーは JBoss ON ではほとんど実行できません。
このスクリプトはロールを作成し、複数のグループを追加します。異なるタイプのグループを取得する場合や、複数のグループを一度に追加するなど、より複雑になる可能性があります。
スクリプトの手順は次のとおりです。
  1. ロールを作成し、適切なパーミッションを割り当てます。この場合、ロールはインベントリーおよびユーザーパーミッションを管理します。
  2. メンバーとして追加するグループを検索します。
  3. 新規ロールエントリーを検索します。
  4. ロールにグループを追加します。

例12.28 新規ロール

// create the role
var role = Role('Role Name - ' + java.util.Date());
role.description = 'This role is an example';
role.addPermission(Permission.MANAGE_INVENTORY);
role.addPermission(Permission.VIEW_USERS);
RoleManager.createRole(role);

//search for the group to add to the role
groupcriteria = new ResourceGroupCriteria();
groupcriteria.addFilterGroupCategory.toString('MIXED');

var groups = ResourceGroupManager.findResourceGroupsByCriteria(groupcriteria);

//search for the new role
var c = new RoleCriteria();
c.addFilterName('Role Name');
var roles = RoleManager.findRolesByCriteria( c );
RoleManager.addResourceGroupsToRole(roles.get(0).id,[groups.get(0).id]);

12.9.2. ユーザーの作成

ユーザーエントリーには、JBoss ON の記述エントリーとログインユーザー名/パスワードのペアであるプリンシパルの 2 つの部分があります。
スクリプトの手順は次のとおりです。
  1. 新規ユーザー(subject)エントリーを作成します。
  2. 新規ユーザーのプリンシパルを作成します。
  3. ロールの検索でユーザーを追加し、アレイを作成します。
  4. ロールにユーザーを追加します。

例12.29 ユーザーの作成とロールの追加

//create the new user entry	
var newSubject = new Subject();
newSubject.setEmailAddress( 'admin@example.com' );
newSubject.setFirstName('John');
newSubject.setLastName('Smith' );
newSubject.setFactive(true);
newSubject.setFsystem(false);
newSubject.setName('jsmith');
var s = SubjectManager.createSubject(newSubject);

//create the login principal for the user
SubjectManager.createPrincipal( s.name, 'password' );

//search for the role and create an array
var c = new RoleCriteria();
c.addFilterName('Role Name');
var roles = RoleManager.findRolesByCriteria( c );
var role = roles.get(0);
var rolesArray = new Array(1);
rolesArray[0] = role.getId();

//add the new user to the roles in the array
RoleManager.addRolesToSubject(s.getId(), rolesArray );

パート III. 拡張例と使用シナリオ

12章短い例 制限されたタスクおよび特定のタスクを実行する個別のコードサンプルを介して実行されます。実際、これらのコードの例(およびその他のコード)は、より一貫した、有用な管理タスクを実施します。以下の例は、潜在的なスクリプトワークフローを示しています。

第13章 例: インベントリーを管理するためのスクリプト(すべてのリソースタイプ)

サーバーおよびサービスは、定期的にローカルマシンを追加または削除します。検出スキャンは定期的にスケジュールされますが、実際に JBoss ON インベントリー内でそのリソースの追加または削除は手動です。また、管理者は実際にリソースのインポートを選択する必要があります。
管理者は、新しいリソースを自動的に追加し、定義する基準に基づいて他のリソースを自動的に削除することで、JBoss ON インベントリーを管理できます。

13.1. New Resources の自動インポート: autoimport.js

リソースが検出されると、技術的にはすでに JBoss ON のインベントリーにあります。ステータスには、が含まれ NEWます。JBoss ON はリソースが存在する場合に認識されるため、JBoss ON の状態はリソースがコミットされていないため、JBoss ON が管理できないためです。
スクリプトを作成して、定期的に実行して、新たに検出したリソースをインベントリーに自動的に追加できるようにします。このスクリプトはインベントリーの状態の新しいリソースに基づいて識別を行うため、無視またはインポート済みのリソースが含まれていません。
CLI スクリプトは 3 つの手順で実行されます。
  • を使用して新規リソースを識別します。 findUncommittedResources() メソッド。
  • 新規リソースの ID を取得します。
  • その後、検出システムのインポート操作を呼び出してこれらのリソースをインポートします。
//Usage: autoImport.js
//Description: Imports all auto-discovered inventory into JON
// autoImport.js
rhq.login('rhqadmin', 'rhqadmin');
println("Running autoImport_js");
 
var resources = findUncommittedResources();
var resourceIds = getIds(resources);
DiscoveryBoss.importResources(resourceIds);
 
rhq.logout();
リモート API にすでに定義されている操作の 1 つのみ importResources.他の 2 つの機能 findUncommittedResources および getIds - スクリプトで定義する必要があります。
コミットされていない(新しい)リソースは、 ResourceCriteria 検索するには、インベントリーのステータスに基づいて検索パラメーターを追加します。
// returns a java.util.List of Resource objects
// that have not yet been committed into inventory
function findUncommittedResources() {
    var criteria = ResourceCriteria();
    criteria.addFilterInventoryStatus(InventoryStatus.NEW);
     
    return ResourceManager.findResourcesByCriteria(criteria);
}
2 番目の関数は、インベントリー検索が実際にリソースを返したことを確認します。その場合は、アレイ内の各リソースの ID を取得します。
// returns an array of ids for a given list
// of Resource objects. Note the resources argument
// can actually be any Collection that contains
// elements having an id property.
function getIds(resources) {
	var ids = [];

	if (resources.size() > 0) {
		println("Found resources to import: ");
		for (i = 0; i < resources.size(); i++) {
			resource = resources.get(i);
			ids[i] =  resource.id;
			println("  " + resource.name);
		}
	} else {
		println("No resources found awaiting import...");
	}

    return ids;
}

13.2. Simple Inventory Count: inventoryCount.js

検索はを使用して実行されます。 *criteria クラス。リソースの場合、これはです。 ResourceCriteria.検索には、非常に具体的な条件を渡して、1 つのリソースまたはリソースの小さなサブセットのみを返すことができます。インベントリーのすべてのものを返すことも可能です。
このスクリプトは、特定の基準を付けずに検索を実行します(ResourceCriteria())を、すべてのリソースが検索と一致するようにします。次に、結果のサイズを取り、単純なインベントリー数を生成します。
// inventory.js
rhq.login('rhqadmin', 'rhqadmin');
var resources = ResourceManager.findResourcesByCriteria(ResourceCriteria());
println('There are ' + resources.size() + ' resources in inventory');

// end script

13.3. Uninventory a Resource after an Alert: uninventory.js

インベントリーからリソースを削除すると JBoss ON からリソースが削除され、ローカルシステムでサーバーまたはアプリケーション自体はそのままになります。(これにより、リソースを後で再検出して再インポートできます。)
アラートシステムは、発生するアラートに応じて CLI スクリプトを起動できます。考えられる応答の 1 つは、適切に動作していないリソースをインベントリー解除することです。
これは非常に簡単なスクリプトになります。リソースのインベントリーを解除するには、アラートおよびに組み込まれたリソース ID を使用します。 uninventoryResource 方法:
List<Integer> uninventoryResources(Subject subject, int[] resourceIds);
uninventory 操作と別のタスクを組み合わせることができます。たとえば、あるリソースをインベントリー解除し、そのリソースを実行するために別のリソースを自動的に作成してインポートします。
注記
このスクリプトはサーバーにアップロードしてからアラート通知として参照する必要があります。

第14章 例: 特定のタイプのリソースを管理するスクリプト

13章例: インベントリーを管理するためのスクリプト(すべてのリソースタイプ) は、一般的なリソース検出およびインポートスクリプトを表示します。状況によっては、特定タイプのリソースのみを検出してインポートするのに便利です。たとえば、管理者は、新規アプリケーションを常にアプリケーションサーバーにデプロイしたり、アプリケーションサーバーを動的に起動して破棄して負荷に対応したりすることができます。この場合、管理者は、頻繁に作成される特定のリソースのみを検索します。
以下の例では、ワークフローには基本的なステップがいくつかあります。
  1. 特定のタイプの新しい未コミットリソースを検索します。
  2. リソース ID を取得します。
  3. これらの新規リソースをインポートします。
  4. 新たにインポートしたリソースで作業を行います。
ステップ 1 から 3 は基本的には autoimport.js 例と同じで 「New Resources の自動インポート: autoimport.js」、1 つの大きな変更があります。検索には、リソースタイプの追加のフィルターがあります。
コミットされていない(新しい)リソースは、 ResourceCriteria 検索するには、インベントリーステータスとリソースタイプ(この例では JBoss EAP 6 ドメインデプロイメント)を基にして検索パラメーターを追加します。The new findUncommittedJbasApps() 関数はその検索を実行します。
function findUncommittedJbasApps() {
    var criteria = ResourceCriteria();
    criteria.addFilterInventoryStatus(InventoryStatus.NEW);
    criteria.addFilterResourceTypeName('DomainDeployment');
     
    return ResourceManager.findResourcesByCriteria(criteria);
}
この autoimport.js 例では、 getIds function はリソース ID の配列を取得します。
function getIds(resources) {
	var ids = [];

	if (resources.size() > 0) {
		println("Found resources to import: ");
		for (i = 0; i < resources.size(); i++) {
			resource = resources.get(i);
			ids[i] =  resource.id;
			println("  " + resource.name);
		}
	} else {
		println("No resources found awaiting import...");
	}

    return ids;
}
この 2 つの機能は、特定のタイプのコミットされていないリソースを検索し、それらの ID を取得するという最初の 2 つの手順を実行します。
ステップ 3 が次に実行されます。 DiscoveryBoss 検出されたリソースをインポートする方法。
最初のスクリプトの半分が元のスクリプトを模擬し autoimport.js、JBoss EAP 6 のドメインデプロイメントを検索するための新しい関数にわずかな調整を行います。
rhq.login('rhqadmin', 'rhqadmin');
println("Running autoImport_js");
 
var resources = findUncommittedJbasApps();
var resourceIds = getIds(resources);
DiscoveryBoss.importResources(resourceIds);
最後のステップは単に新しいリソースで何かを行います。
新しいドメインデプロイメントでは、新しいドメインデプロイメントをサーバーグループに割り当てるのが最も便利なため、新しいアプリケーションがデプロイされます。たとえば、これにより、promote 操作を使用して、ステージング環境に使用されるサーバーグループに新しいアプリケーションをすべて自動的に割り当てます。
var config = new Configuration();
config.put(new PropertySimple("server-group", "Staging-Server-Group") );

OperationManager.scheduleResourceOperation(
          resources.get(0).id,
          "promote",
	  0, // 0 means that the delay was skipped
          1,
	  0, // this skips the repeat count
          10000000,
	  config, 
          "promote new app to server group"
	  );
このスクリプトを使用して新規サービスまたは新しいサーバーを追加する場合は、新しいリソースをグループに追加することが適切であることがあります。この例では、既存の互換性のあるグループに明示的なグループ ID(15001)を使用しています。このスクリプトを実行する前にグループがすでに作成されていることを前提とし、リソース用に新しいグループを作成する必要はありません。
ResourceGroupManager.addResourcesToGroup(15001, [resourceIds]);
次に、スクリプトを CLI からログアウトして、閉じます。
rhq.logout();

第15章 例: リソースデプロイメントのスクリプト作成(JBoss EAP 5)

管理ツールの一般的なユースケースは、新規または既存のアプリケーションのデプロイメントを自動化することです。以下の例では、基本的な管理タスクを簡単にスクリプトを作成します。
  1. 指定された JBoss ON グループの JBoss EAP インスタンスをすべて検索します。
  2. 各 EAP インスタンスをシャットダウンします。
  3. 既存のデプロイされたアプリケーションのバイナリーを更新するか、または新規デプロイメントを作成します。
  4. EAP インスタンスを再起動します。
  5. ループを終了します。

15.1. カスタム関数の宣言

このスクリプトは、2 つのカスタム関数を使用してパッケージをデプロイし、新しいリソースを作成します。
function usage() {
	println("Usage: deployToGroup <fileName> <groupName>");
	throw "Illegal arguments";
}

function PackageParser(fullPathName) {
	var file = new java.io.File(fullPathName);
		
	var fileName = file.getName();
	var packageType = fileName.substring(fileName.lastIndexOf('.')+1);
	var tmp = fileName.substring(0, fileName.lastIndexOf('.'));
	var realName = tmp.substring(0, tmp.lastIndexOf('-'));
	var version = tmp.substring(tmp.lastIndexOf('-') + 1);			
	var packageName = realName + "." + packageType;
	
	this.packageType = packageType.toLowerCase();
	this.packageName = packageName;
	this.version     = version;
	this.realName    = realName;
}

15.2. JBoss ON グループおよびインベントリーの確認

スクリプトには、2 つのコマンドラインパラメーターが必要です。1 つ目は、グループにインストールされる新しいアプリケーションのパスである必要があります。2 つ目は、グループ自体の名前です。これらのパラメーターはスクリプトで解析されます(詳細はを参照してください 「コマンドとスクリプト引数を渡す」)。
例:
if( args.length < 2 ) usage();
				
var fileName = args[0];
var groupName = args[1];
次に、パスが有効かどうかを確認し、現在のユーザーがそのパスを読み取りできるかどうかを確認します。これは、以下のように Java クラスを使用して行います。
// check that the file exists and that we can read it
var file = new java.io.File(fileName);
				
if( !file.exists() ) {
    println(fileName + " does not exist!");
    usage();
}
				
if( !file.canRead() ) {
    println(fileName + " can't be read!");
    usage();
}
グループが JBoss ON サーバーに存在することを確認します。
// find resource group
var rgc = new ResourceGroupCriteria();
rgc.addFilterName(groupName);
rgc.fetchExplicitResources(true);
var groupList = ResourceGroupManager.findResourceGroupsByCriteria(rgc);
ここでは、リソースを取得することです。
rgc.fetchExplicitResources(true);
グループが見つかったかどうかを確認します。
if( groupList == null || groupList.size() != 1 ) {
    println("Can't find a resource group named " + groupName);
    usage();
}
				
var group = groupList.get(0);
				
println("  Found group: " + group.name );
println("  Group ID   : " + group.id );
println("  Description: " + group.description);
指定された名前を持つグループが存在することを確認したら、グループに明示的なリソースが含まれているかどうかを確認します。
if( group.explicitResources == null || group.explicitResources.size() == 0 ) {
    println("  Group does not contain explicit resources --> exiting!" );
    usage();
}
var resourcesArray = group.explicitResources.toArray();
resourceArray グループに属するすべてのリソースが含まれるようになりました。次に、アプリケーションがデプロイされる前に再起動が必要な JBoss AS 5 サーバーインスタンスがあるかどうかを確認します。
for( i in resourcesArray ) {
    var res = resourcesArray[i];
    var resType = res.resourceType.name;
    println("  Found resource " + res.name + " of type " + resType + " and ID " + res.id);
				
    if( resType != "JBossAS5 Server") {
        println("    ---> Resource not of required type. Exiting!");
        usage();
    }
				
    // get server resource to start/stop it and to redeploy application
    var server = ProxyFactory.getResource(res.id);
}
これには、JBoss AS 5 サーバーリソースタイプのみがトップレベルのリソースタイプを持つグループが必要です。JBoss AS 5 インスタンスが server 含まれるようになりました。これには、完全に設定する必要があるため、サーバーを再読み取りする必要があります。CLI は内部的に単純な JPA 永続を使用し、すべての依存オブジェクトを常にフェッチする訳ではありません。
次に、サーバーインスタンスの子をすべて追跡し、アプリケーションのリソース名を見つけます。
var children = server.children;
for( c in children ) {
    var child = children[c];
				
    if( child.name == packageName ) {
    }
}
packageName デプロイされたアプリケーションとして JBoss ON GUI に示されるように、バージョン情報とパスのないアプリケーションの名前です。
元のバージョンのアプリケーションのバックアップを作成します。
println("    download old app to /tmp");
child.retrieveBackingContent("/tmp/" + packageName + "_" + server.name + "_old");
パスでデコードされたサーバー名を持つ古いアプリケーションのコピーが /tmp/ ディレクトリーにあります。
サーバーをシャットダウンし、新しいアプリケーションコンテンツをサーバーにアップロードします。
println("    stopping " + server.name + "....");
try {
    server.shutDown();
}
catch( ex ) {
    println("   --> Caught " + ex );
}
				
				
println("    uploading new application code");
child.updateBackingContent(fileName);
				
println("    restarting " + server.name + "....." );
				
try {
    server.start();
}
catch( ex ) {
    println("   --> Caught " + ex );
}

15.3. 新規リソースのデプロイ

この時点で、既存のアプリケーションを更新できます。次の手順では、CLI でリソースを作成し、JBoss サーバーにデプロイします。
最初に、アプリケーションのリソース種別を取得します。これは、複数のパラメーターにより異なります。
  1. アプリケーションのタイプ(WAR、EAR など)
  2. アプリケーションをデプロイする必要があるコンテナーのタイプ(Tomcat、JBoss AS 5 など)
注記
appType や appTypeName などのリソースタイプに関するすべての情報は、rhq-plugin.xml 記述子のリソースエージェントプラグインで定義されます。各デフォルトリソースタイプの属性、設定パラメーター、操作、およびメトリクスは、『リソース監視および操作リファレンス』 に一覧表示されます。
例:
var appType = ResourceTypeManager.getResourceTypeByNameAndPlugin( appTypeName, "JBossAS5" );
if( appType == null ) {
    println("  Could not find application type. Exit.");
    usage();
}
次に、アプリケーションのパッケージタイプを取得します。
var realPackageType = ContentManager.findPackageTypes( appTypeName, "JBossAS5" );
				
if( realPackageType == null ) {
    println("  Could not find JBoss ON's packageType. Exit.");
    usage();
}
JBoss ON の各リソースには、JBoss AS 5 リソースにデプロイされた WAR または EAR を含む設定パラメーターがあります。これは、説明的な情報と同様に、rhq-plugin.xml 記述子のリソースタイプのエージェントプラグインで定義されます。新しいリソースを作成できるようにするには、これらのパラメーターを入力する必要があります。
// create deployConfig 
var deployConfig = new Configuration();
deployConfig.put( new PropertySimple("deployExploded", "false"));
deployConfig.put( new PropertySimple("deployFarmed", "false"));
このメソッドを呼び出すと、パッケージタイプでサポートされるプロパティーのリストを呼び出すと、プロパティー名を取得できます。
var deployConfigDef = ConfigurationManager.getPackageTypeConfigurationDefinition(realPackageType.getId());
パッケージをバイト配列として提供します。
var inputStream = new java.io.FileInputStream(file);
var fileLength = file.length();
var fileBytes = java.lang.reflect.Array.newInstance(java.lang.Byte.TYPE, fileLength);
for (numRead=0, offset=0; ((numRead >= 0) && (offset < fileBytes.length)); offset += numRead ) {
    numRead = inputStream.read(fileBytes, offset, fileBytes.length - offset); 	
}
次に、リソースを作成します。この情報は、rhq-plugin.xml 記述子のリソースタイプのエージェントプラグインで定義されます。例:
ResourceFactoryManager.createPackageBackedResource(
    server.id,
    appType.id,
    packageName,
    null,  // pluginConfiguration
    packageName,
    packageVersion,
    null, // architectureId        
    deployConfig,
    fileBytes,
    null // timeout
);
指定の JBoss AS 5 サーバーインスタンスが稼働中であり、JBoss ON が実行していることを認識しているか、JBoss ON エージェントがサーバーにバイナリーコンテンツをアップロードできないことを示す例外が発生したことを確認します。

第16章 例: バンドルを使用したアプリケーションのデプロイ(JBoss EAP 4、5、および 6)

バンドルは、更新されたアプリケーションを JBoss EAP 6 サーバーにデプロイする非常にクリーンで簡単な方法です。バンドルシステムは、特定のパッケージの複数のバージョンを維持し、それらのバージョンを指定された互換性のあるグループにデプロイできます。これは、安定したバージョンを実稼働サーバーにデプロイでき、開発バージョンをテストマシンにデプロイできるため、アプリケーションのライフサイクルに最適なワークフローになります。

16.1. 新規アプリケーションの作成

cliRoot/rhq-remoting-cli-4.9.0.JON320GA/samples/modules ディレクトリーの jbossas.js スクリプトは、バンドルバージョンと定義を迅速に作成し、指定の JBoss サーバーにデプロイするカスタム関数のセットを定義します。
この jbossas.js スクリプトでは、関数をサポートするために util.js および bundles.js スクリプトが必要です。これらはすべて cliRoot/rhq-remoting-cli-4.9.0.JON320GA/samples/modules ディレクトリーから自動的に読み込まれます。
deploy-to-and-restart-JBAS.js スクリプトによって、という関数が定義されます。 createAppAndRestartJBAS これにより、バンドルが作成され、デプロイされます。関数は 7 つのパラメーターを取ります。
  • バンドルアーカイブファイルへのパス。
  • バンドル設定に必要なトークンまたは変数が含まれる設定オブジェクト。この例では、プロパティーは渡されず、値は null になります。設定の詳細については、bundles.js ファイルのコメントに表示され、一般的な設定情報が表示され 「シンプル設定プロパティーの変更」 ます。
  • バンドルをデプロイする互換性のあるグループの名前。
  • バンドル宛先の名前。
  • バンドル宛先の説明。
  • バンドルをデプロイするベースディレクトリー、およびオプションでバンドルをデプロイするサブディレクトリー。
例:
rhqadmin@localhost:7080$ var bundleZipFile = /export/bundles/myBundle.zip 
rhqadmin@localhost:7080$ var deploymentConfiguration = null
rhqadmin@localhost:7080$ var groupName = "JBoss EAP 6 Group"
rhqadmin@localhost:7080$ var destinationName = "My App - JBoss EAP 6 Destination"
rhqadmin@localhost:7080$ var destinationDescription = "For my application"
rhqadmin@localhost:7080$ var baseDirName = "Deploy Directory"
rhqadmin@localhost:7080$ var deployDir = "helloWorldApp"
rhqadmin@localhost:7080$ createAppAndRestartJBAS(bundleZipFile, deploymentConfiguration, groupName, destinationName, destinationDescription, baseDirName, deployDir)
deploy-to-and-restart-JBAS.js スクリプトには、サポートを提供する多くのプライベート関数が定義されています。 createAppAndRestartJBAS 関数。これらは deploy-to-and-restart-JBAS.js ファイルのコメントで説明されています。
注記
baseDirName 変数 値は or である必要があり Deploy Directory Profile Directoryます。この 2 つの場所は、スクリプトがアクセスする指定の JBoss EAP リソースの接続情報に基づいて識別されます。
The createAppAndRestartJBAS 関数には、リソースグループの検索、バンドルの作成、およびグループの JBoss サーバーを再起動する 3 つの部分があります。
最初の部分は、特定のグループをグループ名で検索し、単一のリソースグループのみに一致する必要があります。そうでない場合は、エラーを返します。
function createAppAndRestartJBAS(bundleZipFile, deploymentConfiguration, groupName, destinationName, destinationDescription, baseDirName, deployDir) {
    var gcrit = new ResourceGroupCriteria;
    gcrit.addFilterName(groupName);
    gcrit.fetchResourceType(true);

    var groups = ResourceGroupManager.findResourceGroupsByCriteria(gcrit);
    if (groups.empty) {
        throw "Could not find a resource group called " + groupName;
    } else if (groups.size() > 1) {
        throw "There are more than 1 groups called " + groupName;
    }

    var group = groups.get(0);
    var targetResourceType = group.resourceType;
検索手順の一部は、指定の互換性のあるグループのリソースタイプを取得することです。その後、そのリソースタイプは、グループに関連付けられたバンドル宛先の作成に使用されます。
次の部分はバンドルを作成し、サーバーリソースを再起動します。
    var deployFn = function(restartFn) {
バンドルデプロイメントの最初の部分は、バンドルアーカイブをアップロードし、JBoss ON 設定でバンドルバージョンを作成します。
        var bundleVersion = createBundleVersion(bundleZipFile);
次に、宛先を作成します。この宛先は、バンドルをデプロイする場所(ベースディレクトリーおよびデプロイメントディレクトリー)、互換性のあるグループおよびバンドルバージョンに関連付けられます。
        var destination = BundleManager.createBundleDestination(bundleVersion.bundle.id, destinationName, destinationDescription, baseDirName, deployDir, group.id);
宛先とバージョンが定義されたら、ターゲットリソースグループに保存してデプロイできます。
        var deployment = deployBundle(destination,bundleVersion, deploymentConfiguration, "Web application", false);

        if (deployment.status != BundleDeploymentStatus.SUCCESS) {
            throw "Deployment wasn't successful: " + deployment;
        }
デプロイメントが完了すると、スクリプトはグループメンバー(スクリプトのヘルプ機能のいずれかで定義されます deploy-to-and-restart-JBAS.js )を繰り返し処理し、各リソースを再起動します。その後、デプロイメント情報を出力します。
        restartFn(group);

        return deployment;
    };
deploy-to-and-restart-JBAS.js スクリプトは、サポートされるバージョンの JBoss EAP 4、5、または 6 にコンテンツをデプロイできます。バンドルシステムは、グループのリソースタイプに基づいて、リソースプラグインで定義された設定を使用します。再起動操作では、JBoss EAP の各バージョンごとに異なる再起動機能を定義します。
    if (targetResourceType.plugin == "JBossAS" && targetResourceType.name == "JBossAS Server") {
        return deployFn(_restartAS4);
    } else if (targetResourceType.plugin == "JBossAS5" && targetResourceType.name == "JBossAS Server") {
        return deployFn(_restartAS5);
    } else if (targetResourceType.plugin == "JBossAS7" &&
            (targetResourceType.name == "JBossAS7 Standalone Server" ||
                    targetResourceType.name == "JBossAS-Managed")) {
        return deployFn(_restartAS7);
    }

    throw "The resource group the destination targets doesn't seem to be a JBoss AS server group.";
}

16.2. アプリケーションの更新

バンドル定義がすでに存在するため、アプリケーションの更新は作成よりも簡単です。
アプリケーションを更新するには、更新されたバンドルアーカイブへのパス、設定するトークンまたはプロパティー、および既存のバンドル宛先を指定します。
rhqadmin@localhost:7080$ var bundleZipFile = /export/bundles/myBundle.zip 
rhqadmin@localhost:7080$ var deploymentConfiguration = null
rhqadmin@localhost:7080$ var jbasDestination = "My App - JBoss EAP 6 Destination"
rhqadmin@localhost:7080$ updateAppAndRestartJBAS(bundleZipFile, jbasDestination, deploymentConfiguration)
バンドルで入力されるポート番号など、トークンを最大にする必要がある場合には、設定オブジェクトを作成してその値を渡する必要があります。この例では、プロパティーは渡されず、値は null になります。設定の詳細については、bundles.js ファイルのコメントに表示され、一般的な設定情報が表示され 「シンプル設定プロパティーの変更」 ます。
宛先名または ID である宛先識別子は、互換性のあるグループのリソースタイプを取得するために基準検索で使用されます。これは create 関数と同様に、使用されている JBoss EAP のバージョンを特定します。
function updateAppAndRestartJBAS(bundleZipFile, jbasDestination, deploymentConfiguration) {
    // first figure out the jbas version we are deploying to
    var destinationId = jbasDestination;
    if (typeof(jbasDestination) == 'object') {
        destinationId = jbasDestination.id;
    }

    var destCrit = new BundleDestinationCriteria
    destCrit.fetchGroup(true)
宛先 ID を検索するために名前を使用します。宛先エントリーを取得する場合(を参照) get(0) call)、宛先設定にはリソースタイプが含まれます。
    var destinations = BundleManager.findBundleDestinationsByCriteria(destCrit);

    if (destinations.empty) {
        throw "No destinations corresponding to " + jbasDestination + " found on the server.";
    }

    var destination = destinations.get(0);

    var targetResourceType = destination.group.resourceType;

    if (targetResourceType == null) {
        throw "This function expects a compatible group of JBoss AS (4,5,6 or 7) resources but the provided destination is connected with " + destination.group;
    }
次に、新規バンドルアーカイブを新規バンドルバージョンとしてアップロードします。 createBundleVersion メソッド。
    var deployFn = function(restartFn) {
	var bundleVersion = createBundleVersion(bundleZipFile);
その後、設定オブジェクト(deploymentConfiguration)に定義されたトークンまたは必要なトークンと共に、新規バンドルバージョンを既存の宛先にデプロイます。デプロイメントが完了すると、グループの JBoss リソースを再起動し、デプロイメント情報を出力します。
        var deployment = deployBundle(destination,bundleVersion, deploymentConfiguration, "Web application", false);

        if (deployment.status != BundleDeploymentStatus.SUCCESS) {
            throw "Deployment wasn't successful: " + deployment;
        }

        restartFn(destination.group);

        return deployment;
    };
作成機能と同様に、サポートされる JBoss EAP のバージョン 4、5、または 6 にはバージョン固有の再起動方法があります。バンドルシステムは、グループのリソースタイプに基づいて、リソースプラグインで定義された設定を使用します。
    if (targetResourceType.plugin == "JBossAS" && targetResourceType.name == "JBossAS Server") {
        return deployFn(_restartAS4);
    } else if (targetResourceType.plugin == "JBossAS5" && targetResourceType.name == "JBossAS Server") {
        return deployFn(_restartAS5);
    } else if (targetResourceType.plugin == "JBossAS7" &&
            (targetResourceType.name == "JBossAS7 Standalone Server" ||
                    targetResourceType.name == "JBossAS-Managed")) {
        return deployFn(_restartAS7);
    }

    throw "The resource group the destination targets doesn't seem to be a JBoss AS server group.";
}

第17章 例: アラート後のリモート JNDI ルックアップ(JBoss EAP 5)

重要
このスクリプトは、-f パラメーターの使用やサーバー側のアラートスクリプトなど、サーバー上で直接実行されることが意図されています。インタラクティブ CLI を使用して実行することはできません。
アラートの応答でサーバー側のスクリプトを実行する方法は、『 Using JBoss Operations Network for Monitoring, Deploying, and Managing Resources 』を参照してください。
重要
セキュリティー上の理由から、アラート CLI スクリプトからローカル JNDI ルックアップを実行することはでき ません。リモート JNDI ルックアップを実行できます。
アラートシステムは、発生するアラートに対応してスクリプトを実行できます。JBoss AS 5 サーバーの応答の 1 つが JNDI ディレクトリーを確認し、JMX 情報を検索することです。
このスクリプトは最初に JNP 経由でリモート JNDI ディレクトリーに接続し、を使用します。 assertNotNull JMX オブジェクトを取得するメソッド。次に、スクリプトは JMX 情報を出力します。
//This test requires a remote JBoss AS 5 server running with JNDI directory remotely accessible using JNP (without authz)
//This script assumes that there is a bound object called "jmx" in the directory (which it should be)
var jbossHost = 'localhost';
var jbossJnpPort = 1299;

var env = new java.util.Hashtable();
env.put('java.naming.factory.initial', 'org.jboss.naming.NamingContextFactory');
env.put('java.naming.provider.url', "jnp://" + jbossHost + ":" + jbossJnpPort);
var ctx = new javax.naming.InitialContext(env);
var jmx = ctx.lookup('jmx');
assertNotNull(jmx);
pretty.print(jmx);

第18章 例: グループ化されたサーバーの管理(JBoss EAP 5)

多くのエンタープライズサーバーには 管理サーバー の概念があります。管理サーバーは、コンテンツをデプロイしたり、すべての登録アプリケーションサーバーに設定を送信する中央インスタンスがあることを意味します。管理者は、管理サーバーを使用することで、アクティブなアプリケーションサーバーすべてにデプロイされたパッケージおよび設定のバージョンが同じであることを確認することができます。
JBoss ON は、JBoss ON グループの全メンバーに対して同時にアクションを実行するために呼び出される管理スクリプトを作成することで、Tomcat や JBoss EAP 5 などのアプリケーションに対して管理対象またはクラスター化されたサーバーの動作をイミュレートできます。EAP 5 インスタンスはすべて機能的に管理されるサーバーですが、JBoss ON 自体はドメインコントローラーとして動作します。
注記
JBoss EAP 6 には JBoss EAP 5 とは異なるサーバートポロジーがあるため、ドメインコントローラー、管理対象ドメイン、およびドメイン設定はデフォルトで定義および管理可能です。

18.1. スクリプトの計画

JBoss ON CLI は、-f パラメーターを使用して定義された JavaScript を実行できます。ここでは、JBoss EAP サーバーのグループで特定のタスクを実行する小さな管理スクリプトを多数作成するという概念です。この例では、以下の 7 つのスクリプトがあります。
  • グループの作成
  • グループへの EAP インスタンスの追加
  • EAP ステータスの確認
  • EAP インスタンスの起動
  • 操作のスケジュール
  • グループへの新規コンテンツのデプロイメント
  • メトリクスの確認
ラッパースクリプトと設定ファイルは、1 つのコマンドのみを実行する必要があるようにセットアップされます。ラッパーは、ラッパーに渡されるコマンドに応じて適切な JBoss ON CLI スクリプトを実行します。

18.2. Wrapper スクリプトおよび .conf ファイルの作成

ラッパースクリプトはコマンドライン引数を取得し、スクリプトの 1 つを引数として JBoss ON CLI を呼び出します。コマンドライン引数自体は JBoss ON JavaScript ファイルで定義されます。
このラッパースクリプトは、いくつかの仮定を行います。
  • ラッパースクリプトは通常のユーザーとして実行します。つまり、JavaScript ファイルは通常のユーザーがアクセスできる必要があります。
  • スクリプトは、ラッパースクリプトと同じ scripts/ ディレクトリーにあるディレクトリーに置かれます。
  • 別の設定ファイルは、JBoss ON サーバーの接続情報を定義します。
  • 各 JavaScript ファイルは、ラッパーで定義される個別の CLI コマンド呼び出しによって呼び出されます。
  • JBoss ON CLI コマンドに必要なオプションや情報は JavaScript ファイルに定義され、ラッパースクリプトをオプションとして渡す可能性があります。
#!/bin/bash
#
# groupcontrol
# ------------
# This is a simple wrapper script for all the java script scripts in this folder.
# Start this script with some parameters to automate group handling from within the
# command line.
# 
# With groupcontrol you can do the following:
#   create   : Create a new group
#   addMember: Add a new EAP instance to the specified group
#   status   : Print the status of all resources of a group
#   start    : start all EAP instances specified by group name
#   deploy   : Deploys an application to all AS instances specified by group name
#   avail    : Runs an availability operation on all discovered agent instances
#   metrics  : Gets the specified metric value for all AS instances specified by group name
#
# 
			
## Should not be run as root.
if [ "$EUID" = "0" ]; then
   echo " Please use a normal user account and not the root account"
   exit 1
fi
		
## Figure out script home
MY_HOME=$(cd `dirname $0` && pwd)
SCRIPT_HOME=$MY_HOME/scripts
			
## Source some defaults
. $MY_HOME/groupcontrol.conf
			
## Check to see if we have a valid CLI home
if [ ! -d ${JON_CLI_HOME} ]; then
     echo "JON_CLI_HOME not correctly set. Please do so in the file"
     echo $MY_HOME/groupcontrol.conf
     exit 1
fi
			
RHQ_OPTS="-s $JON_HOST -u $JON_USER -t $JON_PORT"
# If JBoss ON_PWD is given then use it as argument. Else let the user enter the password
if [ "x$JON_PWD" == "x" ]; then
     RHQ_OPTS="$RHQ_OPTS -P"
else
     RHQ_OPTS="$RHQ_OPTS -p $JON_PWD"
fi
			
#echo "Calling groupcontrol with $RHQ_OPTS"
			
usage() {
     echo "  Usage $0:"
     echo "  Use this tool to control most group related tasks with a simple script."
     echo "  ------------------------------------------------------------------------- "
}
ラッパーが定義する各コマンドには、実行する JBoss ON CLI コマンドと、使用する JavaScript ファイルを定義する doCommand() セクションがあります。
doDeploy() {
     $JON_CLI_HOME/bin/rhq-cli.sh $RHQ_OPTS -f $SCRIPT_HOME/deploy.js $2 $3
}

doCreate() {
     $JON_CLI_HOME/bin/rhq-cli.sh $RHQ_OPTS -f $SCRIPT_HOME/group.js $2
}
					
doAddMember() {
     $JON_CLI_HOME/bin/rhq-cli.sh $RHQ_OPTS -f $SCRIPT_HOME/addMember.js $2 $3 $4
}	
			
doStatus() {
     $JON_CLI_HOME/bin/rhq-cli.sh $RHQ_OPTS -f $SCRIPT_HOME/status.js $2
}

doRestart() {
     $JON_CLI_HOME/bin/rhq-cli.sh $RHQ_OPTS -f $SCRIPT_HOME/restart.js $2 
}

doAvail() {
     $JON_CLI_HOME/bin/rhq-cli.sh $RHQ_OPTS -f $SCRIPT_HOME/avail.js
}	
		
doMetrics() {
     $JON_CLI_HOME/bin/rhq-cli.sh $RHQ_OPTS -f $SCRIPT_HOME/metrics.js $2 $3
}

case "$1" in
'deploy')
	doDeploy $*
	;;     
'create')
	doCreate $*
	;;     
'addMember')
	doAddMember $*
	;;     
'status')
	doStatus $*
	;;     
'restart')
	doRestart $*
	;;     
'avail')
	doAvail $*
	;;     
'metrics')
	doMetrics $*
	;;     
*)
        usage $*
        ;;
esac
このスクリプトは設定ファイルを使用します。このファイルを使用して groupcontrol.conf、JBoss ON CLI で必要な JBoss ON サーバーへの接続情報を定義します。
##	
## This file contains some defaults for the groupcontrol script
##
JON_CLI_HOME=cliRoot/rhq-remoting-cli-4.9.0.JON320GA
JON_HOST=localhost
JON_PORT=7080
			
# The user you want to connect with
JON_USER=rhqadmin
			
# if you omit the password here, you'll be prompted for it.
JON_PWD=rhqadmin

18.3. CLI スクリプトの引数とその他のパラメーターの定義

複数のグループまたは一部のタスク(リソースの検索や操作の実行など)がある場合があります。
各 JavaScript ファイルは、の独自のスクリプトオプションを定義できます。 args メソッド。最低でも、各スクリプトはタスクを実行するグループの名前を受け入れます。
また、定義する方がよいでしょう。 使用方法 関数。各コマンドで想定されるオプションを出力できるようにします。例:
function usage() {
        println("Usage: deploy groupName");
        throw "Illegal arguments";
}

if( args.length < 1 ) usage();
var groupName = args[0];
注記
スクリプトの引数を追加する場合は、CLI 呼び出しのラッパースクリプトに適切なトークン数を設定してください。たとえば、groupName および fileName の場合にはを追加し $2 $3ます。
doDeploy() {
      $JON_CLI_HOME/bin/rhq-cli.sh $RHQ_OPTS -f $SCRIPT_HOME/deploy.js $2 $3
}
グループを作成するスクリプトのほかにも、すべてのスクリプトには、その操作を実行するためのグループの検索も追加する必要があります。例:
groupcriteria = new ResourceGroupCriteria();
groupcriteria.addFilterName(groupName);

var groups = ResourceGroupManager.findResourceGroupsByCriteria(groupcriteria);
if( groups != null ) {
  if( groups.size() > 1 ) {
        println("Found more than one group.");
  }
  else if( groups.size() == 1 ) {
     group = groups.get(0);
  }
}

18.4. グループの作成: group.js

スクリプトを設定します。このスクリプトは、新しいグループ名(groupName)に引数を 1 つだけ使用します。この例のリソースタイプは JBoss AS 5 サーバーである JBossAS5 にハードコーディングされています。任意で、他の JBoss バージョンを指定できるように、プラグイン名とタイプを設定する引数を追加することもできます。
function usage() {
        println("Usage: deploy groupName");
        throw "Illegal arguments";
}

if( args.length < 1 ) usage();
var groupName = args[0];
グループを作成します。
var rg = new ResourceGroup(resType);
rg.setRecursive(false);
rg.setDescription("Created via groupcontrol scripts on " + new java.util.Date().toString());
rg.setName(groupName);

rg = ResourceGroupManager.createResourceGroup(rg);

var resType = ResourceTypeManager.getResourceTypeByNameAndPlugin("JBossAS 5 Server","JBossAS5");

18.5. グループへのリソースの追加: addMember.js

スクリプトを設定します。これは、スクリプトに必要な 3 つの引数を特定します。
  • リソースを追加するグループ GroupName
  • 追加するリソース名のresourceName。これは検索条件の 1 つです。
  • 追加するリソース タイプの resourceTypeName。これは検索条件の 1 つです。
これには、引数で指定されたグループを検索する検索も含まれます。
function usage() {
        println("Usage: addMember groupName resourceName resourceTypeName");
        throw "Illegal arguments";
}

if( args.length < 3 ) usage();
var groupName = args[0];
var resourceName = args[1];
var resourceTypeName = args[2];

groupcriteria = new ResourceGroupCriteria();
groupcriteria.addFilterName(groupName);

var groups = ResourceGroupManager.findResourceGroupsByCriteria(groupcriteria);
if( groups != null ) {
  if( groups.size() > 1 ) {
        println("Found more than one group.");
  }
  else if( groups.size() == 1 ) {
     group = groups.get(0);
  }
}
グループに追加するリソースを検索します。このスクリプトは、グループに単一のリソースのみを追加するように設計されているため、指定の検索基準 resourceName および resourceTypeName は、単一のリソースのみに一致するのに十分な仕様である 必要 があります。
criteria = new ResourceCriteria();
criteria.addFilterName(resourceName);
criteria.addFilterResourceTypeName(resourceTypeName);

var resources = ResourceManager.findResourcesByCriteria(criteria);
if( resources != null ) {
  if( resources.size() > 1 ) {
        println("Found more than one JBossAS Server instance. Try to specialize.");
     for( i =0; i < resources.size(); ++i) {
          var resource = resources.get(i);
          println("  found " + resource.name );
     }
  }
  else if( resources.size() == 1 ) {
     resource = resources.get(0);
     println("Found one JBossAS Server instance. Trying to add it.");
     println("  " + resource.name );
        ResourceGroupManager.addResourcesToGroup(group.id, [resource.id]);
     println("  Added to " + group.name + "!");
  }
  else {
        println("Did not find any JBossAS Server instance matching your pattern. Try again.");
  }
}
このスクリプトの実行時に、見つかった JBoss インスタンスの名前とグループに追加された内容が出力されます。
[jsmith@server cli]$ ./wrapper.sh addMember myGroup "JBossAS App 1" "JBossAS Server"
Remote server version is: 3.0.1.GA (b2cb23b:859b914)
Login successful
Found one JBossAS Server instance. Trying to add it.
  AS server.example.com JBossAS App 1
  Added to myGroup!

18.6. Inventory and Status Information: status.js

これは、グループ内のすべての JBoss インスタンスの現在の状態を出力する簡単なスクリプトです。
他のスクリプトと同様に、グループ情報を設定します。
function usage() {
        println("Usage: status groupName");
        throw "Illegal arguments";
}

if( args.length < 1 ) usage();
var groupName = args[0];

groupcriteria = new ResourceGroupCriteria();
groupcriteria.addFilterName(groupName);

var groups = ResourceGroupManager.findResourceGroupsByCriteria(groupcriteria);
if( groups != null ) {
  if( groups.size() > 1 ) {
        println("Found more than one group.");
  }
  else if( groups.size() == 1 ) {
     group = groups.get(0);
  }
}
グループを基にして、リソースを検索する情報も追加します。
criteria = new ResourceCriteria();

var groupArray= new Array();
groupArray[0]=group.id;
criteria.addFilterExplicitGroupIds(groupArray);

var resources = ResourceManager.findResourcesByCriteria(criteria);
for( i =0; i < resources.size(); ++i) {
     var resource = resources.get(i);
     println("  found " + resource.name );
}
次に、リソースを使用して実行し、その可用性を出力します。
var server = ProxyFactory.getResource(resource.id);
var avail  = AvailabilityManager.getCurrentAvailabilityForResource(server.id);

println("  " + server.name );
println("    - Availability: " + avail.availabilityType.getName());
println("    - Started     : " + avail.startTime.toGMTString());
println("");

var avail = AvailabilityManager.getCurrentAvailabilityForResource(server.id);

if( avail.availabilityType.toString() == "DOWN" ) {
           println("  Server is DOWN. Please first start the server and run this script again!");
           println("");
}
スクリプトの実行時には、サーバーの可用性と最終開始時間を出力します。
[jsmith@server cli]$ ./wrapper.sh status myGroup
Remote server version is: 3.0.1.GA (b2cb23b:859b914)
Login successful
  found AS server.example.com JBossAS App 1
  AS server.example.com JBossAS App 1
    - Availability: UP
    - Started     : 11 Feb 2012 04:07:37 GMT

18.7. サーバーの起動、停止、再起動: restart.js

にあるように、使用情報とグループ検索でスクリプトを設定し 「Inventory and Status Information: status.js」 ます。
この例では、1 つの操作のみを実行し、JBoss サーバーを再起動します。これは、グループ内のすべてのリソースを繰り返し処理します。
サーバーを起動および停止するために同様のスクリプトを作成できます。
  • shutdown() AS4 サーバーおよび AS shutDown() 5 サーバーの場合
  • start()
criteria = new ResourceCriteria();

var groupArray= new Array();
groupArray[0]=group.id;
criteria.addFilterExplicitGroupIds(groupArray);

var resources = ResourceManager.findResourcesByCriteria(criteria);
for( i =0; i < resources.size(); ++i) {
     var resource = resources.get(i);
     var resType = resource.resourceType.name;
     println("  found " + resource.name );

     if( resType != "JBossAS Server") {
          println("    ---> Resource not of required type. Exiting!");
          usage();
     }

     var server = ProxyFactory.getResource(resource.id);
     println("    stopping " + server.name + "....");
     try {
         server.shutdown()
     }
     catch( ex ) {
         println("   --> Caught " + ex );
     }
				
     println("    restarting " + server.name + "....." );
     try {
         server.start();
     }
     catch( ex ) {
         println("   --> Caught " + ex );
     }
}

18.8. グループメンバーへのアプリケーションのデプロイ: deploy.js

他のスクリプトのように使用情報とグループ検索を設定し、に記載のデプロイメントスクリプトを使用し 15章例: リソースデプロイメントのスクリプト作成(JBoss EAP 5) ます。
スクリプトは、グループ名に、ファイルのアップロードに使用するパラメーターを 2 つ使用します。
簡単な改善として、JBoss サーバーを 「JBoss ON グループおよびインベントリーの確認」 停止し、コンテンツをアップロードして再起動します。代わりに、サーバーが最初に実行していることを確認してからコンテンツをアップロードします。
// we need check to see if the given server is up and running
var avail = AvailabilityManager.getCurrentAvailabilityForResource(server.id);
				
// unfortunately, we can only proceed with deployment if the server is running. Why?
if( avail.availabilityType.toString() == "DOWN" ) {
	   println("  Server is DOWN. Please first start the server and run this script again!");
	   println("");
	   continue;
}

18.9. 可用性操作のスケジュール: avail.js

このスクリプトセットの他のタスクとは異なり、操作タスクはエージェントで実行されるため、グループまたは JBoss リソースを検索する必要はありません。これにより、エージェントで可用性スキャンが実行されます。また、この Execute prompt command 操作を使用してエージェントで特定のコマンドを実行することもできます。
まず、すべてのエージェントリソース一覧を取得します。
println("Scanning all RHQ Agent instances");
var rc = ResourceCriteria();
var resType = ResourceTypeManager.getResourceTypeByNameAndPlugin("RHQ Agent", "RHQAgent");
rc.addFilterPluginName("RHQAgent");
rc.addFilterResourceTypeName("RHQ Agent");
rc.addFilterParentResourceTypeId("10001");

var resources = ResourceManager.findResourcesByCriteria(rc).toArray();

var idx=0;
for( i in resources ) {
     if( resources[i].resourceType.id == resType.id ) {
          resources[idx] = resources[i];
          idx = idx + 1;
     }
}
次に、エージェントアレイを通過し、操作をスケジュールします。
for( a in resources ) {
     var agent = resources[a]

     var resType = agent.resourceType.name;
     println("  Found resource " + agent.name + " of type " + resType + " and ID " + agent.id);

     println("  executing availability scan on agent" );
     println("    -> " + agent.name + " / " + agent.id);
     var config = new Configuration();
     config.put(new PropertySimple("changesOnly", "true") );
     var ros = OperationManager.scheduleResourceOperation(
          agent.id,
          "executeAvailabilityScan",
          0,
          1,
          0,
          10000000,
          config,
          "test from cli"
     );

     println(ros);
     println("");
}

18.10. 管理対象サーバーのメトリックデータの収集: metrics.js

JBoss ON は、各リソースタイプのメトリクスを多数収集します。この情報は、を使用して取得できます。 findLiveData メソッド。リソースの現在のアクティブな値を返します。
このスクリプトは、groupName と metricName の 2 つの引数を取り ます。他のスクリプトと同様に、これによりグループが検索され、次にグループ ID でリソースが検索されます。
function usage() {
        println("Usage: metrics groupName metricName");
        throw "Illegal arguments";
}

if( args.length < 2 ) usage();
var groupName = args[0];
var metricName = args[1];

groupcriteria = new ResourceGroupCriteria();
groupcriteria.addFilterName(groupName);

var groups = ResourceGroupManager.findResourceGroupsByCriteria(groupcriteria);
if( groups != null ) {
  if( groups.size() > 1 ) {
        println("Found more than one group.");
  }
  else if( groups.size() == 1 ) {
     group = groups.get(0);
  }
}

criteria = new ResourceCriteria();
var groupArray= new Array();
groupArray[0]=group.id;
criteria.addFilterExplicitGroupIds(groupArray);
実際のメトリクス検索は、リソースタイプで利用可能なメトリクスを検索します(この例では JBoss AS 5 にハードコーディングされています)。メトリクス自体は、metricName 引数 によってのみ識別されます。
var rt = ResourceTypeManager.getResourceTypeByNameAndPlugin("JBossAS 5 Server","JBossAS5");
var mdc = MeasurementDefinitionCriteria();
mdc.addFilterDisplayName(metricName);
mdc.addFilterResourceTypeId(rt.id);
var mdefs =  MeasurementDefinitionManager.findMeasurementDefinitionsByCriteria(mdc);
var resources = ResourceManager.findResourcesByCriteria(criteria);
var metrics = MeasurementDataManager.findLiveData(resources.get(0).id, [mdefs.get(0).id]);

if( metrics !=null ) {
        println(" Metric value for " + resources.get(0).id + " is " + metrics );
}
スクリプトの実行時に、リソース ID とメトリクスの現在の値を出力します。
[jsmith@server cli]$ ./wrapper.sh metrics myGroup "Active Thread Count"
Remote server version is: 3.0.1.GA (b2cb23b:859b914)
Login successful
 Metric value for 10003 is [MeasurementDataNumeric[value=[64.0], MeasurementData [MeasurementDataPK: timestamp=[Wed Feb 15 22:14:38 EST 2012], scheduleId=[1]]]]

第19章 例: スタンドアロンサーバーのクラスターへのデプロイ(JBoss EAP 6)

cliRoot /rhq-remoting-cli-4.9.0.JON320GA/samples ディレクトリーにサンプルスクリプトがあり、JBoss EAP 6 スタンドアロンサーバーを既存のクラスターに追加できるようにする一連の機能を定義します。
JBoss EAP 6 には ドメイン の概念があり、設定を共有する サーバーグループ に分割できます。サーバーグループを使用すると、複数のサーバーインスタンスに一貫性があり、統一された構成設定が可能になり、プロファイルを共有し、中央のコマンドポイントで同じアプリケーションをデプロイすることができます。
しかし、JBoss EAP 6 にはドメインまたはサーバーグループに関連していない単一の JBoss インスタンスという従来のスタンドアロンサーバーの概念があります。スタンドアロンサーバーは クラスター に参加できます。これは連携して、負荷分散または高可用性向けのワークロードを分散するために連携するスタンドアロンサーバーの緩やかな関連付けです。ドメインとは異なり、クラスターは設定やコンテンツを管理しません。
JBoss ON では、スタンドアロンサーバーの設定およびコンテンツに対する集中管理が提供され、EAP 6 ドメインが提供する管理が容易になります。この cliRoot/rhq-remoting-cli-4.9.0.JON320GA/samples/modules/jbossas.js ファイルは、クラスターサーバー、デプロイされたコンテンツ、および関連する設定の特定を簡素化する便利な機能を定義します。
定義された関数の一括はプライベートで、cliRoot/rhq-remoting-cli-4.9.0.JON320GA/samples/modules/jbossas.js ファイル内で適切に文書化されるため、この例では範囲外です。この主な目的は、2 つのクラスター管理タスクを実行する 2 つのパブリック機能を確認することです。
  • addToCluster
  • copyDeployments

19.1. スタンドアロン EAP 6 サーバーをクラスターに追加

クラスターは、同じネットワークにある同じマルチキャストプロパティーを使用するサーバーによって定義されます。サーバーが同じ設定と設定されている場合、それらはいずれもクラスターで自動的に相互に関連付けられます。
クラスターにはスタンドアロンサーバーの設定プロパティーが 3 つあります。
  • クラスター内で使用する JBoss インスタンスの特定名( node-name)
  • マルチキャストポート、UDP ポート、マルチキャストアドレスを含むマルチキャスト設定
  • mod_cluster によって使用される socket-binding グループ情報
クラスターは、設定プロパティーまたはデプロイされたコンテンツを直接管理しません。しかし、2 つの EAP 6 スタンドアロンサーバーが JBoss ON インベントリーにある場合、JBoss ON はブリッジとして機能し、サーバー間の設定とコンテンツデプロイメントを比較し、サーバー間のコンテンツデプロイメントを比較します。この比較は addToCluster 関数を使用してスタンドアロンサーバーをクラスターに追加します。既存のクラスターメンバーの設定プロパティーを使用し、それらをスタンドアロンサーバーにコピーします。
スクリプトの実行には、スタンドアロンサーバーの名前、既存のクラスターメンバーの名前、スタンドアロンサーバーのノード名、および既存クラスターから新規メンバーにデプロイメントをコピーするかどうかを設定するブール値が必要です。
スタンドアロンサーバーのリソース ID と既存のクラスターメンバーがすでに分かっていることを前提とします。
[root@server bin]# ./rhq-cli.sh -u rhqadmin -p rhqadmin
rhqadmin@localhost:7080$ var newAs7Resource = ProxyFactory.getResource(10381) 
rhqadmin@localhost:7080$ var existingClusterMemberResource = ProxyFactory.getResource(10577) 
rhqadmin@localhost:7080$ var newNodeName = jbas7-standalone1
rhqadmin@localhost:7080$ addToCluster(newAs7Resource, newNodeName, existingClusterMemberResource, true)
The addToCluster function は、2 つのサーバー間のキャッシュ設定が、個別のサブシステムのコンクリメントキャッシュとキャッシュコンテナーの両方に互換性があることを前提とします。
スクリプトは、クラスターからスタンドアロンサーバーに設定をコピーするいくつかの手順で実行されます。
  1. これは、クラスターサーバーのプラグイン接続プロパティーを確認し、これをスタンドアロンサーバーのプラグイン接続プロパティーと比較します。必要な場合は、クラスターサーバーからプラグイン設定をコピーし、スタンドアロンサーバーを再起動して、新しい設定を読み込むようにします。
  2. スタンドアロンサーバーの指定されたノード名を確認します。必要に応じて、デフォルトのノード名を関数で渡します。
  3. 次に、クラスターおよびスタンドアロンサーバーの socket-binding 設定を比較します。必要な場合は、jgroups、messaging、および mod_cluster バインディングの socket-binding 設定をクラスターサーバーからコピーし、スタンドアロンサーバーを再起動します。
  4. 設定されている場合、スクリプトはデプロイメントをクラスターサーバーからスタンドアロンサーバーにコピーし、スタンドアロンサーバーを再起動します。
関数の最初の部分はプラグイン設定をプルします(プライベート機能で定義されます)。 _getClusterSignificantConfig)をクリックします。
function addToCluster(newAs7Resource, newNodeName, existingClusterMemberResource, copyDeployments) {
    println("Reading config of the existing cluster member");
    var clusterConfig = _getClusterSignificantConfig(existingClusterMemberResource);

    println("Reading config of the new member");
    var memberConfig = _getClusterSignificantConfig(newAs7Resource);

    var memberResourceConfiguration = newAs7Resource.resourceConfiguration;
設定プロパティーが異なる場合、スクリプトは新しいプラグイン設定に対してコピーされ、スタンドアロンサーバーを再起動して新しい接続設定を読み込むようにします。
    if (memberConfig['config'] != clusterConfig['config']) {
        println("The configurations of the servers differ.\n" +
            "The new cluster member's configuration will be changed to match the configuration of the existing member.");

        //switch to the same configuration
        var pluginConfig = newAs7Resource.pluginConfiguration;
        pluginConfig.getSimple('config').setValue(clusterConfig['config']);
        newAs7Resource.updatePluginConfiguration(pluginConfig);

        //we need to restart straight away so that we see the changes to the
        //rest of the configuration caused by the change of current config.
        println("Restarting the new cluster member to switch it to the new configuration.");
        newAs7Resource.restart();

        //refresh the resource
        newAs7Resource = ProxyFactory.getResource(newAs7Resource.id);

        //refresh the cluster specific config after the restart with the new
        //config
        memberConfig = _getClusterSignificantConfig(newAs7Resource);
        memberResourceConfiguration = newAs7Resource.resourceConfiguration;
    }
次に、スクリプトで指定したノード名を適用します(デフォルトでは設定したものと異なる場合)。
    //now check what's the node name we see
    if (memberConfig['node-name'] != newNodeName) {
        println("Updating the node name of the new cluster member from '" + memberConfig['node-name'] + "' to '" + newNodeName + "'");
        _updateNodeName(memberResourceConfiguration, newNodeName);
        newAs7Resource.updateResourceConfiguration(memberResourceConfiguration);
     }
クラスターの次の設定エリアは、重要なサブシステム、jgroups、messaging、および mod_cluster の socket-binding 設定です。
    //now apply the socket binding changes for jgroups and other cluster
    //significant subsystems
    //first find the socket binding group config in the new member
    for(i in newAs7Resource.children) {
        var child = newAs7Resource.children[i];
        if (child.resourceType.name == 'SocketBindingGroup' &&
                child.resourceType.plugin == 'jboss-as-7') {
			

            println("Updating socket bindings of jgroups, messaging and modcluster subsystems");

            var portOffset = javascriptString(child.resourceConfiguration.getSimpleValue('port-offset', '0'));
            var clusterMemberPortOffset = clusterConfig['port-offset'];

            var newConfig = child.resourceConfiguration.deepCopy(false);

            _updateSocketBindings(newConfig, portOffset, clusterMemberPortOffset, clusterConfig['jgroups']);
            _updateSocketBindings(newConfig, portOffset, clusterMemberPortOffset, clusterConfig['messaging']);
            _updateSocketBindings(newConfig, portOffset, clusterMemberPortOffset, clusterConfig['modcluster']);

            child.updateResourceConfiguration(newConfig);
        }
    }

    println("Restarting the new member for the new socket bindings to take effect.");
    newAs7Resource.restart();
厳密にはクラスター設定の一部ではありませんが、JBoss ON ではデプロイされたアプリケーションなどのリソース設定の他の部分を比較します。デプロイされたアプリケーションを 1 台のサーバー間で同期し、スタンドアロンインスタンスも維持します。また、特定のクラスターサーバーのデプロイメントを同期して、サーバーがクラスターに追加されるタイミングで便利です。
    if (copyDeployments) {
        println("Copying the deployments to the new cluster member...");
        copyDeployments(existingClusterMemberResource, newAs7Resource);

        println("Restarting the new cluster member.");
        newAs7Resource.restart();
    }
}

19.2. スタンドアロンサーバー間のデプロイ済みアプリケーションのコピー

EAP 6 のサーバーグループは、すべてのグループメンバーに対してコンテンツを一元管理しますが、スタンドアロンサーバーはそれ自体で管理されます。JBoss ON は、個別のサーバーインスタンス間でアプリケーションコンテンツを同期するための仲介として役立ちます。The addToCluster この関数は、スタンドアロンサーバーをクラスターに参加させる際のオプションとして機能します。The copyDeployments 関数は、任意の 2 つのスタンドアロンインスタンス間でデプロイメントをコピーすることができます。
関数を呼び出すには、ソース EAP 6 サーバーの名前( からデプロイメントをコピーする)と、ターゲット EAP 6 サーバーの名前(デプロイメントのコピー先となるサーバー のみが必要です。
2 つの EAP 6 サーバーリソースのリソース ID がすでに分かっている場合は、ソースリソースとターゲットリソースを設定します。たとえば、インタラクティブモードでは以下のようになります。
[root@server bin]# ./rhq-cli.sh -u rhqadmin -p rhqadmin
rhqadmin@localhost:7080$ var source = ProxyFactory.getResource(10381) 
rhqadmin@localhost:7080$ var target = ProxyFactory.getResource(10577) 
rhqadmin@localhost:7080$ copyDeployments(source, target)
関数の最初の部分は、サーバーリソース ID を取得します。
function copyDeployments(sourceAS7, targetAS7) {
    if (typeof sourceAS7 == 'object') {
        sourceAS7 = sourceAS7.id;
    }

    if (typeof targetAS7 == 'object') {
        targetAS7 = targetAS7.id;
    }
デプロイされたアプリケーションはすべて、ソース JBoss EAP 6 サーバーの子としてリストされます。The copyDeployments function は、デプロイメントリソースタイプのサーバーの子をすべて検索して、各デプロイメントを取得します。
    var deploymentResourceType = ResourceTypeManager.getResourceTypeByNameAndPlugin('Deployment', 'jboss-as-7');

    var deploymentsCrit = new ResourceCriteria;
    deploymentsCrit.addFilterParentResourceId(sourceAS7);
    deploymentsCrit.addFilterResourceTypeId(deploymentResourceType.id);

    var unlimitedPageControl = PageControl.unlimitedInstance;

    var sourceDeployments = ResourceManager.findResourcesByCriteria(deploymentsCrit);
    var iterator = sourceDeployments.iterator();
    while (iterator.hasNext()) {
        var deploymentResource = iterator.next();
        //get a resource proxy for easy access to configurations, etc.
        deploymentResource = ProxyFactory.getResource(deploymentResource.id);

	println("Copying deployment " + deploymentResource.name);
検出された各デプロイメントは、新しい子リソースとしてターゲットサーバーにコピーされます。これらはコンテンツベースのリソースであるため、それらをコンテンツとしてエクスポートおよびアップロードします。この関数は、コンテンツメタデータとコンテンツ履歴の検索およびプルも行います。これにより、デプロイメントに関する重要な履歴情報もコピーされます。
        var installedPackage = ContentManager.getBackingPackageForResource(deploymentResource.id);
        var content = ContentManager.getPackageBytes(deploymentResource.id, installedPackage.id);

        var runtimeName = deploymentResource.resourceConfiguration.getSimpleValue('runtime-name', deploymentResource.name);

        var deploymentConfiguration = new Configuration;
        deploymentConfiguration.put(new PropertySimple('runtimeName', runtimeName));

        //so now we have both metadata and the data of the deployment, let's
        //push a copy of it to the target server
        var history = ResourceFactoryManager.createPackageBackedResource(targetAS7,
            deploymentResourceType.id, deploymentResource.name,
            deploymentResource.pluginConfiguration,
            installedPackage.packageVersion.generalPackage.name,
            installedPackage.packageVersion.version,
            installedPackage.packageVersion.architecture.id,
            deploymentConfiguration, content, null);

        while (history.status.name() == 'IN_PROGRESS') {
            java.lang.Thread.sleep(1000);
            //the API for checking the create histories is kinda weird..
            var histories = ResourceFactoryManager.findCreateChildResourceHistory(targetAS7, null, null, unlimitedPageControl);
            var hit = histories.iterator();
            var found = false;
            while(hit.hasNext()) {
                var h = hit.next();

                if (h.id == history.id) {
                    history = h;
                    found = true;
                    break;
                                           
                }
            }

            if (!found) {
                throw "The history object for the deployment seems to have disappeared, this is very strange.";
            }
        }

        println("Deployment finished with status: " + history.status.toString() +
            (history.status.name() == 'SUCCESS' ? "." : (", error message: " + history.errorMessage + ".")));
    }
}

第20章 例: バンドルでのアプリケーションのデプロイ(一般的な)

バンドルは、完全なアプリケーション、設定ファイル、その他のコンテンツをリソースにデプロイする非常にクリーンかつ簡単な方法です。指定のリソースタイプがバンドルをサポートするかどうかは、プラグイン記述子で定義されます。デフォルトでは、プラットフォームリソースおよび JBoss AS 4、5、および 6 リソースはすべてサポートバンドルをサポートします。
バンドルは、すべてのコンテンツがリソースに依存しない単一の場所で維持されるため、管理観点からは便利です。メインバンドルエントリーまたはバンドル定義には、実際のバンドルファイルのバージョンと、そのコンテンツをデプロイできる宛先のセットが含まれます。宛先は、互換性のあるグループ、リソースタイプ、ディレクトリーパスの組み合わせです。バージョンが実際に宛先にデプロイされると、その宛先の特定のデプロイメントとして保存されます。
バンドルシステムは、特定のパッケージの複数のバージョンを維持し、それらのバージョンを任意の宛先にデプロイできます。これは、安定したバージョンを実稼働サーバーにデプロイでき、開発バージョンをテストマシンにデプロイできるため、アプリケーションのライフサイクルに最適なワークフローになります。宛先の別の子として表現される各デプロイメントを使用すると、変更を元に戻すことが容易になります。ライブバージョンから以前のバージョンに移動し、以前のデプロイメントがどのような表示であるかを正確に把握することができます。

20.1. バンドルバージョンおよび宛先の設定

バンドル定義には、バンドルバージョンと宛先という 2 つの部分があります。これらの部分はいずれも独立して設定され、最終的な定義に保存されます。
cliRoot/rhq-remoting-cli-4.9.0.JON320GA/samples/modules/ ディレクトリーの bundles.js スクリプトは、バンドルバージョンと定義を迅速に作成するカスタム関数のセットを定義します。(この bundles.js スクリプトには util.js スクリプトが必要です。)
宛先を作成するには、アップロードするバンドルアーカイブにローカルシステムの絶対パスを付与します。
rhqadmin@localhost:7080$ var path = '/export/files/myApp.zip'
rhqadmin@localhost:7080$ createBundleVersion(path)
The createBundleVersion bundles.js ファイルの関数は、ファイルをバイト配列としてアップロードします。
function createBundleVersion(pathToBundleZipFile) {
        var bytes = getFileBytes(pathToBundleZipFile)
        return BundleManager.createBundleVersionViaByteArray(bytes)
}
バンドル定義の 2 番目の部分は、バンドルバージョンをデプロイできる宛先を少なくとも 1 つ作成することです。宛先を作成するには、以下の 2 つの項目がすでに存在している必要があります。
  • バンドルバージョン(で作成したバンドルバージョン) createBundleVersion)
  • 互換性のあるグループ
宛先は、互換性のあるグループとデプロイ先のディレクトリーの組み合わせです。各リソースタイプは、独自の利用可能なベースディレクトリーを定義し、その root 下のサブディレクトリーをデプロイメントディレクトリーとして指定できます。
その他の設定プロパティーは、宛先名や説明など、エントリーの詳細です。
rhqadmin@localhost:7080$ var destinationName = 'New Destination'
rhqadmin@localhost:7080$ var description = 'My new example destination'
rhqadmin@localhost:7080$ var bundleName = 'myApp'
rhqadmin@localhost:7080$ var groupName = 'Linux Group'
rhqadmin@localhost:7080$ var baseDirName = '/'
rhqadmin@localhost:7080$ var deployDir = 'var/www/html/'
rhqadmin@localhost:7080$ createBundleDestination(destinationName, description, bundleName, groupName, baseDirName, deployDir)
The createBundleDestination 関数は、指定された名前に基づいてグループとバンドルの検索を実行します。これにより、追加の検索を実行せずに宛先を設定できます。
function createBundleDestination(destinationName, description, bundleName, groupName, baseDirName, deployDir) {
        var groupCrit = new ResourceGroupCriteria;
        groupCrit.addFilterName(groupName);
        var groups = ResourceGroupManager.findResourceGroupsByCriteria(groupCrit);

... 8< ...

        var group = groups.get(0);

        var bundleCrit = new BundleCriteria;
        bundleCrit.addFilterName(bundleName);
        var bundles = BundleManager.findBundlesByCriteria(bundleCrit);

... 8< ...
}

20.2. バンドルのデプロイ

バンドルをデプロイすると、バンドルバージョンが特定の宛先に送信されます。cliRoot/rhq-remoting-cli-4.9.0.JON320GA/samples/modules/bundles.js ファイルに関数があります。deployBundleこれは非常に簡単なものですが、最初に情報を取得する必要があります。
宛先の ID を取得します。これは、名前で宛先を検索します。
rhqadmin@localhost:7080$ var destinationName = "New Destination"
rhqadmin@localhost:7080$ var destcrit = new BundleDestinationCriteria()
rhqadmin@localhost:7080$ destcrit.addFilterName(destinationName)

var dest = BundleManager.findBundleDestinationsByCriteria(destcrit)
次に、デプロイするバンドルバージョンの ID 番号を取得します。最新 バージョンだけでなく、すべてのバージョンをデプロイできます。このスクリプトは、バンドルのすべてのバージョンとその ID 番号を出力します。
rhqadmin@localhost:7080$ var crit = new BundleVersionCriteria()

rhqadmin@localhost:7080$ crit.addFilterBundleName(name)

rhqadmin@localhost:7080$ var vers = BundleManager.findBundleVersionsByCriteria(crit)

rhqadmin@localhost:7080$ if( vers != null ) { \
rhqadmin@localhost:7080$   if( vers.size() > 1 ) { \
rhqadmin@localhost:7080$      for( i =0; i < vers.size(); ++i) { \
rhqadmin@localhost:7080$           ver = vers.get(i); \
rhqadmin@localhost:7080$           println("Version: " + ver.version + "   " + "ID: " + ver.id) \
rhqadmin@localhost:7080$      } \
rhqadmin@localhost:7080$   } \
rhqadmin@localhost:7080$   else if( vers.size() == 1 ) { \
rhqadmin@localhost:7080$      ver = vers.get(0); \
rhqadmin@localhost:7080$      println("Version: " + ver.version + + "   " + "ID: " + ver.id) \
rhqadmin@localhost:7080$   } \
rhqadmin@localhost:7080$ }
Version: 2.0 ID: 10021
Version: 1.0 ID: 10012
この 2 つの ID 番号を使用して、バンドルをデプロイすることができます。最初のパラメーターは宛先 ID、バンドルバージョン ID、バンドル設定にトークンがある場合には設定オブジェクトです。この例では、プロパティーは渡されず、値は null になります。設定の詳細については、bundles.js ファイルのコメントに表示され、一般的な設定情報が表示され 「シンプル設定プロパティーの変更」 ます。
rhqadmin@localhost:7080$ deployBundle(dest.get(0).id,10021,null,'my description',true)
BundleDeployment:
                     bundleVersion: BundleVersion[id=10021,name=null,version=null]
                     configuration: Configuration[id=15021]
                             ctime: 1337286719259
                       description: my description
                       destination: BundleDestination[id=10021, bundle=driftBundle, group=Linux Group - Thu May 10 15:10:28 EDT 2012, name=NewDestination]
                          duration: 0
                      errorMessage:
                                id: 10051
                              live: true
                             mtime: 1337286719259
                              name: Deployment [1] of Version [2.0] to [NewDestination]
        replacedBundleDeploymentId:
               resourceDeployments: [BundleResourceDeployment: bdd=[BundleDeployment[id=10051, name=Deployment [1] of Version [2.0] to [new-test]]], resource=[Resource[id=10001, uuid=535b3f54-0bd8-4653-bdd3-323ea69b98fd, type={Platforms}Linux, key=gs-dl585g2-01.rhts.eng.bos.redhat.com, name=server.example.com, parent=<null>, version=Linux 2.6.32-220.el6.x86_64]]]
                            status: Failure
                       subjectName: rhqadmin
		              tags:
The deployBundle 関数は 2 つの手順で実行され、デプロイメントを管理します。これは util.js ファイルの関数の 1 つを使用してデプロイメント設定(送信されている場合)を適切なハッシュに変換します。
... 8< ...

        var deploymentConfig = deploymentConfiguration;
        if (!(deploymentConfiguration instanceof Configuration)) {
                deploymentConfig = asConfiguration(deploymentConfiguration);
	}
次にデプロイメント(リモート API を使用)を作成してから、デプロイメントをスケジュールします。
... 8< ...
        var deployment = BundleManager.createBundleDeployment(bundleVersionId, destinationId, description, deploymentConfig);

        deployment = BundleManager.scheduleBundleDeployment(deployment.id, isCleanDeployment);
... 8< ...

20.3. バンドルの元に戻す

バンドルを元 に戻すと、現在どのバージョンから最後にデプロイされたバージョンにも、宛先の 1 ステップを自動的に後方に移動します。
これは、リモート API でのみ行われ、bundles.js ファイルの機能は使用しません。
実行するメソッドは、です。 scheduleRevertBundleDeployment.これには、2 つの重要な情報が必要です。1 つ目は宛先 ID で、簡単な基準検索で取得できます。
rhqadmin@localhost:7080$ var destinationName = "NewDestination"
rhqadmin@localhost:7080$ var destCrit = new BundleDestinationCriteria()
rhqadmin@localhost:7080$ destCrit.addFilterName(destinationName)

rhqadmin@localhost:7080$ var dest = BundleManager.findBundleDestinationsByCriteria(destCrit)
次の情報をデプロイメントの説明です。説明は、元に戻すデプロイメントの特定に役立つ revert メソッドに渡されるものです。
rhqadmin@localhost:7080$ var depCrit = new BundleDeploymentCriteria()
rhqadmin@localhost:7080$ depCrit.addFilterDestinationName(destinationName)
rhqadmin@localhost:7080$ var deploy = BundleManager.findBundleDeploymentsByCriteria(depCrit)
rhqadmin@localhost:7080$ var dep = deploy.get(0);
rhqadmin@localhost:7080$ var description = dep.description;
最後の部分は実際にメソッドを呼び出します。
rhqadmin@localhost:7080$ BundleManager.scheduleRevertBundleDeployment(dest.get(0).id, description, true)

第21章 例: リソースドリフトの準備

特に実稼働またはビジネスに重要なサーバーおよびアプリケーションのサーバーを維持するには、これらのシステム上の設定ファイルとパッケージをリインして維持する必要があります。予期しない変更が発生すると、システムは管理者が定義した状態から離れます。これは、設定がずれ ています。
JBoss ON は設定ファイルおよびターゲットディレクトリーを監視し、それらのエリアへの変更を追跡できます。これは、JBoss ON エージェントが設定を監視する場所と頻度を設定する 誤差定義 を使用します。ドリフトが検出されると、JBoss ON サーバーはアラートを起動し、変更した設定ファイルを元に戻す(または修正)するアラート CLI スクリプトを実行できます。

21.1. スクリプトの計画

ドリフトを管理する状況には 2 つの異なるスクリプトがあるため、2 つのスクリプトが再生されます。
  • まず、リソースにドリフトを設定するスクリプトがあります。このシェルスクリプトは、一連のセットアップ手順で一度に実行されます。
    1. リソースのドリフト定義を作成します( driftDef.js CLI スクリプトにより)。
    2. これは、一般的な deploy.xml レシピを作成し、drift ディレクトリーを zip し、( createBundle.js CLI スクリプトを介して)新しいバンドルおよびバンドルデプロイメントを作成します。
    3. 最初のスナップショットを待機した後には、( snapshot.js CLI スクリプトを介して)スナップショットを定義に固定します。
    これらのファイルはすべて、シェルスクリプトにより生成されます。
  • アラート定義は、(CLI ではなく)UI で作成する必要がありますが、任意のドリフト検出を条件として使用し、応答でサーバー側のスクリプトを実行するように設定できます。この 2 つ目のスクリプトは、プリストラインベースディレクトリーで作成されたバンドルをデプロイし、ドリフトを上書きします。

21.2. 誤差定義の設定およびバンドルの準備

設定スクリプトは、実際には 3 つの CLI スクリプトと一部のシステムコマンドで実行されます。1 つのスクリプトの手順をすべて実行すると、1 つのコマンドを実行してドリフト定義とバックアップバンドルを設定できます。
[root@server ~]# ./driftBundle.sh
注記
ドリフト定義とバンドルデプロイメントはいずれも、多くのリソースおよびインフラストラクチャー固有の設定を取ります。この例の driftBundle.sh スクリプトは、各情報に対応するスクリプト内の多くの変数を定義します。
変数は .conf ファイルのセット(cf. 「Wrapper スクリプトおよび .conf ファイルの作成」)を使用し .conf て定義できますが(この例では分かりやすくするために、すべての変数が driftBundle.sh スクリプト自体で定義されます)。
スクリプトの最初の部分は、JBoss ON CLI の実行時に使用する接続設定を定義するだけです。この例では、ユーザー名とパスワードのみを定義するため、スクリプトがローカルで実行している JBoss ON サーバーがシステムで実行されることを前提とします。オプションを編集して、リモート JBoss ON サーバーのホスト名およびポートを提供できます。
一般的な変数は 3 つあります。
  • rhq-cli.sh スクリプトの場所
  • CLI コマンドで渡すユーザー名やパスワードなどのオプション
  • 生成された JavaScript ファイルを保存し、JavaScript ファイルへのパスに使用するディレクトリー。
#!/bin/bash
# options for the CLI
CLI='cliRoot/rhq-remoting-cli-4.9.0.JON320GA/bin/rhq-cli.sh'
OPTS=' -u rhqadmin -p rhqadmin'
SCRIPTS='/opt'
スクリプトの最初の部分は、ドリフト定義を設定します。デフォルトでは、誤差は JBoss サーバー、Tomcat サーバー、およびプラットフォームという数少ないリソースタイプに対してのみ有効であるため、リソースタイプと名前の組み合わせを基にしてリソースを特定することが最も簡単です。
リソースの特定後、定義を作成できます。一般的な定義により、監視するベースディレクトリーが特定され、無視するファイルまたはサブディレクトリー(ログファイルなど)に関するルールを設定し、ドリフト検出スキャンの間隔または頻度を設定します。
これらの定義パラメーターはすべて、シェルスクリプトで個別の変数として定義されます。この例では、drift はプラットフォームに対して設定されます。
# set parameters for the drift definition
RESTYPE='Linux'
RESPLUGIN='Platforms'
RESNAME="server.example.com"
NAME='example drift'
DESC='drift from script'
BASEDIR='/opt/drift'
BASEDIRTYPE='fileSystem'
EXCLUDE='./logs/'
PATTERN=
MODE='normal'
INTERVAL='3600'
シェルスクリプトは最終的に、CLI で自動的に実行される CLI スクリプトを作成します。CLI スクリプトの最初の部分は、プラットフォームのリソースタイプの基準検索と、リソースプラットフォーム自体を定義します。
driftDef() {
cat <<-EOF

//set the resource type
var resType = ResourceTypeManager.getResourceTypeByNameAndPlugin("$RESTYPE","$RESPLUGIN");

//get the resource to associate with the drift definition
rcrit = ResourceCriteria()
rcrit.addFilterResourceTypeName("$RESTYPE")
rcrit.addFilterName("$RESNAME")
var resources = ResourceManager.findResourcesByCriteria(rcrit)
var res = resources.get(0)
注記
このスクリプトは、単一のリソースを検索して、ドリフトを設定します。複数のリソースを検索して互換性のあるグループにイテレートし、互換性のあるグループで反復して、各リソースにドリフト定義を追加するスクリプトを作成することもできます。
次の部分は、ドリフト定義自体を設定します。The DriftDefinitionManager は、a のラッパーです。 configuration() オブジェクト。CLI スクリプトは最初に指定のリソースタイプのデフォルトドリフトテンプレートを呼び出し、そのテンプレートに基づいて定義オブジェクトを作成します。
//get the default template for the resource type
criteria = DriftDefinitionTemplateCriteria()
criteria.addFilterResourceTypeId(resType.id)
templates = DriftTemplateManager.findTemplatesByCriteria(criteria)
template = templates.get(0)
//create a new drift definition instance, based on the template
definition = template.createDefinition()
設定オブジェクトが作成されると、定義オプションに値が割り当てられます。
このスクリプトは、1 つの例外で実際のドリフト定義を作成します。スキャンの間隔は 30 秒です。実際、これは設定可能な最も短い間隔です。これにより、エージェントは初期スナップショットを比較的迅速に収集できるため、全体的な設定が速くなります。この間隔は、スクリプトの実行時のより妥当な値(変数で定義されている値)にリセットされます。
//set the drift definition configuration options
definition.resource = res
definition.name = '$NAME'
definition.description = '$DESC'
definition.setAttached(false) // this is false so that template changes don't affect the definition
// this is set low to trigger an early initial detection run
definition.setInterval(30)
var basedir = new DriftDefinition.BaseDirectory(DriftConfigurationDefinition.BaseDirValueContext.valueOf('$BASEDIRTYPE'),'$BASEDIR')
definition.basedir = basedir

// there can be multiple exclude statements made, as desired
var f = new Filter("$EXCLUDE", "$PATTERN") // location, pattern
definition.addExclude(f)

//this defaults to normal, which means that any changes will
// trigger an alert. plannedChanges is the other option, which 
// disables alerting for drift changes.
definition.setDriftHandlingMode(DriftConfigurationDefinition.DriftHandlingMode.valueOf('$MODE'))
設定が完了したら、定義に書き込む必要があります。
//apply the new definition to the resource
DriftManager.updateDriftDefinition(EntityContext.forResource(res.id),definition)

EOF
}
注記
ドリフト定義は、リソース ID のみでは なく エンティティーコンテキストを使用してリソースを特定します。エンティティーコンテキストは、最初にオブジェクトのタイプ(エンティティー)と、その関連するインベントリー ID を特定します。
「バンドル」には 1 つの部分がないため、「バンドル」を作成する手順が複数あります。 このスクリプトは、指定の drift ベースディレクトリーの ZIP アーカイブを作成し、これによりバンドルアーカイブが作成されます。バンドルを定義するには、2 つの手順があります。バンドル宛先を定義しています。バンドル宛先 は、バンドル(任意のバンドル)をデプロイできる互換性のあるグループで、バンドルをデプロイするためにリソース上の場所も定義します。次に、パッケージ自体が バンドルバージョン としてアップロードされます。
変数は、バンドルバージョンとバンドルアーカイブの情報とバンドル宛先の両方を定義します。
他の変数には、CLI のサンプルディレクトリーへのパスがあります。バンドルバージョンの作成、バンドル宛先の作成、および指定されたバンドルのデプロイに使用するヘルパー関数は、bundles.js サンプルスクリプトにすでに定義されます。これらの関数を使用すると、デプロイバンドルが非常に簡単になります。
# options for the bundle
SAMPLES='cliRoot/rhq-remoting-cli-4.9.0.JON320GA/samples'
DESTNAME='drift destination'
BUNDLEDESC='bundle to remediate drift'
BUNDLENAME='driftBundle'
GROUPNAME='Linux Group'
ZIP='driftBundle.zip'
BVER='1.0'
BUNDLE='/opt/bundles/'$ZIP
ARCHIVE='/opt/bundles/'$ZIP
この特定のバンドルのデプロイメントは簡単です。ターゲットバンドル宛先は、誤差ベースディレクトリーと同じです。
プルする外部コンテンツや外部コンテンツの公開するトークンがないため、バックアップアーカイブ自体だけを使用すれば、レシピは非常にシンプルです。このスクリプトは、バンドルアーカイブで使用されるレシピ(deploy.xml)を作成します。
deploy() {
cat << _EOF_

<project name="$BUNDLENAME" default="main"
        xmlns:rhq="antlib:org.rhq.bundle">
    <rhq:bundle name="$BUNDLENAME" version="$BVER" description="$BUNDLEDESC">
        <rhq:deployment-unit name="drift" compliance="full">
            <rhq:archive name="$ZIP" exploded="true">
            </rhq:archive>
        </rhq:deployment-unit>
    </rhq:bundle>
<target name="main" />

</project>
_EOF_
}
bundles.js サンプルスクリプトはバンドルのデプロイに必要なすべての関数をすでに定義していますが、util.js サンプルスクリプトに依存しています。CLI が非対話的に実行される場合、別のスクリプトが必要とする外部スクリプトをインポートする方法はありません。
したがって、このシェルスクリプトはまず bundles.jsutil.js スクリプトを連結し、次にバンドルバージョンとバンドル宛先を作成する呼び出しを追加します。
createBundle() {
cat $SAMPLES/util.js $SAMPLES/bundles.js
cat  << _EOF_

// set the location of the bundle archive
var path = '$BUNDLE'

// create the bundle version in JON
createBundleVersion(path)

// set all of the variables for the bundle destination
var destinationName = '$DESTNAME'
var description = '$BUNDLEDESC'
var bundleName = '$BUNDLENAME'
var groupName = '$GROUPNAME'
var baseDirName = '$BASEDIR'
var deployDir = "."

// create the new destinition in JON
createBundleDestination(destinationName, description, bundleName, groupName, baseDirName, deployDir)

_EOF_
}
注記
リソースが互換性のあるグループにすでに属し、互換性のあるグループに十分な名前を付けて、検索中に返される唯一の名前になるようにします。
シェルスクリプトで作成された最後の CLI スクリプトは、初期スナップショットを新しいドリフト定義にピニングします。スナップショット は、名前が示すように、ベースディレクトリーの現在の設定の図です。スナップショットを定義にピニングすると、エージェントがドリフトを評価するために使用するベースラインまたは比較を設定します。ピニングされたスナップショットは、(ローリング変更ではなく)維持する必要がある特定の設定で識別される構成です。
スナップショットが固定されると、このスクリプトはドリフト定義設定をリセットし、スキャン間により長い(より実用的な)間隔を使用するようにします。
snapshot() {
cat <<- _EOF_
//find the resource
rcrit = ResourceCriteria()
rcrit.addFilterResourceTypeName("$RESTYPE")
rcrit.addFilterName("$RESNAME")
var resources = ResourceManager.findResourcesByCriteria(rcrit)
var res = resources.get(0)

//find the new drift definition
criteria = DriftDefinitionCriteria()
criteria.addFilterName('$NAME')
criteria.addFilterResourceIds(res.id)
def = DriftManager.findDriftDefinitionsByCriteria(criteria)
definition = def.get(0)
definition.setInterval($INTERVAL)

// it is necessary to redefine the complete configuration when you're 
// resetting the interval or the other values will be overwritten with default 
// or set to null
var basedir = new DriftDefinition.BaseDirectory(DriftConfigurationDefinition.BaseDirValueContext.valueOf('$BASEDIRTYPE'),'$BASEDIR')
definition.basedir = basedir
definition.name = '$NAME'
// there can be multiple exclude statements made, as desired
var f = new Filter("$EXCLUDE", "$PATTERN") // location, pattern
definition.addExclude(f)
DriftManager.updateDriftDefinition(EntityContext.forResource(res.id),definition)

// pin to the initial snapshot, which is version 0
// this gets the most recent snapshot if that is the better version to use
// snap = DriftManager.getSnapshot(DriftSnapshotRequest(definition.id))
DriftManager.pinSnapshot(definition.id,0)
_EOF_
}
スクリプトの最後の部分は、定義された JBoss ON CLI スクリプトをすべて実行し、ドリフト定義とバンドル定義の両方を設定します(ドリフトが検出された場合のバックアップとして)。
JBoss ON CLI スクリプトには 2 つのシステムコマンドがあります。最初に、バンドル zip アーカイブを作成するコマンドです。2 つ目の sleep コマンドは、スクリプトを一時停止し、JBoss ON エージェントの時間を一時停止して、スナップショットのピニングを試みる前に、初期スナップショットを収集するコマンドです。
# create the drift definition

driftDef > $SCRIPTS/driftDef.js
$CLI $OPTS -f $SCRIPTS/driftDef.js


# create the recipe file and then zip up the 
# drift base directory to make the bundle archive

deploy > /deploy.xml
zip $ARCHIVE $BASEDIR
zip $BUNDLE $ARCHIVE /deploy.xml

# create the bundle from the recipe and archive
# and then create the bundle definition 

createBundle > $SCRIPTS/createBundle.js
$CLI $OPTS -f $SCRIPTS/createBundle.js


# sleep to allow the server to get the first snapshot
# this only sleeps for a minute, but it really depends on your environment
# whether that is long enough

sleep 1m

# this pins the new snapshot to the new drift definition
# and then changes the drift interval to the longer, variable-specified
# value

snapshot > $SCRIPTS/snapshot.js
$CLI $OPTS -f $SCRIPTS/snapshot.js
このシェルスクリプトでエラー処理は発生していません。スリープ期間よりも長い最初のスナップショットなど、ステップが失敗した場合、不正なドリフトまたはバンドル設定以外の不具合は示唆されません。

21.3. ドリフトの調整

ドリフトを修正するには、UI でアラートを定義し、実行できる CLI スクリプトをアップロードします(ドリフトが検出されるたびに自動的に)。スクリプトはすべて、バックアップバンドルをリソースにデプロイするだけで、さまざまな方法があります。
この例では、すべての基本的なステップを実行します。これは、アラートからリソース情報をプルし、バンドルバージョンを検索し、リソースにデプロイします。このスクリプトの 1 つは、ログファイルを書き込み、修正をトリガーしたアラート情報をキャプチャーすることです。
このスクリプトは、アラート定義の作成時に直接アップロードできます。スクリプトをアップロードする前に、誤差定義の設定時に作成したバンドルの宛先およびバンドルバージョンに変数を設定してください。
// - The 'alert' variable is seeded by the alert sender

// SET THESE VARIABLES
var bundleDestinationName = 'drift destination'
var bundleVersion = 1.0
var logFile = '/tmp/alert-cli-demo/logs/alert-' + alert.id + '.log'

// Log what we're doing to a file tied to the fired alert id
//
var e = exporter
e.setTarget( 'raw', logFile )

// Dump the alert
//
e.write( alert )

// get a proxy for the alerted-on Resource
//
var alertResource = ProxyFactory.getResource(alert.alertDefinition.resource.id)

// Dump the resource
//
e.write( " " )
e.write( alertResource )


// Remediate file

// Find the Bundle Destination
//
var destCrit = new BundleDestinationCriteria()
destCrit.addFilterName( bundleDestinationName )
var result = BundleManager.findBundleDestinationsByCriteria( destCrit )
var dest = result.get( 0 )

// Find the Bundle Version
//
var versionCrit = new BundleVersionCriteria()
versionCrit.addFilterVersion( bundleVersion )
result = BundleManager.findBundleVersionsByCriteria( versionCrit )
var ver = result.get( 0 )

// Create a new Deployment for the bundle version and the destination
//
var deployment = BundleManager.createBundleDeployment(ver.getId(), dest.getId(), 'remediate drift', new Configuration())

// Schedule a clean deploy of the deployment. This will wipe out the edited file and lay down a clean copy
//
BundleManager.scheduleBundleDeployment(deployment.getId(), true)

e.write( " " )
e.write( "REMEDIATION COMPLETE!" )

第22章 例: JBoss ON サーバー設定の管理

JBoss ON サーバーは、異なる環境でであっても、多くの同じ設定を共有できます。たとえば、異なる JBoss ON サーバーによって開発環境、ステージング環境、および実稼働環境が 3 つすべて管理されても、サーバーは同様のメトリクステンプレートと設定を使用します。個別の環境と類似した環境の管理を簡素化するために、JBoss ON はサーバーの設定をエクスポートし、その設定を別のサーバーにインポートできます。
設定を管理する権限を持つユーザーは、サーバー設定をエクスポートできます。

22.1. 簡易エクスポート/インポートの同期

サーバー設定を最も簡単に同期すると、すべてのメトリクスおよびサーバー設定がエクスポートされ、インポートするデータのインポートまたはインポート前にデータを調整せずに、その情報を直接インポートします。
ヒント
これは、JBoss ON サーバー両方のログイン情報を追加してから、スクリプトを実行して自動化できます。これは、server1 に対して実行し、もう 1 つは server2 に対して実行されるスクリプトの 2 つのスクリプトに分けられます。ラッパースクリプトを使用すると、エクスポートスクリプトを実行し、SCP などのユーティリティーを実行してアーカイブ上でコピーし、インポートスクリプトを実行できます。
スクリプトの最初の部分は server1 からデータをエクスポートし、zip 形式の XML アーカイブを作成します。
//log into the first server
rhq.login('rhqadmin','rhqadmin','server1.example.com','7080');

//export the settings
var ex = SynchronizationManager.exportAllSubsystems();
rhqadmin@localhost:7080$ saveBytesToFile(ex.exportFile, 'export.xml.gz');

// log out of the first server
rhq.logout()
アーカイブファイルは何らかの方法で server2 にコピーする必要があります。
アーカイブがコピーされたら、server2 にインポートできます。null パラメーターは、インポートプロセスで XML ファイルのデフォルト設定が使用されるか、またはデフォルトが XML にない場合、ターゲットサーバーに定義された設定を使用することを意味します。
// log into the second server
rhq.login('rhqadmin','rhqadmin','server2.example.com','7080');

// import the settings
var data = getFileBytes('export.xml.gz');
SynchronizationManager.importAllSubsystems(data, null);

// log out of the second server
rhq.logout()

22.2. インポート前のサーバー設定の変更

メトリクススケジュールとサーバー設定は、同期を使用して適用さ ます。Synchronizers は JBoss ON サーバーにインポートされる要素と、それらをサーバーに適用する方法を制御します。同期には、すべてのインポート操作に設定変更を適用するデフォルトテンプレートがあります。
同期ャの設定を変更して、ターゲットサーバーにインポートされる設定を変更できます。
スクリプトの最初の部分は、以前と同様に XML アーカイブをエクスポートします。
//log into the first server
rhq.login('rhqadmin','rhqadmin','server1.example.com','7080');

//export the settings
var ex = SynchronizationManager.exportAllSubsystems();
rhqadmin@localhost:7080$ saveBytesToFile(ex.exportFile, 'export.xml.gz');

// log out of the first server
rhq.logout()
XML ファイルには設定情報がすべて含まれているため、ファイルを確認するだけで、変更する設定がわかります。
2 つ目のサーバーで、同期機能の設定を変更します。
  1. デフォルトの定義を取得します。
    rhqadmin@localhost:7080$ var systemSettingsImportConfigurationDefinition = SynchronizationManager.getImportConfigurationDefinition('org.rhq.enterprise.server.sync.SystemSettingsSynchronizer')
  2. 新しい設定インスタンスを作成します。
    rhqadmin@localhost:7080$ var configurationObject = systemSettingsImportConfigurationDefinition.configurationDefinition.defaultTemplate.createConfiguration()
    
    rhqadmin@localhost:7080$ var systemSettingsImportConfiguration = new ImportConfiguration(systemSettingsImportConfigurationDefinition.synchronizerClassName, configurationObject)
  3. 設定を変更します。
    たとえば、これによりサーバー同期が編集され、監視データを格納するためのデータベース設定のみがインポートされます。
    rhqadmin@localhost:7080$ configurationObject.getSimple('propertiesToImport').setValue('CAM_DATA_PURGE_1H, CAM_DATA_PURGE_6H, CAM_DATA_PURGE_1D, CAM_DATA_MAINTENANCE')
    メトリクステンプレート同期の場合、プロパティーリストまたはプロパティーマップに基づいて、リソースタイプごとにインポートするメトリクススケジュールを定義します。例:
    rhqadmin@localhost:7080$ configurationObject.getSimple('updateAllSchedules').setBooleanValue(true)
    rhqadmin@localhost:7080$ var updateList = new PropertyList('metricUpdateOverrides')
    rhqadmin@localhost:7080$ var update = new PropertyMap('metricUpdateOverride')
    rhqadmin@localhost:7080$ update.put(new PropertySimple('metricName', 'MCBean|ServerInfo|*|freeMemory'))
    rhqadmin@localhost:7080$ update.put(new PropertySimple('resourceTypeName', 'JBossAS Server'))
    rhqadmin@localhost:7080$ update.put(new PropertySimple('resourceTypePlugin', 'JBossAS5'))
    rhqadmin@localhost:7080$ update.put(new PropertySimple('updateSchedules', 'true'))
    
    rhqadmin@localhost:7080$ updateList.add(update)
    
    rhqadmin@localhost:7080$ configurationObject.put(updateList)
同期機能の設定を変更したら、設定をインポートします。
rhqadmin@localhost:7080$ var configsToImport = new java.util.ArrayList()
rhqadmin@localhost:7080$ configsToImport.add(systemSettingsImportConfiguration);
rhqadmin@localhost:7080$ configsToImport.add(metricTemplatesImportConfiguration);
rhqadmin@localhost:7080$ SynchronizationManager.importAllSubsystems(ex, configToImport);

付録A ドキュメント履歴

改訂履歴
改訂 3.3.7-2Tue 11 Apr 2017Conscot ムムー
さまざまなバグ修正を再構築します。
改訂 3.3.7-1Tue 20 Sep 2016Conscot ムムー
BZ-1375587: 'Creating and Editing Dynagroups' セクションのコード例を更新します。
改訂 3.3.2-11Fri 19 Aug 2016Conscot ムムー
スクリプトモジュールのコンテンツで、Python への誤った参照を削除しました。
改訂 3.3.2-10Thu 02 July 2015Jared イタリア
いくつかの冗長なフロントエンドを削除しました。
JBoss ON 3.3.2 リリースの準備
改訂 3.3.1-1Wed Feb 18 2015Jared イタリア
JBoss ON 3.3.2.GA リリースの準備
改訂 3.3-20Mon Nov 17 2014Jared イタリア
『3.3 Release Notes for Customer Reported Defects』を参照してください。

法律上の通知

著作権 © 2017 Red Hat。
このドキュメントのテキストおよび図は、Red Hat によって Creative Commons Attribution-Share Alike 3.0 Unported ライセンス("CC-BY-SA")でライセンスが適用されています。CC-BY-SA についての説明は、 http://creativecommons.org/licenses/by-sa/3.0/.CC-BY-SA に従って、本書を配布したり、その適合を配布する場合は、元のバージョンの URL を指定する必要があります。
Red Hat, as the licensor of this document, waives the right to enforce, and agrees not to assert, Section 4d of CC-BY-SA to the fullest extent permitted by apply.
Red Hat, Red Hat Enterprise Linux, the Shadowman logo, JBoss, OpenShift, Fedora, the Infinity logo, and RHCE are trademarks of Red Hat, Inc., registered in the United States and other countries.
Linux® is the registered trademark of Linusinusvalds in the United States and other countries.
Java® is a registered trademark of Oracle and/or its affiliates.
XFS® is a trademark of Silicon Graphics International Corp. or its subsidiaries in the United States and/or other countries.
MySQL® is a registered trademark of MySQL AB in the United States, the European Union and other countries.
Node.js® is an official trademark of Joyent.Red Hat Software Collections は、公式の Joyent Node.js オープンソースまたは商用プロジェクトによって正式に関連または承認されていません。
The OpenStack® Word Mark and OpenStack logo are either registered trademarks/service marks or trademarks/service marks of the OpenStack Foundation, in the United States and other countries and are used with the OpenStack Foundation's permission.We are not affiliated with, endorsed or stuorsed by the OpenStack Foundation, or the OpenStack community.
All other trademarks are the property of their respective owners.