Helm 中如何对 range 遍历的列表过滤并提取唯一的 user、pass 配置项?
Helm中实现range遍历结果过滤去重的实现方法
常见写法失效的核心原因
pick函数的作用是从单个字典对象中抽取指定键的内容,无法直接作用于整个字典数组完成批量字段提取- Sprig内置的
uniq函数仅支持字符串、数字这类标量值的去重,对结构完全一致的字典对象无法直接识别为重复项,直接套在数组上无法达到预期的去重效果
可落地的去重实现逻辑
核心思路是在遍历过程中维护一个临时的已处理集合,将当前条目的关键信息拼接成唯一标识,每次遍历先判断该标识是否已存在于集合中:如果已存在则直接跳过,不存在则正常生成配置,同时将该标识加入已处理集合。
完整模板写法参考:
{{- /* 初始化空字典作为已处理标记集合 */}} {{- $processed := dict }} {{- range .Values.clients }} {{- /* 用名称、用户名、密码拼接成去重用的唯一key */}} {{- $dedupKey := printf "%s_%s_%s" .name .user .pass }} {{- /* 判断是否已经处理过这个条目 */}} {{- if not (hasKey $processed $dedupKey) }} {{- /* 未处理过的条目,标记为已处理 */}} {{- $_ := set $processed $dedupKey true }} - name: {{ .name | printf "user_%s" }} valueFrom: secretKeyRef: name: somesecret key: {{ .user | quote }} - name: {{ .name | printf "pass_%s" }} valueFrom: secretKeyRef: name: somesecret key: {{ .pass | quote }} {{- end }} {{- end }}
效果说明
按照上述写法,遍历到示例中第二个与第一个内容完全重复的clientA条目时,因拼接生成的去重key完全一致,会被直接跳过,最终生成的配置可完全匹配期望输出。如果后续values中同一个name对应的user、pass值发生变化,拼接的key会随之改变,也会被识别为新条目正常生成,不会出现误去重的问题。
内容的提问来源于stack exchange,提问作者Catalin M
相关产品推荐
相关产品推荐

