kubernetes - 使用 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
从更新46
到51
.
我有以下内容,可以完成这项工作,但它要求您知道数组项的确切索引:
yq -y '.releases[] |= if .name=="bar" then .set[0].value |= 51 else . end' helmfile-example.yaml
因此,如果数组顺序在某个时候发生变化,这将会中断。
一个首选的解决方案是:“将 image.bar_proxy.tag 值从46
where 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
在jq-playgroundjq
查看作用于 JSON 对象的底层过滤器
推荐阅读
- nativescript - 在buttonclick nativescript上隐藏标签
- html - django中的散景图没有水平绘制
- c++ - 看似简单的循环的安全显式矢量化
- mysql - 如何通过 MySQL 中的查询从照片表中为每个帖子选择一张照片
- java - FileNotFoundException on method tomcat.addwebapp() 在fat jar中运行嵌入式tomcat,在maven的目标文件夹之外
- selenium - Selenium 无法选择元素,因为不存在直接选择器
- c# - Web API 中的线程最佳实践
- r - 将 R 与使用“滞后记录”记录的 IOT 数据一起使用(仅记录差异)
- javascript - 如何在本机反应中将两个按钮放在同一行中?
- html - 为什么表格单元格的宽度取决于 Chrome 69 中另一个内部表格的动态内容?