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

ukxgm1gy  于 2023-01-16  发布在  Kubernetes
关注(0)|答案(2)|浏览(215)

给定如下所示的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
ef1yzkbh

ef1yzkbh1#

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

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

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

fwzugrvs

fwzugrvs2#

考虑到Helmfile的使用环境,有几种方法可以实现这一点,而不必编辑helmfile.yaml。Helmfile允许在许多地方使用Go语言text/template,类似于底层的Helm工具,并且有一些其他的特性可以提供帮助。
您可以做的最简单的事情之一是利用values:是一个列表,并且未知值通常被忽略。您(或您的CI/CD系统)可以编写一个单独的YAML文件,其中只包含标记(JSON可能更容易编写,并且是有效的YAML)

# tags.yaml
image:
  tag: 22
  bar: {tag: 29}
  bar_proxy: {tag: 46}

然后将此文件作为附加文件包含在helmfile.yaml中。(这相当于将helm install -f与多个本地值文件一起使用,而不是使用helm install --set单个值。)

releases:
  - name: foo
    values:
      - ../config/templates/foo-values.yaml.gotmpl
      - tags.yaml
    # no `set:`
  - name: bar
    values:
      - ../config/templates/bar-values.yaml.gotmpl
      - tags.yaml
      - replicas: 1
    # no `set:`

Helmfile的模板扩展还包括envrequiredEnv,用于从主机系统读取普通的环境变量。Helm本身没有这些扩展来尝试最小化图表的隐式输入数量,但对于Helmfile来说,这是一种在部署时提供值的可能方式。

releases:
  - name: bar
    set:
      - name: image.bar_proxy.tag
        value: {{ env "BAR_PROXY_TAG" | default "46" }}
      - name: image.bar.tag
        value: {{ requiredEnv "BAR_TAG" }}

相关问题