Rundeck プラグインシリーズ第二弾。
tl;dr
前回、ジョブのログを fluentd に流すプラグインを作ってみたが、ジョブの結果を通知するプラグインも幾つか提供されている。今回は以下の PagerDuty に通知するプラグインがあったので...
これをを真似て Datadog Event に通知するプラグインを作ってみた。
Notification Plugin について
ドキュメント
サンプル
通知のトリガ
通知のトリガについては以下の三つ。
onstart
- ジョブ開始時onsuccess
- ジョブが正常に終了した時onfailure
- ジョブが失敗、又は abort した時
プラグインの実行にあたって
以下の二つのデータが必要になる。
データ | 内容 |
---|---|
Configuration data | ユーザーが定義する設定データ |
Execution data | ジョブやジョブの実行結果が含まれるデータ |
Configuration data
詳細はこちらを。
Configuration data にはコンテキスト変数を利用してジョブの実行結果の情報を埋め込むことが出来る。例えば、以下のように定義することで...
Rundeck JOB: ${job.status} [${job.project}] \"${job.name}\" run by ${job.user} (#${job.execid})
以下のように展開される。
Rundeck JOB: FAILED [hello-world] "hello-world" run by admin (#2277)
Execution data
詳細はこちらを。
Execution data には以下のような execution マップデータが含まれている。(以下、ドキュメントより抜粋)
execution.id
: ID of the executionexecution.href
: URL to the execution output viewexecution.status
: Execution state ('running','failed','aborted','succeeded')execution.user
: User who started the jobexecution.dateStarted
: Start time (java.util.Date)execution.dateStartedUnixtime
: Start time as milliseconds since epoch (long)execution.dateStartedW3c
: Start time as a W3C formatted Stringexecution.description
: Summary string for the executionexecution.argstring
: Argument string for any job optionsexecution.project
: Project nameexecution.loglevel
: Loglevel string ('ERROR','WARN','INFO','VERBOSE','DEBUG')
又、以下はジョブが終了した時点で含まれる。(onstart
トリガには含まれない)
execution.failedNodeListString
: Comma-separated list of any nodes that failed, if presentexecution.failedNodeList
: Java List of any node names that failed, if presentexecution.succeededNodeListString
: Comma-separated list of any nodes that succeeded, if presentexecution.succeededNodeList
: Java List of any node names that succeeded, if presentexecution.nodestatus
: Java Map containing summary counts of node success/failure/total, in the form: [succeeded: int, failed: int, total: int]execution.dateEnded
: End time (java.util.Date)execution.dateEndedUnixtime
: End time as milliseconds since epoch (long)execution.dateEndedW3c
: End time as W3C formatted stringexecution.abortedby
: User who aborted the executionjob.id
: Job IDjob.href
: URL to Job view pagejob.name
: Job namejob.group
: Job groupjob.project
: Project namejob.description
: Job Descriptionjob.averageDuration
: Average job duration in Milliseconds, if availableexecution.context.option
: a Map containing the Job Option keys/values.job
: a Map containing the Job context data, as provided to executions. This map will contain some duplicate information as the execution.job map previously described.
通知ハンドラ
Notification Plugin では onstart
と onsuccess
及び onfailure
毎に任意のハンドラを呼び出すことが出来る。以下はハンドラの定義例。
onstart{ Map execution, Map configuration -> //perform an action using the execution and configuration println "Job ${execution.job.name} has been started by ${execution.user}..." return true } onsuccess{ Map execution, Map configuration -> //perform an action using the execution and configuration println "Success! Job ${execution.job.name} worked fine." return true } onfailure{ Map execution, Map configuration -> //perform an action using the execution and configuration println "Oh No! Job ${execution.job.name} didn't work out." return true }
それぞれのトリガ(onstart
と onsuccess
及び onfailure
)毎にシンプルに println を呼んでいる。(${execution.job.name}
を出力している)
rundeck-datadog_event-notification-plugin の使い方
インストール
インストールは DatadogEventNotification.groovy を $RDECK_BASE/libext/ にコピーする。
$ sudo cp DatadogEventNotification.groovy /var/lib/rundec/libext/
設定
project.properties と framework.properties に Datadog の API キーを指定する。
$ cat project.properties framework.properties | grep Datadog project.plugin.Notification.DatadogEventNotification.api_key=xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx framework.plugin.Notification.DatadogEventNotification.api_key=xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx
設定したら rundeckd を再起動しておく。
通知の設定
ジョブ設定から下図のように設定する。
とりあえず、ジョブが失敗した時に飛ばすようにするには On Failure
にある Datadog_Event
にチェックを入れる。Subject
は任意の値に指定することが可能だが、プラグインスクリプトにデフォルト値が定義されている場合には既に定義された状態となる。尚、今回はプラグインには以下のようにデフォルト値が設定されている。
Rundeck JOB: ${job.status} [${job.project}] \"${job.name}\" run by ${job.user} (#${job.execid})
${job.status}
や ${job.project}
のコンテキスト変数がそれぞれジョブの状態、ジョブのプロジェクト名等に展開される。(後述)
通知
設定を保存後、ジョブを走らせておくと以下のように通知がバンバン(意図的にジョブを失敗させるようにしておいた為)飛んできているのが確認出来る。
ということで...
次は...
Enjoy Rundeck
まだまだ続くよ Rundeck 道。