You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

ArgoCD Helm模板中如何将Secrets转为可正常调用的字典?

解决ArgoCD传递Helm复杂参数后无法遍历的问题

在通过ArgoCD部署包含自定义应用和Nginx Ingress的Helm资源时,遇到以下问题:

  • 传入的secrets是包含键值对的列表结构
  • 传递到自定义应用的Helm参数后,下游ConfigMap模板中secrets被解析为Go原生类型的字符串([map[name:xxxx value:xxx] map[name:yyyy value:yyy]]),无法通过$val.name、$val.value遍历访问

方案一:使用Helm values字段传递完整YAML结构(推荐)

这种方式直接传递结构化YAML,从根源避免字符串序列化问题:

  1. 修改ArgoCD Application中自定义应用的source配置:
- repoURL: https://github.com/blabla.git
  targetRevision: "main"
  path: this_is/where_the_values_file_is
  helm:
    ignoreMissingValueFiles: true
    releaseName: test
    values: |
      secrets:
{{ $val.secrets | toYaml | nindent 6 }}
  1. 调整ConfigMap模板直接遍历结构化数据:
---
apiVersion: v1
kind: ConfigMap
metadata:
  name: cm
data:
{{ range $secret := .Values.secrets }}
  {{ $secret.name }}: {{ $secret.value | quote }}
{{ end }}

方案二:修复参数传递的序列化与解析

如果必须使用parameters传递参数,需要确保传递合法YAML字符串,并在下游解析:

  1. 修改ArgoCD Application的Helm参数配置:
parameters:
- name: secrets
  value: "{{ $val.secrets | toYaml | trim }}"
  1. 调整ConfigMap模板解析YAML字符串并遍历:
---
apiVersion: v1
kind: ConfigMap
metadata:
  name: cm
data:
{{ range $secret := .Values.secrets | fromYaml }}
  {{ $secret.name }}: {{ $secret.value | quote }}
{{ end }}

问题根源

原写法中直接输出{{ $val.secrets }}会生成Go语言中map切片的原生字符串表示,这不是合法的YAML格式,导致下游fromYaml无法解析成可遍历的结构。通过toYaml将Go结构序列化为标准YAML字符串,下游再用fromYaml解析,就能恢复成可正常访问的列表结构。

内容的提问来源于stack exchange,提问作者Saar. Win

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.07.05 20:48:39