Summary
yq is very useful for reading or updating Kubernetes YAML.
## read the value(key=spec.containers[0].image) from YAML(pod.yaml)
# specify the file
yq '.spec.containers[0].image' pod.yaml
# pipe from stdout
cat pod.yaml | yq '.spec.containers[0].image'
## update the YAML value(key=spec.containers[0].image) to "nginx:1.20.2"
# stdout
cat pod.yaml | yq '.spec.containers[0].image = "nginx:1.20.2"'
# update the file
yq -i '.spec.containers[0].image = "nginx:1.20.2"' pod.yaml
Prerequisites
- yq version 4.24.2
Read and Update Kubernetes YAML with yq
Let’s read and update the pod.yaml with yq.
Read
We can extract the value by specifying the key.
# extract the image name
$ yq '.spec.containers[0].image' pod.yaml
nginx:latest
# extract the tag
$ yq '.spec.containers[0].image' pod.yaml | grep -o '^[^:]\+'
nginx
$ yq '.spec.containers[0].image' pod.yaml | grep -o '[^:]\+$'
latest
# pipe from stdout
$ cat pod.yaml | yq '.spec.containers[0].image'
nginx:latest
$ cat pod.yaml | yq '.spec.containers[0].image' | grep -o '^[^:]\+'
nginx
$ cat pod.yaml | yq '.spec.containers[0].image' | grep -o '[^:]\+$'
latest
Update
You can change the value of the specified key.
# change the image name
$ cat pod.yaml | yq '.spec.containers[0].image = "nginx:1.20.2"'
apiVersion: v1
kind: Pod
metadata:
name: nginx-pod
spec:
containers:
- name: nginx
image: nginx:1.20.2
# update the file directly
$ yq -i '.spec.containers[0].image = "nginx:1.20.2"' pod.yaml
$ cat pod.yaml
apiVersion: v1
kind: Pod
metadata:
name: nginx-pod
spec:
containers:
- name: nginx
image: nginx:1.20.2
(The following is the same content in Japanese.)
まとめ
yq
はv4でもやっぱり便利。
## YAML(pod.yaml)の値(key=spec.containers[0].image)を抽出
# ファイル名を指定するパターン
yq '.spec.containers[0].image' pod.yaml
# 標準出力からパイプで受けるパターン
cat pod.yaml | yq '.spec.containers[0].image'
## YAML(pod.yaml)の値(key=spec.containers[0].image)を"nginx:1.20.2"で上書き
# 標準出力に出すだけ
cat pod.yaml | yq '.spec.containers[0].image = "nginx:1.20.2"'
# ファイルの値を直接更新する
yq -i '.spec.containers[0].image = "nginx:1.20.2"' pod.yaml
環境
yqでKubernetes YAMLをいじる
こんな感じの pod.yaml をyq
でいじる。
読む
keyを指定して特定の要素を取り出す。
# image名を抜き出す
$ yq '.spec.containers[0].image' pod.yaml
nginx:latest
# grepと合わせてtagを取り出す
$ yq '.spec.containers[0].image' pod.yaml | grep -o '^[^:]\+'
nginx
$ yq '.spec.containers[0].image' pod.yaml | grep -o '[^:]\+$'
latest
# パイプで渡すパターン
$ cat pod.yaml | yq '.spec.containers[0].image'
nginx:latest
$ cat pod.yaml | yq '.spec.containers[0].image' | grep -o '^[^:]\+'
nginx
$ cat pod.yaml | yq '.spec.containers[0].image' | grep -o '[^:]\+$'
latest
更新する
指定したkeyの値を上書きする。
# image名を更新する
$ cat pod.yaml | yq '.spec.containers[0].image = "nginx:1.20.2"'
apiVersion: v1
kind: Pod
metadata:
name: nginx-pod
spec:
containers:
- name: nginx
image: nginx:1.20.2
# ファイルを直接上書きする
$ yq -i '.spec.containers[0].image = "nginx:1.20.2"' pod.yaml
$ cat pod.yaml
apiVersion: v1
kind: Pod
metadata:
name: nginx-pod
spec:
containers:
- name: nginx
image: nginx:1.20.2
おわり
yqのv3→v4へのアップデートでかなり大規模な変更があり、
過去に書いた記事の内容がそのままだと使えなくなってしまっていたので急いで書いてみた。
今までずっとv3を使っていたので、v4になった途端動かなくてびっくりした…