Rundeckの実行ログをpythonから削除する
目的
Rundeckはジョブを実行するたびに実行ログが生成されます。ログが残るのはありがたいですが、分や秒単位でログを実行すると大量のログが溜まってきます。これらの実行ログをpythonから削除してみました。
実行ログとは
実行ログはRundeckのジョブを実行した後にアクティビティタブにジョブのアクティビティとして残るログです。GUIからアクティビティを消すこともできますが、一度に削除できる件数は表示されている数までです。そのため、1000や1万などアクティビティが溜まると人力で消すのは大変になってきます。

また、アクティビティの数が原因でプロジェクトが削除できなくなる事象に遭遇したこともあります。ということで、定期的に不要なログは自動削除していきたい。
環境
python 3.7.3
Rundeck 3.1.0
Step1: pythonコード
ログを削除するためのpythonコードはありがたいことにgithubで見つかりました。このdeletelogs.pyを使用させて頂くことにします。
https://github.com/danifr/rundeckscripts/blob/master/py_scripts/deleteoldlogs.py
使い方としては以下の必要情報を埋め、実行するだけの様子です。非常に便利そうですね。
API_KEY='xx' #Rundeckユーザに紐づくのAPI token
RUNDECKSERVER = 'http://127.0.0.1' #Rundeckのホスト名
RUNDECKPORT='4440' #Rundeckのポート番号、デフォルトは4440
EXPIRE_DAYS = 20 #今日を含めて残す日数
Step2: APIキーの発行
コード実行に必要なAPIキーを取得します。
まず、右上のProfileを選択し、遷移した画面でUser API Tokensの右側の+ボタンをクリックします。


ウィンドウが現れますので、Token発行に必要な情報を埋めます。
今回は管理者ユーザとしてTokenを発行します。Expiration inを0にしておくと30日間有効のようですが、もし無期限にしたい場合はrundeck-config.propertiesファイル内にrundeck.api.tokens.duration.max = 0を記述しておけばOKです。
入力したら左下のNew Generation Tokenをクリックします。

すると新しく、Tokenが追加されます。Show Tokenをクリックして表示されるTokenをコピペして先ほどのコードに張り付ければOK。

Step3: pythonコード実行
必要情報を埋めてpythonコードを実行しましたが、以下のエラーが出ました。
SyntaxError: Missing parentheses in call to 'print'. Did you mean print('project:\t'+project)?
githubで公開されていたのはpython2系のコードだったということで・・・printが使われている箇所をprint()に修正しました。
projects = getProjectNames(listProjects())
for project in projects:
print('project:\t'+project) #修正箇所
jobids = getJobIDs(listJobsForProject(project))
for jobid in jobids:
print('\tjobid:\t'+jobid) #修正箇所
checkDeletion(getExecutionDate(getExecutionsForAJob(jobid)))
修正後に、再度実行。今度は以下のエラーが発生しました。
AttributeError: 'dict' object has no attribute 'iteritems'
どうやらfor文のiteritems()でエラーが発生しているらしい。dict型にiteritems()を使うな、とのこと。これもpython2系とpython3系の差異でしょうか?
ということで以下のように修正しました。
def checkDeletion(execid_dates):
#for exec_id, exec_date in execid_dates.iteritems(): #修正前
for exec_id, exec_date in execid_dates.items(): #修正後
if isOlderThanExpireDays(int(exec_date), TODAY):
deleteExecution(exec_id)
再度実行・・・今度は無事に動きました。
まとめ
エラーが出て少し躓きましたが、このpythonコードはかなり使い勝手良しです。これをrundeck ジョブとして回しておけば、ジョブアクティビティが溜まることなく快適に運用できるかと思います。