rundeck ジョブの実行ログの削除処理を仕込む
rundeck の実行ログは放置しておくとすごい勢いでたまってきて、DBデータや、ファイル領域を圧迫する原因になるため、 定期的に削除する処理を設定する必要がある。
出力される rundeck ログについて
rundeck ジョブは、ファイル形式で出力されるログと、rundeck DBのログ用テーブルにレコードとして追加されるタイプの二種類ある。
rundeck DB のログ記録用テーブルについて
- execution テーブルに、以下のようなレコードが1ジョブにつき1レコード追加されていく。
- output filepath に記載されているファイルが、実際の実行ログが記載されているファイルになる。
- このテーブルで、過去に実行したジョブと実行ログファイルとのマッピング等、実行ジョブのメタ情報が格納されているテーブルっぽい。
ファイル形式で出力するログについて
- rundeck の設定ファイル(/etc/rundeck/framework.properties)の framework.logs.dir で設定したパスに、ジョブの実際の実行ログがテキストファイルとして出力される。
- 各ジョブの「Log Output」タブで表示されるログの実ファイルとなる。
- 各プロジェクト下に自動生成されたジョブIDでディレクトリが作成され、その下に実行回数分のファイルが作成される。
- rundeck の設定ファイル(/etc/rundeck/framework.properties)の framework.logs.dir で設定したパスに、ジョブの実際の実行ログがテキストファイルとして出力される。
rundeck ログの削除について
上記のように二種類のログがジョブ実行回数分どんどんどんどん増えていくので、定期的に削除してあげる必要がある。
- execute テーブルのログレコード
- rundeck cli 削除コマンド実行で削除することが可能 (内部的には削除APIを実行している)。
- rundeck cli の色々なコマンドについて
- ファイル形式の実行ログ
- これは上記の削除コマンドでは消してくれないので手動で消す必要がある
実際の削除処理について
- ログのメタ情報削除
- rundeck cli コマンドを使用してメタ情報を削除
rd executions deletebulk -y -m <一度に削除する最大数> --older 3d -p <project名>
- ログ本体の削除
- サーバ上から find して直接削除
// ログ本体の配置場所 /var/lib/rundeck/logs/rundeck/<project名>/job/<job_id> // こんな感じで削除 find /var/lib/rundeck/logs/rundeck/<project名>/job/<job_id>/logs/ -mtime +3 -type f | xargs rm
まとめ
ということで、定期的にログ削除できるように、 rundeck で以下のようなシェルでログ削除ジョブを設定した\(^^)/ rundeck cli でいろいろできるから便利〜
set -e # 変数定義 export RD_HTTP_TIMEOUT=600 export RD_URL=http://localhost:4440 export RD_MAX_RETRIEVE_AT_ONCE=250 export RD_TOKEN=${RD_OPTION_RUNDECK_API_TOKEN} # プロジェクト毎の削除 del_executions() { local project=$1 echo "start ${project} at " `date` # 実行ログファイル削除 for jobid in $(rd jobs list -p ${project} --outformat "%group %id" | grep scheduled | awk '{print $2}'); do if [ -e "/var/lib/rundeck/logs/rundeck/${project}/job/${jobid}" ]; then echo file bulk deleting $jobid sudo find /var/lib/rundeck/logs/rundeck/${project}/job/${jobid}/logs -type f -mtime +1 -exec rm -f {} \; else echo skip $jobid fi done # 実行メタ情報削除 while true; do rd executions deletebulk -y -m ${RD_MAX_RETRIEVE_AT_ONCE} --older ${RD_OPTION_OLDER_THAN}d -p $project break sleep 1s done echo "end ${project} at " `date` } for p in $(rd projects list --outformat "%name"); do del_executions $p done exit 0