猫とアップルパイ

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

rundeck の API token を無期限で作成する

プログラム上から rundeck ジョブを実行するときなど、 rundeck の API token を作成しておくと何かと便利。 しかし、デフォルトでは API token は最長で30日期限のものしか作成できないので、無期限の token 作成方法をメモしておく。

rundeck API token の作成方法

  • ユーザ名 -> profile からユーザAPI token 作成画面にいける
  • default だと一番下の expiration が max 30days 亜でしか設定できない
    f:id:maomaomaopan:20190112184854p:plain
    API token 作成画面

無期限の API token を作成する

rundeck の可動サーバで、 設定ファイルに以下を追記して rundeck プロセスを再起動する * /etc/rundeck/rundeck-config.properties

rundeck.api.tokens.duration.max = 0

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

rundeck の SCM 設定のやり方

rundeck で各種ジョブを稼働させていくにあたって、今このジョブ設定が全て消えてしまったら困る!って思うよね。
そこで rundeck のジョブ設定を GitHub の専用リポジトリにバックアップする設定を行ったのでメモ。

SCM 設定手順

  1. ジョブバックアップする用のリポジトリを準備する
  2. 秘密鍵、公開鍵のセットを用意する
  3. ジョブ定義を保存するリポジトリの deploy key に公開鍵を登録しておく
  4. ssh/config を設定し、対象リポジトリへの接続は、対象のカギを使用するようにしておく
    1. identityfile 複数行かく場合、push 時は最初にマッチした鍵しかみてくれないので注意
  5. rundeck の対象プロジェクトで SCM 設定
  6. rundeck 稼働サーバで、ローカルブランチを scm 設定時に指定したブランチにスイッチしておく
// rundeck GUI 上で SCM 設定をすると以下ディレクトリが作成される
$ cd /var/rundeck/projects/rundeckプロジェクト名/scm
$ git branch -v
$ git checkout -b rundeck_job_repo
Switched to a new branch 'rundeck_job_repo'

7.ジョブをコミットする

まとめ

簡単なのでとくにメモするようなことじゃなかった。