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

Kubernetes 使用yq更新yaml中的嵌套数组值,kubernetes,yaml,kubernetes-helm,helmfile,yq,Kubernetes,Yaml,Kubernetes Helm,Helmfile,Yq,给定一个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

给定一个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\u proxy.tag
46
更新到
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

您可以使用以下过滤器使其工作。它通过动态选择标记所在对象的索引来工作。在所选对象上,
。value=51
将根据需要更新该值。您还可以使用
-i
标志对原始文件进行就地修改

yq -y '.releases[].set |= map(select(.name == "image.bar_proxy.tag").value=51)' yaml
请参见下面的作用于JSON对象的底层
jq
过滤器