Rundeck: ジョブのエラーハンドリング
Rundeckでは、ジョブ内で処理を繋げて実行する事も出来ます。『ステップ』と呼ばれる単位で処理を作成し、そのステップを複数個定義する事で繋げていく形です。
その際、『この処理が終わったら次の処理を行なう』『異常終了となった時に何らかの処理を行なう』と言うような制御を行いたい場合もあるかと思います。当エントリではRundeckでその辺りの制御を行なう時にRundeckではどういう仕組みになってるのか、どういった形で設定等を行えば良いのかという点について見て行きたいと思います。
処理の正常終了・異常終了について
Rundeckでの処理のステータスに関する詳細については以下のエントリに画像付きで解説されているのでご参照ください。
処理ステータスの中で『正常終了』『異常終了』と判定されるものがありますが、これについては実行される処理のリターンコード、プロセスの戻り値が何であるかに基づいて定められています。0が正常終了、それ以外が異常終了という形ですね。以下のエントリはPythonに於けるプロセスの戻り値に関する解説がなされています。
Pythonで処理ステータスを返す簡単なプログラムを使ってRundeckの処理結果を確認して見ましょう。以下は戻り値0を返す正常終了で終わるPythonプログラムです。
#!/usr/bin/env python # -*- coding: utf-8 -*- import sys sys.exit(0)
実行後、直前に実行したコマンドのexit値を示す$?の内容を確認してみると0となっています。
$ ./job-exec-ok.py $ echo $? 0
このプログラムをRundeckのジョブで指定し、
実行してみます。正常に処理が終了しました。
一方こちらは異常終了となるPythonプログラム。
#!/usr/bin/env python # -*- coding: utf-8 -*- import sys sys.exit('error!')
実行するとexit値は1となります。
$ ./job-exec-ng.py error! $ echo $? 1
正常終了時同様に、こちらもジョブで指定を行い、実行させてみると、
こちらは先ほどとは変わり、処理がエラーとなりジョブも失敗する形となりました。
処理を繋げてみる
続いて、任意の処理を繋げて行ってみましょう。上記のスクリプトとは別に、もう1つPythonスクリプトを作成します。文字列を出力するだけの至って簡単なものです。
#!/usr/bin/env python # -*- coding: utf-8 -*- print("this job is next job.");
ステップを追加し、併せて2つの処理が順次並ぶ形とします。基本的には1つめの処理が正常に終われば次の処理へ進む、という流れとなります。
実行すると以下の様な形に。
また、エラーが起きる場合の挙動も設定可能です。ポイントはIf a step failsの部分。デフォルト設定の『Stop at the failed step.』の場合、"エラーが起きた時点のステップで処理が止まる"形となります。もう一つ(『Run remaining steps before failing』)の方は、"一通りステップを実行させてから失敗判定とする"という形になってますね。ここでは前者の設定のままで進めます。エラーが起きたらそこで失敗として終わる、ですね。
この設定で実行すると以下の様に1つめのステップが実行され、エラーが出たところでジョブが止まっています。
エラーハンドラーの追加
エラーとなった場合、個別にエラーハンドラー(Error Handler)を追加して処理を行わせる事も可能です。大元のステップを登録した後に、一覧の要素右側に[error handler]を追加するリンクが現れるのでこれをクリックします。
すると、ステップに対して別途ステップを追加する画面が表示されます。
ここではシンプルに、このステップに入った事を示す文字列を出力させてみます。
ステップの一覧に"on error"(エラー発生時)の情報が表示されました。
実行してみると、確かに処理が追加したスクリプトに移っている事が確認出来ます。
実行後の[Definition]タブでステップの内容も改めて確認出来ますね。
まとめ
Rundeckにおける異常処理発生時の挙動について確認してみたエントリでした。ジョブの通知設定ではメールやWebhookを処理開始・終了時に連携させる事が出来ますが、この設定を使えばもう少し込み入った処理等も行えそうですね。上手く活用して行きたいところです。こちらからは以上です。