July 27, 2018

Kubernetesのcontextをzshのpromptに表示

仕事でKubernetesを使うようになってからkubectlのコマンドを叩くことが増えたのですが、Kubernetesのcurrent contextが今どこにいるか気づかずに本番環境にdeployしてしまったとかなったら怖いなーと思ってpromptにcurrent contextを表示するようにしました。
今回はoh-my-zsh(zsh)で行いますが、bashでも大体同じ感じになると思いますので、適宜変換してください。

手順

.zshrc にkubernetesのcontextを入れるを関数作成

function _kube-current-context () {
  KUBE_PS1_CONTEXT=$(kubectl config current-context)
}

KUBE_PS1_CONTEXT という名前の変数に kubectl config current-context の実行結果を代入します。 PS1はbashで使われてるpromptの名前ですが今回はzshです

.zshrcから上記の関数をzsh-hookに登録

autoload -Uz add-zsh-hook
add-zsh-hook precmd _kube-current-context

precmd というのは、プロンプトを表示する直前に呼び出すという意味になります。 他にも、chpwdpreexec があるので気になる人は調べてみてください。

themeフォルダに移動 (oh-my-zsh)

$ cd ~/.oh-my.zsh/themes

現在使用しているthemeをコピーして適宜名前をつける (oh-my-zsh)

$ cp base.zsh-theme mytheme.zsh-theme

.zshrcのtheme読み込みを変更 (oh-my-zsh)

ZSH_THEME="mytheme"

mytheme.zsh-themeを編集 (oh-my-zsh)

$ vim ~/.oh-myzsh/themes/mytheme.zsh-theme

※ oh-my-zsh使ってない方は .zshrc 内に直接定義されている RPROMPT= を編集してください。

最後にthemeに定義されているpromptを変更

PROMPT='[%{$fg[red]%}%n%{$reset_color%}@%{$fg[magenta]%}%m%{$reset_color%}:
%{$fg[blue]%}%~%{$reset_color%}$(git_prompt_info) ⎈ %{$fg[cyan]%}${KUBE_PS1_CONTEXT}]

実際に指定しているのは %{$fg[cyan]%}${KUBE_PS1_CONTEXT} この部分です。
前半の %{$fg[cyan]%} この部分で色を指定して、 ${KUBE_PS1_CONTEXT} ここで値を入れています。
_kube-current-context() がprompt表示の直前に毎回呼ばれて、kubectl config current-context の値が毎回 KUBE_PS1_CONTEXT に代入されてpromptに表示される仕組みです。

表示結果

key value
user aakira
host aa
directory ~/foo/bar
git branch master
kubernetes context dev

前述のpromptを指定すると、shell上にはこのように表示されます
[aakira@aa:~/foo/bar on master ⎈ dev] %

実際には色が着くのでもう少し見やすいです。
またprd環境の場合は色を変える等も出来るので、正規表現でparseして色を変えるのもありかもしれません。

gitでthemeを管理

設定ファイル周りを.dotfilesで管理していて、submoduleで管理しているoh-my-zsh内の ~/.oh-my.zsh/themes にファイルを置かなければならないので、他のPCでも使いたい時に多少不便なことがあります。
そこで git-misc というフォルダを作成して、mythemeをそこにいれて~/.oh-my.zsh/themes に対してシンボリックリンクを貼りました。

$ ln -s ~/git-misc/ohmyzsh-theme/aatheme.zsh-theme ~/.oh-my-zsh/themes

これで環境が変わっても同じくgitで管理されている .zshrc さえ読み込めればすぐに同じ環境で作業が可能になります。
この辺の処理も.dotfilesのMakefileで管理しているので参考にしてみてください。

© AAkira 2018