仕事で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
というのは、プロンプトを表示する直前に呼び出すという意味になります。
他にも、chpwd
やpreexec
があるので気になる人は調べてみてください。
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で管理しているので参考にしてみてください。