Helm模板渲染values.yaml含{}字段失败,求解决方案
Argo Rollout金丝雀步骤Helm模板渲染错误修复
问题场景
你的values.yaml中定义了Istio金丝雀发布的步骤数组:
istio: canary: enabled: true steps: - setWeight: 10 - pause: {} - setWeight: 20 - pause: { duration: 20 } - setWeight: 30 - pause: {} - setWeight: 40 - pause: { duration: 20 } - setWeight: 50 - pause: {} - setWeight: 75 - pause: { duration: 20 } - setWeight: 90 - pause: {}
需要将该数组渲染到argos-rollout.yaml的spec.strategy.canary.steps位置,但原模板写法报错:
error converting YAML to JSON: yaml: mapping values are not allowed in this context
原错误模板代码:
apiVersion: argoproj.io/v1alpha1 kind: Rollout metadata: name: my-rollout spec: strategy: canary: steps: {{- range .Values.istio.canary.steps }} - {{ toYaml . | nindent 8 }} {{- end }}
错误原因
原写法中使用nindent 8会在toYaml输出的每一行前额外添加8个空格,结合列表项- 的已有缩进,导致YAML层级错乱,触发解析错误。
修复方案
有两种简洁的修复方式:
方式1:直接渲染整个数组(推荐)
不需要循环单个元素,直接将values中的steps数组完整渲染到目标位置,自动保持正确格式:
apiVersion: argoproj.io/v1alpha1 kind: Rollout metadata: name: my-rollout spec: strategy: canary: steps: {{ toYaml .Values.istio.canary.steps | indent 8 }}
方式2:调整循环中的缩进处理
如果必须使用range循环,改用indent并调整缩进数值,同时用trim去除多余换行:
apiVersion: argoproj.io/v1alpha1 kind: Rollout metadata: name: my-rollout spec: strategy: canary: steps: {{- range .Values.istio.canary.steps }} - {{ toYaml . | indent 6 | trim }} {{- end }}
两种方式都能确保生成的YAML格式正确,避免解析错误。
内容的提问来源于stack exchange,提问作者esahmo
相关产品推荐
相关产品推荐

