lycheejam's tech log

チラ裏のメモ帳 | プログラミングは苦手、インフラが得意なつもり。

N日より前のファイルを削除するコマンド

概要

N日より前の特定のファイルを削除したいってシュチュエーションで使うコマンドです。
具体的には以下のシチュエーションです。

  • logrotateが使えない
  • ファイルはログファイル
  • 出力元アプリがapplication.log-YYYYMMDDの様な形式で、YYYYMMDDの日付suffixが付く

アプリが自動でログローテートしてるのでサーバ側でlogrotateの設定は入れれません。
が、当該ログファイルの削除処理はどこにもないのでたまり続けます。といった具合。

コマンド

find /var/www/app/logs -name "application.log-*" -mtime +7 -exec rm -f {}\;

詳細

find -mtime

-mtimeで「最終更新日が7日以前のファイル」と指定する。
詳細は以下を参照のこと。

find(1) - Linux manual page

mtimeの時間範囲の計算がいまいち分かりづらかったので整理。
コマンド実行時点を0日目として、24時間前を1日目...Nという風に考える。
時間の端数は無視されるとのことなので、実行時点から24時間未満(1未満)は無視される。なので24時間前が1日前と言うカウント。
詳細は以下。

File was last accessed less than, more than or exactly n*24 hours ago. When find figures out how many 24-hour periods ago the file was last accessed, any fractional part is ignored, so to match -atime +1, a file has to have been accessed at least two days ago.

find(1) - Linux manual page

ローカルでの実験が以下の通り。当日分1世代+前日からの7世代を保持って感じになる。

実験ログ

$ date
20221010日 月曜日 230148秒 JST
$ ls -l
total 0
-rw-r--r--  1 z  staff  0  9 27 21:00 application.log-20220927
-rw-r--r--  1 z  staff  0  9 28 21:00 application.log-20220928
-rw-r--r--  1 z  staff  0  9 29 21:00 application.log-20220929
-rw-r--r--  1 z  staff  0  9 30 21:00 application.log-20220930
-rw-r--r--  1 z  staff  0 10  1 21:00 application.log-20221001
-rw-r--r--  1 z  staff  0 10  2 21:00 application.log-20221002
-rw-r--r--  1 z  staff  0 10  3 21:00 application.log-20221003
-rw-r--r--  1 z  staff  0 10  4 21:00 application.log-20221004
-rw-r--r--  1 z  staff  0 10  5 21:00 application.log-20221005
-rw-r--r--  1 z  staff  0 10  6 21:00 application.log-20221006
-rw-r--r--  1 z  staff  0 10  7 21:00 application.log-20221007
-rw-r--r--  1 z  staff  0 10  8 21:00 application.log-20221008
-rw-r--r--  1 z  staff  0 10  9 21:00 application.log-20221009
-rw-r--r--  1 z  staff  0 10 10 21:00 application.log-20221010
$ find . -mtime +0 | sort
./application.log-20220927
./application.log-20220928
./application.log-20220929
./application.log-20220930
./application.log-20221001
./application.log-20221002
./application.log-20221003
./application.log-20221004
./application.log-20221005
./application.log-20221006
./application.log-20221007
./application.log-20221008
./application.log-20221009
$ find . -mtime +1 | sort
./application.log-20220927
./application.log-20220928
./application.log-20220929
./application.log-20220930
./application.log-20221001
./application.log-20221002
./application.log-20221003
./application.log-20221004
./application.log-20221005
./application.log-20221006
./application.log-20221007
./application.log-20221008
$ find . -mtime +2 | sort
./application.log-20220927
./application.log-20220928
./application.log-20220929
./application.log-20220930
./application.log-20221001
./application.log-20221002
./application.log-20221003
./application.log-20221004
./application.log-20221005
./application.log-20221006
./application.log-20221007
$ find . -mtime +3 | sort
./application.log-20220927
./application.log-20220928
./application.log-20220929
./application.log-20220930
./application.log-20221001
./application.log-20221002
./application.log-20221003
./application.log-20221004
./application.log-20221005
./application.log-20221006
$ find . -mtime +4 | sort
./application.log-20220927
./application.log-20220928
./application.log-20220929
./application.log-20220930
./application.log-20221001
./application.log-20221002
./application.log-20221003
./application.log-20221004
./application.log-20221005
$ find . -mtime +5 | sort
./application.log-20220927
./application.log-20220928
./application.log-20220929
./application.log-20220930
./application.log-20221001
./application.log-20221002
./application.log-20221003
./application.log-20221004
$ find . -mtime +6 | sort
./application.log-20220927
./application.log-20220928
./application.log-20220929
./application.log-20220930
./application.log-20221001
./application.log-20221002
./application.log-20221003
$ find . -mtime +7 | sort
./application.log-20220927
./application.log-20220928
./application.log-20220929
./application.log-20220930
./application.log-20221001
./application.log-20221002
$ find . -mtime +8 | sort
./application.log-20220927
./application.log-20220928
./application.log-20220929
./application.log-20220930
./application.log-20221001
$ find . -mtime +9 | sort
./application.log-20220927
./application.log-20220928
./application.log-20220929
./application.log-20220930

以下のサイトが大変参考になりました。

【Linux】find コマンド【図解】 | 100%レンタルサーバーを使いこなすサイト

find -exec

-execで実行するコマンドを指定しているが、最後のエスケープとセミコロン(\;)が肝。
execで渡したコマンドの終端を示す。

参考:find -exec の後ろにつく\; と + の違い | 雑廉堂の雑記帳

以上。

AWS CLIとjqでCSVを作るワンライナーレシピ集

概要

EC2インスタンスやEBSの一覧をスプレッドシート(エクセル)で作成しなければいけない...みたいなツラミを味わってるのは自分だけじゃないはず。
練習がてら雑にメモに追記していっていたAWS CLIとjqを使ってCSV出力するワンライナーが結構な量溜まったので、整理も兼ねてブログ記事にしようかと。
基本的にjqの組み立てについての解説はせず、どんな情報が取れるかの補足のみ記載します。
出力はヘッダー付きCSVになります。

※改行して整形してますが、ワンライナーって言っていいよね...?ダメ...?

目次

前提

実行環境はWSLのUbuntuですが、Macでも動作を確認しています。
紹介するものに関しては、OS依存の動作の違いは特にないかと思います。(たぶん)

$ aws --version
aws-cli/2.2.22 Python/3.8.8 Linux/5.10.16.3-microsoft-standard-WSL2 exe/x86_64.ubuntu.20 prompt/off
$ jq --version
jq-1.6

ワンライナーレシピ集

EC2インスタンスの一覧を取得する

EC2インスタンスを一覧取得してCSV出力するワンライナーです。

$ aws ec2 describe-instances | \
  jq -r '.Reservations[].Instances[] |
  {
    TagName: .Tags | from_entries.Name
    , PrivateIpAddress
    , PublicIpAddress
    , InstanceId
    , InstanceType
    , AZ: .Placement.AvailabilityZone
    , State: .State.Name
  }' | jq -r -s '(map(keys) | add | unique) as $cols | map(. as $row | $cols | map($row[.])) as $rows | $cols, $rows[] | @csv' > list.csv

.Tags | from_entries.Nameとすることで、TagにNameが設定されていなくても一覧に出力されるようになります。
よくあるmapとselectの組み合わせだと、Nameが設定されてないと出力されないので。
.Tags | from_entries.{Tagキー}とすることで任意のTagを出力可能です。

最後のjq -r -s '(map(keys) | add | unique) as $cols | map(. as $row | $cols | map($row[.])) as $rows | $cols, $rows[] | @csv'CSV用のヘッダーを追加してます。
これはStackOverflowから引っ張ってきました。

How to convert arbitrary simple JSON to CSV using jq? - Stack Overflow

続きを読む

GitHubにあるITエンジニアの職務経歴書を見たいときのTips

職務経歴書を書く際に、他の人がどんなフォーマットでどのように書いているのか参考にしたいことってありませんか?
GitHubで単純に「resume」と検索すると、全世界のものがひっかかって辛かったので、ログとして。

ちょっと調べてて思ったんですが、前に転職したときと比較にならないほど職務経歴書が公開されてますね。
更新再開の一発目がtipsってどうなん。

Ansible ProvisionerでMySQLを対象としたansible roleのテストをする

概要

ansible roleのテストを行うときにVagrantのAnsible Provisionerを使ってるわけですが
MySQLとかのDBを対象としたタスクのテストをしようと思うと、MySQL環境を構築しなければならず面倒です。
なので、MySQL環境構築のスクリプトを書きました。
書きましたと言ってもネットに落ちてるやつ拝借しただけですが。

目次

  • 概要
  • 目次
  • 参考サイト様
  • 前提
  • 想定シーン
  • 成果物
  • 雑感

参考サイト様

続きを読む

CentOS 7でAnsible AWXの環境を構築(Docker版)

概要

興味が湧いたのでAnsible AWX触りたいと思って、環境構築やってみました。
CentOS 7でやってると依存関係とか諸々でしんどかったので手順を残しておきます。

目次

  • 概要
  • 目次
  • 参考サイト様
  • 前提
  • 手順
    • 必要パッケージのインストール
    • インストール確認
    • Docker Engineの起動
    • Ansible AWXのインストール
    • コンテナ起動確認
    • ブラウザから確認
  • 雑感

参考サイト様

前提

実行環境はWindows 10のVMware WorkStationでCentOS 7

  • Windows 10 1909
  • VMware(R) Workstation 15 Player 15.5.2 build-15785246
    • 一応、マシンにメモリ8GB割当
[root@localhost ~]# cat /etc/redhat-release
CentOS Linux release 7.8.2003 (Core)
続きを読む