August 23, 2018

プロダクト環境で事故らないようにiTermの背景色を変える

最近はKubernetes環境にも慣れてきて各環境でコマンドを叩く機会が増え始めた今日後の頃。
みなさんも経験があると思いますが人間は慣れ初めた頃が一番ミスりやすいのです。
本番環境でのミスを減らすため、以前は Kubernetesのcontextをzshのpromptに表示という記事を書きました。
この設定のおかげで自分がどこの環境にいるのかは把握できるので、作業自体は大変しやすくはなったのですが、 promptに表示されるだけだとterminalの画面を4分割とかしていると文字が折り畳まれて見逃してしまうことがあるかもしれません。

Kubernetesは関係ないのですが、今日masterにforce pushをしてしまって迷惑をかけてしまったらボスが本番環境で helm delete --purge をした事があるという恐ろしい事を言っていたので、サーバ初心者の僕はなるべくミスを減らすようにiTerm自体の背景色を変えて事故を未然に防ぎたいと思います。
ちなみに全てのrepositoryにmaster branch protectをかけました。 Androidの頃は1つのrepositoryだったのでかけていたのですが、serverはmicro serviceなので複数リポジトリの設定をするのが面倒でした。

iTermのProfileを追加する

iTerm2の環境設定(Preference)を開いてProfileの画面を開きます。
基本的には背景色のみ変更したいので、Other Actions > Duplicate Profileの順で選択してDefaultのprofileを複製します。

terminal-profile

複製をしたら、各環境に合わせて色の変更を行い名前を付けて下さい。
なおProfileの名前はshell scriptで利用します。

Scriptを書く

zshの人は ~/.zshrc bashの人は ~/.bashrc に変更を加えていきます。

以前の記事で作成したkubernetesのcontextを取得する関数も利用します。

# kube-context for prompt
function _kube-current-context () {
  KUBE_PS1_CONTEXT=$(kubectl config current-context)
}

iTermのprofileは
echo -ne "\033]1337;SetProfile=[環境]\a"
によって変更する事が出来ます。

このコマンドを利用して、このようなcase文を書きます。

# kube-context for background on iterm2
function _switch-profile () {
  # set the same name on iterm profile name
  case "$KUBE_PS1_CONTEXT" in
   dev* ) profile="Default";;
   stg* ) profile="Stg";;
   prd* ) profile="Prd";;
   * ) profile="Default";;
  esac
  
  echo -ne "\033]1337;SetProfile=$profile\a"
}

kubernetesのcontextを正規表現で判定して、profile変数の中身を書き換えています。
私の環境ではkubernetesのcontextは、

  • dev001-kube.hoge.io

  • stg001-kube.hoge.io

  • prd-kube.hoge.io

のようになっているので 先頭から一致する値をcase文に加えました。
この判定式は各自変更して下さい。正規表現が一通り使えます。

この場合、dev* の場合は Default のProfile、stgの場合は Stg という名前のProfileが適用されます。

add-zsh-hook precmd _switch-profile

最後に上記の文で、promptが表示される直前に毎回この関数をhookすることでcontextの変化と同時に背景色を変えることが出来ます。

以上でiTermの色をkubernetesの環境によって変えることが出来ました。
caseのパターンを増やせばssh先でprofileを書き換えることも出来ると思います。
私はそもそもpromptの表示が変わるので、そこの変更は不要でした。

少しでも事故が減りますように🙏

© AAkira 2018