Featured image of post Read and update Kubernetes YAML with yq(v4)

Read and update Kubernetes YAML with yq(v4)

yq(v4)でKubernetesのYAMLをいじる

日本語版/Japanese

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.yamlyqでいじる。

読む

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になった途端動かなくてびっくりした…

おまけ

秘密基地で爆睡するねこ