こんにちは。
2021年7月にハートビーツに入社後、エンジニアリンググループに所属している北岡です。 以前は同じMSP企業で10年以上勤務しておりましたが、自身のスキル向上などを目的としてハートビーツへ入社しました。
私の転職の経緯やハートビーツへ入社して感じたことなどは今後お話するとして、今回はお客様のLinuxサーバ上で作業する際、私がオペレーション中に意識していることやミスを防ぐために行っていることについて紹介します。
コピー、ペーストのショートカットキーを変更する
コピー「Ctrl + c」とペースト「Ctrl + v」はキーが隣り合っており、タイピングミスによってコピーしようとしたつもりがペーストしてしまったということが起こりえます。
メモ帳などで起きた場合は特に問題にはなりませんが、サーバ上で起きると不要なコマンド実行に繋がります。小さなことではありますが防止策をとるべきです。
そのため、コピー「Ctrl + c」のショートカットキーはそのままに、ペーストを「Ctrl + p」などに変更して作業をしております。
Bracketed paste mode機能を有効化する
Bracketed paste modeとは、複数行のペーストを行った際にポップアップで警告を表示するBashの機能となります。
本機能は、bash-4.4-alphaから実装された機能で、bash-5.1-alphaからはデフォルトで有効になりました。
コマンドベースの手順に従う場合には基本的にコピー&ペーストで問題ありません。 ただ、ペーストした後にコマンドをもう1度確認するようにしています。
コマンドをコピーしたときに改行が含まれていた場合にはペーストするとそのままコマンドが実行されてしまいます。 しかし、この機能を有効化することで即座に実行されることを防げます。
AWS Systems Managerのセッションマネージャー機能などを使ってWEBブラウザからサーバのコンソールに接続するときにはマウスの右クリックでもペーストができます。 そのときには、ターミナルから接続するとき以上に意図せぬペーストによるコマンド実行が起きやすいです。 そのため、本機能が有効になっているか必ず確認するようにしています。
クリップボード履歴ソフトウェアの利用
クリックボード履歴ソフトウェアとはコピー履歴を残してくれるもので、社内では「Clipy」や「Clibor」がよく使われています。
- Clipy
- https://clipy-app.com/
- Clibor
- https://chigusa-web.com/clibor/
作業の進め方として、事前に作成した手順や公式ドキュメントに沿ってコマンドを1つ1つコピー&ペーストで実行しながら進めることも多いのではないでしょうか。
作業を進める中で「本当に次に実行すべきコマンドをコピーできているのか」ということを確認するために、クリップボード履歴ソフトウェアを使えば、メモ帳にペーストして確認するといった手法より手軽に何がコピーされているのか確認できます。 意図せぬ内容をペーストしてしまうミスを防ぐことに役立ってくれます。
- 使用例
- 環境設定は、"ログイン時に起動"をON、"メニュー項目選択時にペースト"をOFFのみで使用しております。
- "1." が現在クリップボードに保存されているもので、"2." 以降は履歴となっております。
- オンマウスするとコピー内容全体がポップされるので、コピー内容が長くて見切れているものでも問題なく確認できます。
機密情報はreadコマンドを使って変数定義する
パスワードなどの機密情報を環境変数に定義したり、コマンドオプションに直接指定してコマンドを実行してしまうこともあるのではないでしょうか。 上記のようにコマンドを実行すると実行履歴(history)にパスワード情報が記録されてしまいます。
実行履歴から手動で削除もできますが、read -s HOGE
にてパスワード情報を変数に格納し、PASSWORD=${HOGE:?} <コマンド>
のような形で必要に応じてパスワード情報が必要なコマンドを実行しています。
実行履歴にパスワード情報を残すことなくコマンドを実行できるため、弊社では推奨しているオペレーションとなります。
- パスワード情報が履歴(history)に残ってしまう例
[centos@localhost ~]$ mysql -uroot -proot -e "SELECT VERSION()"
mysql: [Warning] Using a password on the command line interface can be insecure.
+------------+
| VERSION() |
+------------+
| 5.7.35-log |
+------------+
[centos@localhost ~]$ history | tail -n2 9 mysql -uroot -proot -e "SELECT VERSION()" 10 history | tail -n2
- readコマンドを使った例
[centos@localhost ~]$ read -s PASSWORD
[centos@localhost ~]$ mysql -uroot -p${PASSWORD:?} -e "SELECT VERSION()"
mysql: [Warning] Using a password on the command line interface can be insecure.
+------------+
| VERSION() |
+------------+
| 5.7.35-log |
+------------+
[centos@localhost ~]$ history | tail -n3
11 read -s PASSWORD
12 mysql -uroot -p${PASSWORD:?} -e "SELECT VERSION()"
13 history | tail -n3
tmuxを活用
tmuxはターミナルの多重化ソフトウェアで1つのターミナル上で複数のターミナルを起動できます。
今までターミナルソフトウェア自体を複数起動したり、タブで複数のターミナルを開いたりしていました。 しかし、tmuxを使うことで1つの画面に収まるようになり、作業が快適になります。 社内での利用者も多いです。
tmuxにはさまざまな機能がありますが社内でよく使われているtmuxの活用事例を紹介します。
セッション機能を使ったダブルチェック
作業を進めるにあたり、オペレーションミスがサービス影響に直結するコマンド(rebootなど)は、実行前に対象サーバやコマンド内容が正しいかを上長や同僚にダブルチェックしてもらうべきです。
弊社はコロナ渦でリモートワークとなっているため、Slackの画面共有を使ってのダブルチェックが主流となっています。 画面共有を利用する場合は複数人で時間を合わせて作業する必要がありますが、tmuxのセッション機能を使用して非同期の形でお願いできます。
tmuxのセッション機能を使用してダブルチェックする場合は対象サーバ・ユーザ・セッション名を伝え、対象サーバ・ユーザ上で tmux attach-session -t <セッション名>
を実行します。
自宅ネットワークの寸断などのトラブルにも対応
tmuxのセッション機能が活躍する場としてもう1つ、コマンドの実行完了まで長時間を要する(1時間以上など)といった場面があります。
完了まで時間を要するコマンドの場合、 ターミナルを閉じたりPCの電源を落としたりできず、実行完了までオペレーターが拘束されてしまいます。 自宅ネットワークの寸断など何らかのトラブルが起きるとコマンド実行も失敗してしまいます。
作業対象サーバやSSH踏み台サーバでtmuxのセッションを起動してコマンドを実行していれば オペレーターが拘束されることなく、上記のようなトラブルが起きたときでもセッションは残っているためコマンドは実行され続けています。 対象サーバ・ユーザ・セッション名を伝えれば他のオペレーターへの引き継ぎも容易です。
画面の分割とシンクロ化
本筋と少しそれますが、tmuxの画面の分割とシンクロ化の機能も普段の業務で使います。 web01〜web04のような同じロールのサーバに画面分割しながらSSHログインし、シンクロ化を有効化すると コマンド入力が同期されるためオペレーションの効率が良くなります。
最後に、.tmux.confファイルの内容を紹介いたします。
unbind ] # tmuxのペースト機能を無効化(ペースト事故防止)
set -g history-limit 100000 # ヒストリサイズを増大(過去のオペレーション確認用)
setw -g mode-keys vi # コピーモードでのキーバインドをvi化(デフォルトはEmacs)
bind s setw synchronize-panes on # 画面のシンクロ化のキーバインド設定(sは他のキーでも可)
bind S setw synchronize-panes off # 画面のシンクロ解除のキーバインド設定(Sは他のキーでも可)
最後に
オペレーションミスを防ぐ施策について、簡単なものから少し準備が必要なものまでご紹介いたしました。 どれだけ防止策を行ってもオペレーションミスを0にはできませんが、少しでもオペレーションミスを減らすことに寄与できたら光栄です。