猫とアップルパイ

インフラエンジニアをやってます!エンジニアってむずかしいよね。

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 ログの削除について

上記のように二種類のログがジョブ実行回数分どんどんどんどん増えていくので、定期的に削除してあげる必要がある。

  • execute テーブルのログレコード
  • ファイル形式の実行ログ
    • これは上記の削除コマンドでは消してくれないので手動で消す必要がある

実際の削除処理について

  • ログのメタ情報削除
    • 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