首页 > 解决方案 > 使用 yq 更新 yaml 中的嵌套数组值

问题描述

给定一个 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.tag从更新4651.

我有以下内容,可以完成这项工作,但它要求您知道数组项的确切索引:

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

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

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

仅供参考我们的 yq 版本:

$ yq --version
yq 2.10.0

标签: kubernetesyamlkubernetes-helmhelmfileyq

解决方案


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

yq -y '.releases[].set |= map(select(.name == "image.bar_proxy.tag").value=51)' yaml

在jq-playgroundjq查看作用于 JSON 对象的底层过滤器


推荐阅读