如何使用yq向YAML文件的HelmRelease补丁追加权限条目?
用yq给指定HelmRelease补丁追加列表条目
示例Kustomization YAML
假设你的kustomization.yaml结构如下:
apiVersion: kustomize.config.k8s.io/v1beta1 kind: Kustomization patches: - target: kind: HelmRelease name: my-app patch: |- apiVersion: helm.toolkit.fluxcd.io/v2beta1 kind: HelmRelease metadata: name: my-app spec: values: rbac: namespaceAdmin: - existing-user-1 namespaceDebugger: - existing-user-2 - target: kind: HelmRelease name: other-app patch: |- apiVersion: helm.toolkit.fluxcd.io/v2beta1 kind: HelmRelease name: other-app spec: values: rbac: namespaceAdmin: - user-x
问题根源
你之前操作失败的核心原因是:patch字段是多行字符串格式(用|-标记),无法直接像结构化YAML那样修改内部列表,必须先把字符串解析为YAML对象,修改后再转回字符串格式。
正确的yq命令(v4版本)
使用mikefarah/yq v4版本,执行以下命令可给my-app对应的HelmRelease补丁的两个列表追加新条目:
yq e ' .patches[] |= ( select(.target.name == "my-app") | .patch = (.patch | fromyaml | .spec.values.rbac.namespaceAdmin += ["new-admin-user"] | .spec.values.rbac.namespaceDebugger += ["new-debug-user"] | toyaml) ) ' kustomization.yaml
如果需要直接修改原文件(原地编辑),加上-i参数即可:
yq -i e ' .patches[] |= ( select(.target.name == "my-app") | .patch = (.patch | fromyaml | .spec.values.rbac.namespaceAdmin += ["new-admin-user"] | .spec.values.rbac.namespaceDebugger += ["new-debug-user"] | toyaml) ) ' kustomization.yaml
命令拆解
.patches[] |=:遍历所有补丁条目,直接修改原对象(而非返回新对象)select(.target.name == "my-app"):精准筛选出目标HelmRelease对应的补丁.patch = (.patch | fromyaml | ... | toyaml):fromyaml:将patch的多行字符串解析为可操作的YAML结构namespaceAdmin += ["new-admin-user"]:给指定列表追加新条目toyaml:修改完成后将YAML结构转回字符串格式
内容的提问来源于stack exchange,提问作者Arun
相关产品推荐
相关产品推荐

