gcloud でプロジェクトの切り替え設定 に書いたように gcloud config configurations activate
で設定を切り替える場合、$HOME/.config/gcloud
以下の設定が切り替えられるため、シェルを複数立ち上げても(ユーザー)グローバルに同じプロジェクトを指すことになる。
シェル毎に別のプロジェクトを指すことができるようにして、tmux のウィンドウ毎に別のプロジェクトに切り替えたい。
関連: aws cliでシェル毎にデフォルトプロファイルの切り替え設定
gcloud の切り替え
CLOUDSDK_CONFIG
gcloud でプロジェクトの切り替え設定の発展としては、gcloud config configurations activate 設定名
と同様の効果をもたらす環境変数があると良いのだが、どうやらなさそう(あったら教えてください)。
そこで代わりに CLOUDSDK_CONFIG
環境変数で $HOME/.config/gcloud
の場所を変えられるので、この環境変数をシェル毎に設定し直して切り替える戦略を取った。
切り替え設定スクリプト
こんな感じになった。
export GX_CONFIG_DIR=$HOME/.gx-config
function gx-init() {
name="$1" # alias
if [ -z "$1" ]; then
echo "gx-init <name> [project]"
return 1
fi
if [ -z "$2" ]; then
project="$name"
else
project="$2"
fi
gx-activate "${name}"
gcloud config configurations create "${name}"
gcloud config set project "${project}"
gcloud auth login
}
function gx-activate() {
name="$1"
export CLOUDSDK_CONFIG="${GX_CONFIG_DIR}/${name}"
}
function gx-current() {
echo ${CLOUDSDK_CONFIG##*/}
}
function gx-complete() {
_values "gcloud-config" $(\ls "${GX_CONFIG_DIR}")
}
function gx() {
name="$1"
if [ -z "${name}" ]; then
name=$(\ls "${GX_CONFIG_DIR}" | peco)
fi
gx-activate "${name}"
}
compdef gx-complete gx
使い方は、以下のコマンドでプロジェクトの初期化をして、
$ gx-init 設定名 プロジェクト名
あとは gx コマンドで切り替える
$ gx[TAB] で自動補完
$ gx[ENTER] でpecoによる絞り込み
gcloud に加えて peco も入れておく必要があります。
GKE の切り替え
ついでに GKE のクラスタもシェル毎に切り替えられるようにした
KUBECONFIG
KUBECONFIG
環境変数で $HOME/.kube/config
の場所を変えられるので、この環境変数をシェル毎に設定しなおせば良い
切り替え設定スクリプト
function gke-get-credentials() {
cluster="$1"
zone_or_region="$2"
if echo "${zone_or_region}" | grep '[^-]*-[^-]*-[^-]*' > /dev/null; then
echo "gcloud container clusters get-credentials \"${cluster}\" --zone=\"${zone_or_region}\""
gcloud container clusters get-credentials "${cluster}" --zone="${zone_or_region}"
else
echo "gcloud container clusters get-credentials \"${cluster}\" --region=\"${zone_or_region}\""
gcloud container clusters get-credentials "${cluster}" --region="${zone_or_region}"
fi
}
function gcloud-current-project() {
gcloud config get-value project 2>/dev/null
}
export GKX_CONFIG_DIR=$HOME/.gkx-config
function gkx-init() {
name=$(gx-current)
gcloud container clusters list | tail -n +2 | while read line; do
cluster=$(echo "${line}" | awk '{print $1}')
zone_or_region=$(echo "${line}" | awk '{print $2}')
gkx-activate "${name}" "${cluster}"
gke-get-credentials "${cluster}" "${zone_or_region}"
done
}
function gkx-activate-default() {
name=$(gx-current)
if [ -d "${GKX_CONFIG_DIR}/${name}" ]; then
cluster=$(\ls "${GKX_CONFIG_DIR}/${name}" | head -n 1)
export KUBECONFIG="${GKX_CONFIG_DIR}/${name}/${cluster}"
else
unset KUBECONFIG
fi
}
function gkx-activate() {
name="$1"
cluster="$2"
export KUBECONFIG="${GKX_CONFIG_DIR}/${name}/${cluster}"
}
function gkx-current() {
echo ${KUBECONFIG##*/}
}
function gkx-complete() {
name=$(gx-current)
_values "gke-config" $(\ls "${GKX_CONFIG_DIR}/${name}")
}
function gkx() {
cluster="$1"
name=$(gx-current)
if [ -z "${cluster}" ]; then
cluster=$(\ls "${GKX_CONFIG_DIR}/${name}" | peco)
fi
gkx-activate "${name}" "${cluster}"
}
compdef gkx-complete gkx
使い方は、GCP project は選択されているとして、以下のコマンドで初期化して、
$ gkx-init
あとは gkx コマンドで切り替える
$ gkx[TAB] で自動補完
$ gkx[ENTER] でpecoによる絞り込み
プロンプトに表示する
gx-current と gkx-current を PROMPT
もしくは RPROMPT
に良いように表示させてください
PROMPT='あなたのいつもの設定($(gx-current)/$(gkx-current))$ '
とか
ディレクトリに入ったら自動で切り替える
direnv を入れて、ディレクトリに .envrc ファイルをおいておく
export CLOUDSDK_CONFIG=$GX_CONFIG_DIR/設定名
export KUBECONFIG=$GKX_CONFIG_DIR/設定名/クラスタ名
Special Thanks
ポイントとなる環境変数については tamtam180さんに教えていただきました。