yqとは
jsonをCLIで編集するツールとして「jq」が有名なのだけど、
そのyaml版が「yq」であり、「yq」の実装の仕組みは「jq」のラッパーとして動作してyamlとjsonの相互変換で実現されている。
yqを使う目的
近年はkubernetesとかCloudFormationのマニフェスト編集でyamlの操作が不可避であり、習得が迫られる。
しかしながらyamlは編集が面倒で手作業で入力するとエラーになりやすい。
そんな時にyqを使って編集すれば少なくともバリデーションエラーでの事故は回避できる。
現状の課題(困ったこと)
これまでyq version3系を使っていたのだけどCopilotやChatGPTはyq version2あたりのサブコマンド山盛りで回答してくる。
yqのサブコマンドをググるとバージョン不明なサンプルだらけで参考にならない。Googleは本当に役に立たなくなった。
そして最新版のyqはversion4系なのだけど、yq-v2,yq-v3,yq-v4でそれぞれCLI引数にクセがある。そのyqのバージョン違いの挙動等を中心にブログに記しておく。
安定して動くyqを探す
yqは単なるjqのラッパーなのだけど、CLIの引数がバージョンによって異なる。
-
Debian/Ubuntu系OS標準のyq
- Debian/Ubuntu系だとaptでインストール可能。
sudo apt install yq
バージョン表記はなぜか0.0.0
- Debian/Ubuntu系だとaptでインストール可能。
-
pip(python)でインストールするyq
- OSに依存せずpipでインストール可能
pip install yq
Python3.10系での最新バージョンはv3.4.3
- OSに依存せずpipでインストール可能
-
githubのyq
- pipの最新版yqは本当の最新版ではなく、githubのrelease版がyqの最新で挙動もかなり違う。2024年9月の時点ではv4.2.0
※インストール手順
(以下はcurlで最新版を取得するようにしているが、必要にあわせて変更する)
VERSION=$(curl -sL https://api.github.com/repos/mikefarah/yq/releases | jq -r ".[0].name")
BINARY=yq_linux_amd64
wget https://github.com/mikefarah/yq/releases/download/${VERSION}/${BINARY}.tar.gz -O - |\
tar xz && mv ${BINARY} /usr/bin/yq
- golangのyq(yq-go)
- go言語版のyq派生版でjqに依存せずに動くがgo言語に依存する。
※yq-goのインストール方法"go install github.com/mikefarah/yq/v4@latest"
バージョンはv4.44.3でなぜか本家よりもバージョンが高い
- go言語版のyq派生版でjqに依存せずに動くがgo言語に依存する。
※参考※
githubのyq
https://github.com/mikefarah/yq
v3系とv4系の違い
v3系の最小限のオプション
v3系はyamlを読み込むために-yオプションが必須。
yq -y '.nodename' filename.yaml
v4系の最小限のオプション
v4系はeval処理のeオプションが必須になり、-yオプションが不要になった。
yq e '.nodename' filename.yaml
v4系でyamlを編集
v4系はyamlをjsonへ変換してからjqで編集して、結果をyaml出力する。
jsonからyamlへの変換は-Pオプションになった。
yq e filename.yaml -j|jq '.nodename.mykey |="myvalue"'|yq e -P
yq-go(v4)を使う場合の注意点
概ねyq(v4)と同じオプションで動作するのだが、
yq-go(v4)には-jオプションが無く、-o json で代用する必要がある。
逆にyq(v4)には-oオプションがない。
yq e filename.yaml -o json|jq '.nodename.mykey |="myvalue"'|yq e -P
まとめ
yq version4系はyamlパーサーが安定しているのでv3から切り替えたメリットが大きい。これまではpipでyqをインストールしていたのでyq(v3)を信用していたのだが、少し手間でもyq(v4)を導入した方がよかった。
yamlを読み込んでjsonへ変換してしまえば、安定したjqで編集ができるのでバグることも少ない。
サムネイル
Copilot Image Createrで「yq」のキーワードで画像生成させたらサムネイルのような画像になったw