13
10

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?

More than 3 years have passed since last update.

gcloud でシェル毎にプロジェクトの切り替え設定

Last updated at Posted at 2019-08-18

gcloud でプロジェクトの切り替え設定 に書いたように gcloud config configurations activate で設定を切り替える場合、$HOME/.config/gcloud 以下の設定が切り替えられるため、シェルを複数立ち上げても(ユーザー)グローバルに同じプロジェクトを指すことになる。

シェル毎に別のプロジェクトを指すことができるようにして、tmux のウィンドウ毎に別のプロジェクトに切り替えたい。

関連: aws cliでシェル毎にデフォルトプロファイルの切り替え設定

gcloud の切り替え

CLOUDSDK_CONFIG

gcloud でプロジェクトの切り替え設定の発展としては、gcloud config configurations activate 設定名 と同様の効果をもたらす環境変数があると良いのだが、どうやらなさそう(あったら教えてください)。

そこで代わりに CLOUDSDK_CONFIG 環境変数で $HOME/.config/gcloud の場所を変えられるので、この環境変数をシェル毎に設定し直して切り替える戦略を取った。

切り替え設定スクリプト

こんな感じになった。

.zshrc
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 の場所を変えられるので、この環境変数をシェル毎に設定しなおせば良い

切り替え設定スクリプト

.zshrc
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 に良いように表示させてください

.zshrc
PROMPT='あなたのいつもの設定($(gx-current)/$(gkx-current))$ '

とか

ディレクトリに入ったら自動で切り替える

direnv を入れて、ディレクトリに .envrc ファイルをおいておく

.envrc
export CLOUDSDK_CONFIG=$GX_CONFIG_DIR/設定名
export KUBECONFIG=$GKX_CONFIG_DIR/設定名/クラスタ名

Special Thanks

ポイントとなる環境変数については tamtam180さんに教えていただきました。

13
10
2

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
13
10

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?