Red Hat Training

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

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