Helm模板中如何获取map类型值的所有键生成列表
Helm 模板提取map所有键的实现方案
Helm 模板内置了keys函数,可以直接返回map类型值的所有键组成的列表,不需要额外在Values中维护冗余的键列表,也不用手动遍历拼接。
具体修改方式
- 直接删除Values.yaml中冗余的
environment_names字段,修改后的默认配置如下:
default: environments: preview: server: https://sds something: adkfgdf preview-test: server: https://sds staging: server: https://35.246.225.83
- 模板中通过类型判断兼容两种配置格式:用
kindIs判断environments字段的类型,如果是map就用keys提取键列表,如果是列表就直接使用,兜底场景取默认配置下environments的键列表,完全复用同一套循环逻辑。
修改后的Application模板代码如下:
{{- range $service := $.Values.services }} {{- $environment_names := list }} {{- if kindIs "map" $service.environments }} {{- $environment_names = keys $service.environments }} {{- else if kindIs "slice" $service.environments }} {{- $environment_names = $service.environments }} {{- else }} {{- /* 无服务级配置时,取默认环境map的所有键 */}} {{- $environment_names = keys $.Values.default.environments }} {{- end }} {{- range $env_name := $environment_names }} {{- $environment := get $.Values.default.environments $env_name }} --- apiVersion: argoproj.io/v1alpha1 kind: Application debug1: {{ $environment_names }} debug: {{ $env_name }} debug2: {{ $service.name }} {{- end }} {{- end }}
补充说明
keys返回的键列表默认是无序的,如果需要固定遍历顺序,可以在外层套sortAlpha做字母排序,例如keys $service.environments | sortAlpha,就能得到稳定的有序键列表。- Go template原生的列表确实是不可变值,
append操作会返回新列表而非修改原列表,手动遍历map拼接列表的方案不仅繁琐还容易出错,直接用keys是最简洁的原生实现。 - 类型判断逻辑可以无缝适配两种Values写法:既支持服务级
environments直接写环境名列表,也支持写map结构自动提取键,不需要额外维护冗余字段。
内容的提问来源于stack exchange,提问作者Vini
相关产品推荐
相关产品推荐

