じゃあ、おうちで学べる

本能を呼び覚ますこのコードに、君は抗えるか

yaml 管理を自動化する時の必須道具 yq(v4) の倒し方

yq とは

yq はgoで書かれている軽量でポータブルなコマンドライン YAMLJSONXML プロセッサです。yq は jq に似た構文を使用しますが、jsonxml、properties、csv、tsv と同様に yaml ファイルを処理します。 記事の執筆時点の2023 年01月17日時点でv4.30.8 がリリースされています。

github.com

yq

yq のv4 はv3 とはかなり異なっています。v3 で端的に書けていたものが、v4 ではより表現力のある構文言語となった結果としてちょっと冗長になったように思えるんですけどjq っぽいので慣れてしまえばよいものだとおもいます 。

mikefarah.gitbook.io

yq 使ってみる

今回の目的はapplication/deployment.yaml のimageの値をnginx:1.14.2nginx:1.23.3に書き換えたいと思います。yaml をCIで変更するなんてなんぼでもやってますからね。Path などの概念については説明を省略します。普通にシェル芸としてやっていくときには1日1問、半年以内に習得 シェル・ワンライナー160本ノックなどを参考にすると良い。

apiVersion: apps/v1
kind: Deployment
metadata:
  name: nginx-deployment
spec:
  selector:
    matchLabels:
      app: nginx
  replicas: 2 # tells deployment to run 2 pods matching the template
  template:
    metadata:
      labels:
        app: nginx
    spec:
      containers:
      - name: nginx
        image: nginx:1.14.2 # 書き換えたいんじゃ
        ports:
        - containerPort: 80

yq(v4) 使ってみる

yq(v4) でread

yq '.spec.template.spec.containers[0].image' deployment.yaml
nginx:1.14.2

yq(v4) でwrite

yq -i '.spec.template.spec.containers[0].image = "nginx:1.23.3"' deployment.yaml

確認します。

yq '.spec.template.spec.containers[0].image' deployment.yaml
nginx:1.23.3

で目的達成しました簡単!

yq(v3) との違い

yq(v3) にはwritereadなどのサブコマンドが撤廃されたので準拠した書き方を覚える必要があると思います。

mikefarah.gitbook.io

yq(v4) での変数利用

yq(v4)ではstrenv(<env>)を利用することで変数を利用することができる

IMAGE=nginx yq -i '.spec.template.spec.containers[0].image = strenv(IMAGE)' deployment.yaml

確認します。

yq '.spec.template.spec.containers[0].image' deployment.yaml 
nginx

ヤッタネ!!

左辺にはこちら代入できないみたいなのでそのときには作成してからyq に読むこませると良いみたい(他にいい方法があれば教えてほしいです)。

    YQ_INPLACE=".${EXE_APP}.image.tag = \"${TAG_HASH}\""
    yq -i "${YQ_INPLACE}" "$CHANGE_FILE"

おわり

v3 -> v4 には変更点がいくつかあります。皆さんもCIで使っている時は気をつけましょう。 あとはCI で書き換えで使っている時は-vを使っておきましょう。