yqのバージョン依存での挙動の違いまとめ:yq-v3とyq-v4の違い

yq

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

  • pip(python)でインストールするyq

    • OSに依存せずpipでインストール可能
      pip install yq
      

      Python3.10系での最新バージョンはv3.4.3

  • 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でなぜか本家よりもバージョンが高い

※参考※

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

出典「Copilot Image Creater」
Bing
Bing のインテリジェント検索機能により、探しているものをより簡単にすばやく見つけられるようになり、リワードも得られます。