用yq更新yaml中的嵌套数组值

问题描述 投票:1回答:1

给出如下的yaml文件(helmfile)

releases:
  - chart: ../charts/foo
    name: foo
    namespace: '{{ .Values.stack }}'
    values:
      - ../config/templates/foo-values.yaml.gotmpl
    set:
      - name: image.tag
        value: 22
      - name: replicas
        value: 1
  - chart: ../charts/bar
    name: bar
    namespace: '{{ .Values.stack }}'
    values:
      - ../config/templates/bar-values.yaml.gotmpl
    set:
      - name: image.bar_proxy.tag
        value: 46
      - name: image.bar.tag
        value: 29
      - name: replicas
        value: 1

我正在尝试一种干净的方法来更新特定的图像标签。例如,我想将image.bar_proxy.tag46更新为51

我有以下工作,但需要您知道数组项的确切索引:

yq -y '.releases[] |= if .name=="bar" then .set[0].value |= 51 else . end' helmfile-example.yaml

因此,如果数组顺序在某个时候发生改变,则会中断。

[一种优选的解决方案是:“将image.bar_proxy.tag的值从46更新为51,其中set []。name == image.bar_proxy.tag”。关于如何实现更具体的条件选择的任何想法?

仅供参考,我们的yq版本:

$ yq --version
yq 2.10.0
kubernetes yaml kubernetes-helm helmfile yq
1个回答
0
投票

您可以使用以下过滤器使其正常工作。它通过动态选择标记所在的对象的索引来工作]

 yq -y '.releases[].set |= (map(select(.name == "image.bar_proxy.tag").value=51))' yaml
© www.soinside.com 2019 - 2024. All rights reserved.