最近 WSL をバージョンアップしたときに、前の設定が消えてしまった。よくよく考えると当たり前なので、次回アップデートしたときに、環境をセットアップできるようにしておこうと思った。
Azure CLI のインストールスクリプトは作ったので、後は、kubectl と kubeconfig の取得を自動化したい。Azure CLI で簡単にできたので、忘れないようにメモしておく
前提
下記のコマンドを実施ずみであること。これを前提にすると、Azure CLI でいろいろ自動化しやすい。
az login
スクリプト
#!/bin/bash
# Install kubectl
# This requires your password.
sudo az aks install-cli
# install jq
sudo apt install jq -y
# fetch all credentials of your k8s clusters
aks_list=$(az aks list)
# create a small list which gets name and resoruceGroup
sample=$(echo ${aks_list} | jq -c '[.[]| {name: .name, resourceGroup: .resourceGroup}]')
for row in $(echo "${aks_list}" | jq -r '.[] | @base64'); do
_jq() {
echo ${row} | base64 --decode | jq -r ${1}
}
az aks get-credentials -n $(_jq '.name') -g $(_jq '.resourceGroup')
done
az aks list
は、aks のリストを取得するコマンド。次のこの行はおまけ。本来必要ない。
sample=$(echo ${aks_list} | jq -c '[.[]| {name: .name, resourceGroup: .resourceGroup}]')
結果はこうなる
[{"name":"sadevopsoh","resourceGroup":"RemoveDevOpsOH"}]
jq を使うと簡単にクエリできる。実は同じようなことが、--query
パラメータでもできる。
$ az aks list --query "[].{name: name, resourceGroup: resourceGroup}"
結果
[
{
"name": "sadevopsoh",
"resourceGroup": "RemoveDevOpsOH"
}
]
--query
パラメータの文法は、jq に似た構文の JMEPATHというやつ。この--query
は自動化したいとき例えば、シークレットを取得して、ほかのコマンドに渡したいときとか頻繁に使われる。
ループして特定のコマンドを実行する
さて、bash で JSON をループさせて、何かのコマンドを実行したいときはどうしたらいいだろう。
for row in $(echo "${aks_list}" | jq -r '.[] | @base64'); do
_jq() {
echo ${row} | base64 --decode | jq -r ${1}
}
az aks get-credentials -n $(_jq '.name') -g $(_jq '.resourceGroup')
done
この部分。解説すると、bash で for 文はワードごとに繰り返しを行う。
aaa="a b c d e"
$ for i in ${aaa}; do
> echo item: $i
> done
item: a
item: b
item: c
item: d
item: e
もちろん、JSONだとそんなうまくかない。だからどうするか?というと、jq を使って配列の要素ごとに繰り返しをする。
$ echo ${sample}
[{"name":"ushio"}, {"name":"yamada"}]
${sample} | jq -r '.[]'
{
"name": "ushio"
}
{
"name": "yamada"
}
で、尚且つ各エレメントをbase64 にしてしまえばそれぞれが1ワードになるわけ。
$ echo ${sample} | jq -r '.[] | @base64'
eyJuYW1lIjoidXNoaW8ifQ==
eyJuYW1lIjoieWFtYWRhIn0=
考えた人賢すぎる。これをイレートさせて、使うときはデコードして、_jq
メソッドの第一パラメータで
検索しているというロジック。素晴らしい。