謎のデイリータスクを半自動化した話
こんにちは。
早いものでもう年末ですね。
昨日、人生で初めてスケートを体験して見事に転けて右肘を強打しました。
今日は、先週あたりから発生したデイリータスクを半自動化した話をしようと思います。
前提
タスクが発生した経緯:
先々週末からopenshiftノード内にあるdockerイメージがなんらかの理由で
消えてしまうという問題が発生している
タスクの内容:
恒久対処までの間日次でイメージがなくなっていないか確認する
具体的な作業内容としては、「必要なイメージ一覧」があり、
それとノードが保有しているイメージ一覧を出力→比較して、
無いものがあったらリポジトリに入り、イメージを再取得するという流れです。
この「比較」という作業が非常にめんどくさい。
なぜかというとただdocker images を叩くだけだとイメージ名が全く同じものや、
似た名前のイメージが大量に出てくるから。
しかも、確認するノードは複数、、、
タスクをやり始めて1日目は確認することを教わりつつやったのでそんなに作業感を感じなかったんですが、
恒久対処の日程が今のところ決まっていないと知った2日目から
既に死ぬほど虚無を感じる作業になってしまいました。
「比較して差分を取得」というタスク自体は非常に単純なものなので、プログラミングですぐに実装できそう。
サクッと自動化してみるか!と思い立ち、やってみることにしました。
やったこと
まず扱うファイルの中身と、処理の流れと、欲しい出力をイメージしました。
さらっと書いた流れが↓こんな感じ。
メモが汚すぎるので一応説明すると、
・checklist → 存在していて欲しいイメージのリスト
・imagelist → 取得したイメージのリスト
流れとしては、
①「イメージ名のみの一覧ファイルを整形して出力」
↓
②「差分を比較して、checklistにあるけどimagelistに存在しないイメージ名があれば出力」
の二段階。
①はコマンドでなんやかんやして出力しました。
sudo docker images | cut -d' ' -f1 | tail -n +2 | sort | uniq > imagelist.txt
処理的には、
・docker imagesで一覧を取得
・一列目(イメージ名)だけを指定して出力
・アルファベット順にソート
・重複しているイメージを除外
・imagelist.txtと言う名前で出力
ということをしております。
コマンドは先人の知恵をお借りしました。
②はpythonで実装。普段使っているrubyで書きたかったけど、現場の環境にインストールされていなかったので調べながら、、
#checkimage.py checklist = open("checklist.txt","r") imagelist = open("imagelist.txt", "r") checklists = [] imagelists = [] for line1 in checklist: checklists.append(line1) for line2 in imagelist: imagelists.append(line2) for check in checklists: if check not in imagelists: print(check.rstrip('\n')) checklist.close() imagelist.close()
処理内容:
・ファイルを開く
・1行ずつリストに要素として入れる
・checklistの要素一つ一つに対して、imagelistに存在するかどうかチェックする
→存在しないイメージがあった場合、イメージ名を改行文字を取り除いて出力
・ファイルを閉じる
わざわざ配列に入れる必要はないのかもしれませんが、そこは知識と時間不足でした、、
もしもっとスマートな書き方を知っている方は教えてください🙇♀️
まとめ
正直、最初のコマンドでファイルを出力するだけでもだいぶ無駄なイメージが削ぎ落とされて出てくるので楽になるんですが、
winmerge開いて比較して〜ってところもめんどくさすぎて毎日やるとなると大変だったので
コマンド二つ叩くだけで日次タスクが終了するとなっただけでも大分工数が削減できたんじゃないかなと思います。
ホントはシェルスクリプトにpythonを埋め込んで、一つ実行するだけで不足イメージ名が取得できるところまで
できれば良かったんですがその辺は業務中に調べきれず実装できてません。少し調べればできそうですけどね。。
現時点ではイメージがなくなる問題は再発していませんが、
毎日ガンガンなくなるようであればイメージを取得するところも自動化しようかなと思っています。
おしまい