给定如下所示的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
从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
2条答案
按热度按时间ef1yzkbh1#
你可以使用下面的过滤器来使它工作。它通过动态选择你的标签所在的对象的索引来工作。在所选的对象上,
.value=51
将根据你的需要更新值。你也可以使用-i
标志来就地修改原始文件。参见作用于jq-playground处JSON对象的底层
jq
过滤器fwzugrvs2#
考虑到Helmfile的使用环境,有几种方法可以实现这一点,而不必编辑
helmfile.yaml
。Helmfile允许在许多地方使用Go语言text/template
,类似于底层的Helm工具,并且有一些其他的特性可以提供帮助。您可以做的最简单的事情之一是利用
values:
是一个列表,并且未知值通常被忽略。您(或您的CI/CD系统)可以编写一个单独的YAML文件,其中只包含标记(JSON可能更容易编写,并且是有效的YAML)然后将此文件作为附加文件包含在
helmfile.yaml
中。(这相当于将helm install -f
与多个本地值文件一起使用,而不是使用helm install --set
单个值。)Helmfile的模板扩展还包括
env
和requiredEnv
,用于从主机系统读取普通的环境变量。Helm本身没有这些扩展来尝试最小化图表的隐式输入数量,但对于Helmfile来说,这是一种在部署时提供值的可能方式。