※この物語はフィクションだったらよかったのにな。
prologue
ーーーここに1本のshellscriptがある
作成者は私。作業を単純化するために作成した、便利なツール。
…そう思っていた。そう、あの日までは……
第1章 トラブルのはじまり
あれはまだ残暑の残る蒸し暑い日のこと。だいぶ短くなった日が沈み、オフィスの人も少なくなってきた時間帯。
「明後日からの環境構築作業で使うツールの確認、終わった?」
「はい、前回の構築で実績もあるので問題ないです」
上司の問いかけに答えたのは私。
「そう。手順書もあるし、それなら明後日の作業は大丈夫そうだね」
上司も安堵の色を浮かべる。
「ただroot権限で大量にディレクトリ作る手順があるので、ここだけshellにして自動化しちゃおうかなって」
「作業時間短いもんね。それでいいと思うよ」
「今日作って明日試験して、明後日使う感じで作りますね。」
私はVScodeを立ち上げ、shellを書き始めた。自分の手がトラブルの火種を作っているとも知らずに。
#/bin/bash
# 作成先のパスの取得
# ☆★☆examplePathは/etc/profileに定義されている★☆★
# 1から10までディレクトリを作成
for dirNum in {1..10}
do
# 作成するディレクトリのパス
dirPath="${examplePath}/${dirNum}"
# ディレクトリ作成
mkdir -p "$dirPath"
done
# 作成したディレクトリの確認
ls -ld ${examplePath}
第2章 試験
「昨日shell作るとこまでやったんで、とりあえず試験だけしちゃいますね。問題なければ使うということで」
始業するや否や、開口一番に私はそう言う。
試験用の環境でshellを実行してみるとこうなった。
drwxrwxr-x. 2 root root 6 12月 7 16:51 1
drwxrwxr-x. 2 root root 6 12月 7 16:51 10
drwxrwxr-x. 2 root root 6 12月 7 16:51 2
drwxrwxr-x. 2 root root 6 12月 7 16:51 3
drwxrwxr-x. 2 root root 6 12月 7 16:51 4
drwxrwxr-x. 2 root root 6 12月 7 16:51 5
drwxrwxr-x. 2 root root 6 12月 7 16:51 6
drwxrwxr-x. 2 root root 6 12月 7 16:51 7
drwxrwxr-x. 2 root root 6 12月 7 16:51 8
drwxrwxr-x. 2 root root 6 12月 7 16:51 9
「うん、問題なし。ちゃんと作りたいところに必要なディレクトリが作られてる」
「あ、ほんと。さすがだね。 じゃあ明日の構築作業、よろしくね」
上司からの承認も得た私は、このshellをツールに入れて翌日の作業に備えたのであった。
第3章 Xデイ
作業当日は朝から雲一つない青空だった。
数分遅延した電車で出社した私は、その足で構築用マシンの前に座る。
「まずは昨日作ったshellの実行」
[root@localhost ~]# sh mkdir.sh
合計 36
drwxr-xr-x. 2 root root 6 12月 7 17:12 1
drwxr-xr-x. 2 root root 6 12月 7 17:12 10
drwxr-xr-x. 2 root root 6 12月 7 17:12 2
drwxr-xr-x. 2 root root 6 12月 7 17:12 3
drwxr-xr-x. 2 root root 6 12月 7 17:12 4
drwxr-xr-x. 2 root root 6 12月 7 17:12 5
drwxr-xr-x. 2 root root 6 12月 7 17:12 6
drwxr-xr-x. 2 root root 6 12月 7 17:12 7
drwxr-xr-x. 2 root root 6 12月 7 17:12 8
drwxr-xr-x. 2 root root 6 12月 7 17:12 9
-rw-r--r--. 1 root root 10240 1月 14 2023 backup.tar
lrwxrwxrwx. 1 root root 7 12月 5 2022 bin -> usr/bin
dr-xr-xr-x. 5 root root 4096 12月 5 2022 boot
drwxr-xr-x. 20 root root 3220 12月 7 14:41 dev
drwxr-xr-x. 148 root root 8192 12月 7 14:39 etc
drwxr-xr-x. 6 root root 83 8月 15 22:06 home
・
・
・
昨日、試験環境で実施したときには出力されなかった、作成していないはずの無関係なディレクトリ。名称はdev,etc,home,…。明らかに、ルート直下であることを明確に、残忍に突き付けてきていた。私の両脇を冷たいものが上から下へと通り抜ける。なにかがおかしい。意図せず、ルート直下に大量のディレクトリを作成してしまったのだ。
当に流れ終わったshellに向けて無意識にctrl+Cを連打し、1つ深呼吸を挟む。なぜこうなるのか。試験はした。となれば試験環境と本番環境間の差分が原因であろう。
「おかしい」
呟きながら、shellをcatすると、私の目がある1行をとらえた。
dirPath="${examplePath}/${dirNum}"
「こいつだ」
迷わずechoコマンドを叩く。
[root@localhost ~]# echo $examplePath
[root@localhost ~]#
環境変数が取得できていない。となれば原因は1つだ。/etc/profileに設定がない。
本番環境のprofileを勝手に触るわけにもいかない私は、誤って作成された大量のディレクトリを削除して報告に戻ったのだった。
第4章 根本原因
examplePath
は他のチームが設計する環境変数であった。そこで該当チーム(Aチーム)に確認した。
「その環境変数はまだ未設計です。だからどの環境にも設定されてないはず。」
「でも試験環境では動きましたよ。」
「そんな馬鹿な。確認します。・・・・・・わかりました。/etc/profileじゃないファイルに切られてます。」
「profile.d/とかってことですか」
「はい、試験のために仮設定で入れていた設定値が残っちゃってたんですね。だから意図に反して試験環境で動作したんでしょうね。」
epilogue
/etc/profileに定義するのが正しい設計であることが分かったので、その日のうちに定義を修正してエラーは解消された。
こうしてこの物語は幕を閉じた。試験したあとの後始末と、よそ様の作ったものを使うときはそれの正当性を確認することが大切。今回は間違って作ってしまうほうのミスだったが、間違って消してしまうのほうのミスでなくて本当によかった。
過ちは繰り返しませんから。