こんにちは、意識高い系エンジニア社長の内です。
みなさん開発現場において、本番環境、ステージング環境、テスト環境、開発環境など様々な用途の環境を駆使されているかと思います。
また、新規のシステム開発中に割り込み作業で、過去開発したシステムの調査や不具合修正やなどが入り、デスクトップ上は異なるシステム、異なる環境のターミナルウィンドウだらけになってしまうなんでケースもあるのではないでしょうか。
そのようなケースで、どのコンソールがどの環境のものなのか、ちゃんとわかるようにしておかないと、誤操作の元になります。
そんなわけで、開いているLinuxのコンソールがどのシステムの何の環境なのかを混同しにくくするための表示方法をいくつか紹介したいと思います。
目次
ログイン時にシステム名と環境を表示する。
sshでログインしたユーザーにシステム名と環境を表示
Linuxでは、MOTD(message of the day)というsshでログインした全ユーザーに共通でメッセージを表示する仕組みが存在します。設定ファイルは、/etc/motdで、このファイルに書いたメッセージがユーザーがsshログインした際にそのまま表示されます。通常メンテナンス日時を知らせたり、環境の引っ越しや廃止の通知などでも使いますが、今回はこの仕組みを利用してシステム名と環境を目立つようにアスキーアートで大きく表示してみます。
/etc/motdの内容
1 2 3 4 5 6 7 8 9 10 11 12 |
██ ██ ██████ ██ ██ ██ ██ ██ ██████ ███████ ██ ██ ██ ██ ██ ██ ██ ██ ██ ██ ██ ██ ████ ██ ██ ██ ██ ██ █ ██ ██ ██████ █████ ██ ██ ██ ██ ██ ██ ███ ██ ██ ██ ██ ██ ██ ██████ ██████ ███ ███ ██ ██ ██ ███████ ███████ ████████ █████ ██████ ██ ███ ██ ██████ ██ ██ ██ ██ ██ ██ ████ ██ ██ ███████ ██ ███████ ██ ███ ██ ██ ██ ██ ██ ███ ██ ██ ██ ██ ██ ██ ██ ██ ██ ██ ██ ██ ███████ ██ ██ ██ ██████ ██ ██ ████ ██████ |
デフォルトでは、以下のように最後にログインした日時と接続元のみ表示されてます。
システム名とステージング環境であることが目立って表示されるようになりました。
EC2にAWS Session Managerでログインしたユーザーにシステム名と環境を表示
AWS上のEC2の場合、セキュリティ上の理由でssh接続を禁止してSession Managerでインスタンスに接続するケースもあるかとおもいます。この場合Session Managerでの接続はssh接続でもなく、ログインでもないため/etc/motdに記載の内容は表示されないので表示されるようにしたいと思います。
Session Managerでアクセス時の挙動を変更する仕組みとして、シェルプロファイルがありますので、今回はシェルプロファイルにて明示的に/etc/motdの内容を表示するようにします。
AWSマネジメントコンソールで、AWS Systems Manager->Session Managerの設定タブに移動します。
「Linux shell profile」のテキストボックスに/etc/motdを表示するコマンドを入れます。
ssmでログインした場合、デフォルトのシェルがshになっているのと、ログイン後のカレントディレクトリが/usr/bin/になってしまうので、ついでにsudo su -しておきます。
1 |
cat /etc/motd |
セッションマネージャーでログインしてみます。
これで、sshだけでなくSession Managerで接続時にも表示されるようになりました。
シェルプロファイルは、インスタンス単位の設定ではなくリージョン内全てのlinuxインスタンスが対象になります。
個別のインスタンスだけ/etc/motdを読み込みたい場合は、ssm-userのデフォルトログインシェルがbashではなくshなので、シェルプロファイルでbashを起動するにようにして、
ssm-userの.bash_profile内で/etc/motdを読み込むように設定すればOKです。
bashのプロンプトにシステム名と環境を表示する
ログイン時の表示はコンソールを操作すると画面から消えていってしまいますのでコンソールのプロンプトにも常時表示することも環境を区別する上で有効です。
[ユーザー名@ホスト名 カレントディレクトリ]という構成になってます。
ホスト名をシステム名-環境にする
ホスト名の変更はhostnamectlコマンドで設定できます
1 |
hostnamectl set-hostname youwire-stating |
プロンプトにシステム名と環境が表示されるようになりました。
プロンプトに固定で「システム名-環境」を表示する
運用ルール等でホスト名の変更が許可されてない等で、ホスト名をシステム名と環境に変更することができない場合、プロンプトに固定で「システム名-環境」を表示するようにします。
プロンプトの表示書式はPS1という環境変数に入っていて、デフォルトでは
[\u@\h \W]\$
となっています。
1 2 |
[centos@youwire-stating ~]$ echo $PS1 [\u@\h \W]\$ |
この環境変数を書き換えればプロンプトが置き換わります。
ユーザー共通のプロンプトを変更する場合は/etc/profileや/etc/bashrcを編集して、この環境変数を書き換えればプロンプトが置き換わります。
1 |
vi /etc/bashrc |
例:ユーザー名の前に「staging」と表示する場合
1 |
export PS1="[staging:\u@\H \W]\$ " |
例:ホスト名を表示せずに、[ユーザー名@システム名-環境 カレントディレクトリ]を表示する場合
1 |
export PS1="[\u@systemname+staging \W]\$ " |
と直接出したい文字列を表示する。
コンソールの全体カラーを環境ごとに変える
コンソールの背景色に、本番は赤要素を入れる、ステージング環境は黄色要素を入れるなど運用ルールを決めて、背景色を変えるとさらに目立ちます。
こちらもサーバー側の/etc/profileや/etc/bashrcに記載すれば全ユーザーに適用もできますし、特定ユーザーの.bash_profileや.bashrcに記載することもできますが、今回は接続元のsshクライアント側のconfigに記載して、自分がログインした場合のみ適用にしてみます。
echo -e “\e]11;背景色指定\a”
で背景色を指定します。
.ssh/configの設定に、以下PermitLocalCommandとLocalCommand部分を追加します。
1 2 3 4 5 6 7 |
Host testserver HostName testserver.example.net User centos IdentityFile ~/.ssh/id_rsa Port 22 PermitLocalCommand yes LocalCommand echo -e "\e]11;#333324\a" |
そしてログインすると、背景色が変わりました。
文字が見にくくならないようにする背景色にすることをお勧めします。
また、全社的に実施するなら、
ステージング環境は#333324
本番環境は#390505
などと、環境に対するコンソールカラーも統一することをお勧めします。
ログアウトしたときに元の色に戻したい場合は、共通で設定する場合は/etc/bash.bash_logout、ユーザーごとに設定したい場合は~/.bash_logoutに色を戻す処理を入れます。
下の例では、サーバーに最初に接続する際は特定の固定IPからsshログインする運用ケースを想定した書き方です。sshで接続した後再度自分のサーバーにssh接続したり、sudo -suしたときのログアウトでは色を戻さないようにしてます。また、ssh over ssmの場合は${SSH_CLIENT}が::1になるので、その場合にも対応させてます。
1 2 3 4 5 |
if [[ "${SSH_CLIENT}" =~ "接続元の固定IP" ]] || [[ "${SSH_CLIENT}" =~ "::1" ]]; then echo -e "\e]11;#000000\a" fi echo -e "\e]11;#000000\a" fi |
ログアウト後はコンソールカラーが戻りました。
ログイン時にグローバルIPを表示する
AWS等クラウド環境ではこれらの設定をしたインスタンスのスナップショットから新たにテスト用インスタンスを作成する等行うこともあるかと思います。
コピーインスタンスを起動した瞬間は、ステージング環境じゃないけどステージング環境と表示されてしまうので、少しでも、いつもと違う環境だとわかるように、ログイン時にグローバルIPも表示するようにします。
AWSがGlobalIPを返すURL「https://checkip.amazonaws.com/」を提供しているのでこれを使って/etc/profileに記載します。
1 |
echo GlobalIP is `curl -s https://checkip.amazonaws.com/` |
ログインするとGlobalIPも表示されるようになりました。
まとめ
特に新しい技術などではありませんが、Linuxコンソール環境で、本番環境、ステージング環境、開発環境を混同しないための方法を4つほどご紹介させていただきました。
世の中から少しでも環境誤解による操作ミスが減ってもらえればと思います。
参考URL
参考URL: テキストアスキーアート生成サイト Text to ASCII Art Generator (TAAG) – patorjk.com
仲間募集
ギークフィードでは一緒に働く仲間を募集しています。
こんな記事を読んでいるあなたはきっとギークなはず。
詳しくはこちら
- 2023年ギークフィードが評価されて表彰されたことの振り返りとアピール - 2023-12-24
- Linuxコンソールで、本番、ステージング、テスト環境を混同しないための4つの工夫 - 2023-09-13
- Amazon Linux 2023を触ってみて質問がありそうなことをまとめてみました。 - 2023-03-22
- AmazonLinux3じゃなくってAmazon Linux 2022 (AL2022) だってさ。 - 2022-01-31
- 【祝:月間PV6万越え】2021年のギークブログ大賞を発表します。 - 2022-01-10