YQ :より良いあなたのYAML資源を扱うのを助けるコマンドラインツール

10025 ワード

あなたのYAMLファイルのフィールドを更新するときは、標準的な練習は、動的に値を置き換えることができるテンプレートツールを使用することです.しかしながら、展開されたマニフェストが静的なYAMLファイルであると思われるので、Kubernetesはそれ自身のどんなテンプレートメカニズムも提供しません.
エンターyq .yq YAMLファイルをテンプレート化するための偉大なコマンドラインツールであり、それはヘルムやKustomize .

yq ?yq はYAMLを変換するために設計されたコマンドラインツールです.似ているjq それはYAMLの代わりにJSONを変えることに集中します.

何ができるかyq YAMLファイルを入力として受け取り、
  • ファイルから値を読み込みます.
  • 新しい値を追加します.
  • 既存の値を更新します.
  • 新しいYAMLファイルを生成します.
  • YAMLをJSONに変換します.
  • 2つ以上のYAMLファイルをマージします.

  • インストール
    インストールできますyq Mac OSでは
    $ brew install yq
    
    Linuxでは
    $ sudo add-apt-repository ppa:rmescandon/yq
    sudo apt-get install yq
    

    In case you don't have the add-apt-repository command
    installed, you can install it with apt-get install software-
    properties-common
    .


    Windows上で実行可能ファイルをダウンロードすることができますGithub .

    ユースケースシナリオ

    YAML値の読み込み
    次のPODで作業しているとします.
    apiVersion: v1
    kind: Pod
    metadata:
      name: test-pod
    spec:
      containers:
      - name: test-container
        image: k8s.gcr.io/busybox
        env:
        - name: DB_URL
          value: postgres://db_url:5432
    
    環境変数の値を読むことができましたENV 次のコマンドを実行します.
    $ yq r pod.yaml "spec.containers[0].env[0].value"
    postgres://db_url:5432
    
    $ 
    
    このコマンドは次のように動作します.
  • yq r はYAMLファイルから値を読み込むコマンドです.
  • pod.yaml 読みたいYAMLのファイルパスです.
  • spec.containers[0].env[0].value はクエリパスです.

  • YAML値の変更
    前の例を見てみましょう.あなたが生産環境でアプリケーションを展開し、生産データベースにURLを変更したいと言う.
    ここでは、1つだけのコマンドを使用して同じように行う方法を示します.
    $ yq w pod.yaml "spec.containers[0].env[0].value" "postgres://prod:5432"
    apiVersion: v1
    kind: Pod
    metadata:
      name: test-pod
    spec:
      containers:
      - name: test-container
        image: k8s.gcr.io/busybox
        env:
        - name: DB_URL
          value: postgres://prod:5432
    
    $
    
    ここで気づくなら.yq 結果を標準出力に出力します.YAMLを適当に編集したいなら、-i フラグ.
    使用の利点yq 言う以上sed ( bashで)sed , yq YAML形式を理解し、構造化されたマークアップをナビゲートし、展開できます.

    Note: sed treats files as strings and it doesn't mind if the
    file isn't a valid YAML.



    3 . YAMLファイルのマージ
    クラスタに送信されたすべてのPODに余分なコンテナを注入したいと仮定しましょう.
    しかし、使用する代わりにAdmission Webhook , あなたは展開スクリプトで余分なコマンドを加えることに決めます.
    YAMLファイルとして追加コンテナのYAML設定を保存できます.
    apiVersion: v1
    kind: Pod
    metadata:
      name: envoy-pod
    spec:
      containers:
      - name: proxy-container
        image: envoyproxy/envoy:v1.12.2
        ports:
          - containerPort: 80
    
    このようにpodを持っていると仮定します.
    $ apiVersion: v1
    kind: Pod
    metadata:
      name: test-pod
    spec:
      containers:
      - name: test-container
        image: k8s.gcr.io/busybox
        env:
        - name: DB_URL
          value: postgres://db_url:5432
    
    $
    
    次のコマンドを実行し、2つのYAMLをマージできます.
    $ yq m --append pod.yaml envoy-pod.yaml
    

    Please notice the --append flag that is necessary to append
    values to an array. You can find more details in the official
    documentation
    .


    出力には追加のコンテナとして使節というプロキシがあります.
    $ apiVersion: v1
    kind: Pod
    metadata:
      name: test-pod
    spec:
      containers:
      - name: test-container
        image: k8s.gcr.io/busybox
        env:
        - name: DB_URL
          value: postgres://db_url:5432
      - name: proxy-container
        image: envoyproxy/envoy:v1.12.2
        ports:
          - containerPort: 80
    
    

    Please note that yq sorts the YAML fields in the output alphabetically, so the order of fields in your output could be different from the > above listing.


    言い換えると、2つのYAMLファイルは1つにマージされます.

    使用制限yq ?
    yq 偉大なYAMLを変換すると、それは独自のいくつかの問題があります.
  • 2つのYAMLファイルはトップレベルでマージされます.例えば、YAMLファイルのチャンクを.spec.containers[] .
  • ファイルの順序が問題です.を返します.yq 年にポッドの名前のために使節ポッドを保ってくださいmetadata.name .
  • 言わないとyq 明示的にappend and overwrite values . それらは文書全体に適用されるフラグであるので、粒度を正しく得ることは難しい.
  • 制限があってもyq 小さなプロジェクトに取り組んでいる場合は特に、使用する可能性がたくさんあります.

    代替案
    あなたがより複雑な変換を適用したいならばyq . KustomizeはYAMLファイルを使用しますkustomization.yaml YAMLをテンプレート化する方法を決めます.
    Kustomizeと他の興味深い選択肢についてはこちらをご覧ください.Templating YAML with real code