2.9.0
以降のRundeckではWorkflow対応しているのですが、それ以前のRundeckでは値を次のjobに引き継がせるのは不可能です。 ( 2.9.0以降のやり方 )
なので、job1の結果を保持しjob2を実行するjob3というShellを作成する方法をとりました。
rundeck-cliを使っているので、こちらのコマンドはインストールしておいてください。 ( 公式のインストール方法 )
#!/bin/bash
JOB1_RESULT_IDS=`rd run -f -j job1 | tail -n 1`
rd run -f -j job2 -- -IDS $JOB1_RESULT_IDS
exit 0
-
rd run
: rundeckのjobを実行する -
-f
: 実行を出力 -
-j
: jobをnameで指定。 groupがある場合はgroup/job名
。環境変数RD_PROJECT
も必要です。(同じ名前のjobが別projectに存在する可能性があるので) -
| tail -n 1
: 最後の行だけ取得 -
-- -IDS
: Rundeck側のoption変数。この値でjob2に渡してあげます
| tail -n 1
をやっている理由として、rundeck-cliの実行結果はログのような形式で表示されるので、最後の1行に欲しい内容をechoしておけば取得できるためです。
job1の内容が以下だとして
#!/bin/bash
echo "1,2,3"
出力されるログはこんな感じになります
# Found matching job: UUID jobName
# Execution started: [1] UUID /jobName <http://localhost:4440/project/mikeneko-test/execution/show/1>
1,2,3
欲しいのはラストの 1,2,3
なので、 tail -n 1
でここだけ取得しています。
このShellを使って2つのjobの実行管理と値の引き渡しを行います。
なので、Rundeck側でWorkflow機能を使ってスケジュール管理をする必要はありません。
エラーハンドリング
rd run コマンドは失敗すると 終了ステータス2 を返してくるのでこれでエラーキャッチします
#!/bin/bash
JOB1_RESULT_IDS=`rd run -f -j job1`
if [ ! $? = 0 ]; then
echo error: job1
exit 1
fi
IDS=`echo $JOB1_RESULT_IDS | awk '{print $NF}'`
rd run -f -j job2 -- -IDS $IDS
if [ ! $? = 0 ]; then
echo error: job2
exit 1
fi
exit 0
-
$?
: 直前のコマンドの終了ステータスをキャッチします。 -
awk '{print $NF}'
: awkで空白区切にして、一番ラストの要素を取得します。
最初の例だと、 | tail -n 1
で繋げてしまっている関係上、前のrdコマンドが失敗しても必ずここのtailコマンドで成功扱いになってエラーハンドリングができなかったので一旦切るようにしました。
この場合、 $JOB1_RESULT には空白区切で中身が入っているので awkで一番ラストの要素を引っ張り出すことで同じことが再現できます。
様々な理由でバージョン古くて困ってる人は試してもいいかもしれません。