【问题标题】:Update nested array value in yaml with yq使用 yq 更新 yaml 中的嵌套数组值
【发布时间】:2020-09-17 02:35:53
【问题描述】:

给定一个 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 where set[].name==image.bar_proxy.tag”。关于如何实现更具体的条件选择的任何想法?

仅供参考我们的 yq 版本:

$ yq --version
yq 2.10.0

【问题讨论】:

    标签: kubernetes yaml kubernetes-helm helmfile yq


    【解决方案1】:

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

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

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

    【讨论】:

    • 使用 yq=4.9.1,未知速记标志:'y' in -y
    • @SHAHS:这个答案是 github.com/kislyuk/yq,如果你有 Go 版本 mikefarah/yq,请单独提问
    • 如果它对其他人有帮助,我试图更新 helm 图表的 requirements.yaml 文件中的存储库,通过 yq e '.dependencies[] |= select(.name == "test-chart") .repository= requirements.yaml
    • 好的,感谢您的澄清,我没有意识到这是不同的 yq 实现。
    猜你喜欢
    • 2021-05-14
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2021-05-03
    • 1970-01-01
    • 1970-01-01
    • 2021-12-18
    相关资源
    最近更新 更多