如何在Helm的range函数下添加else条件处理混合前缀密钥?
解决Helm SecretProviderClass同时拉取应用特定前缀密钥与通用密钥的问题
需求说明
需要对现有Helm SecretProviderClass模板进行修改,在secretObjects.data和parameters.objects.array的循环中添加条件判断逻辑,实现:
- 对于通用密钥(如示例中
COMMON-开头的密钥),从密钥保管库拉取无发布名前缀的密钥对象 - 对于应用特定密钥,拉取带当前发布名大写前缀的密钥对象
- 确保最终生成的密钥项无重复
修改后的完整模板代码
spec: provider: azure secretObjects: - data: {{- range .Values.keyvault.secrets }} {{- if hasPrefix "COMMON-" . }} - key: {{ . }} objectName: {{ . }} {{- else }} - key: {{ . }} objectName: {{ $.Release.Name | upper }}-{{ . }} {{- end }} {{- end }} secretName: {{ $.Release.Name }}-kvsecret type: opaque parameters: usePodIdentity: "false" useVMManagedIdentity: "false" userAssignedIdentityID: "" keyvaultName: {{ .Values.keyvault.name | default "mykv01" }} objects: | array: {{- range .Values.keyvault.secrets }} {{- if hasPrefix "COMMON-" . }} - | objectName: {{ . }} objectType: secret {{- else }} - | objectName: {{ $.Release.Name | upper }}-{{ . }} objectType: secret {{- end }} {{- end }} tenantId: {{ .Values.keyvault.tenantid }} {{- end }} {{- end -}}
关键改动说明
- 条件判断逻辑:在两个
range .Values.keyvault.secrets循环中,通过hasPrefix "COMMON-" .判断当前密钥是否为通用密钥:- 通用密钥:直接使用
objectName: {{ . }},即无发布名前缀的原始密钥名 - 应用特定密钥:保留原有逻辑,使用
{{ $.Release.Name | upper }}-{{ . }}作为密钥对象名
- 通用密钥:直接使用
- 避免重复:由于每个密钥在
values.yaml的secrets列表中仅出现一次,循环处理时每个密钥只会生成一条对应配置,天然避免重复 - 灵活性扩展:如果你的通用密钥命名规则不是
COMMON-开头,可以修改hasPrefix的参数,比如改为contains "COMMON"或者自定义的标识规则
示例验证(以发布名为APPA为例)
根据提供的values.yaml,最终生成的配置片段如下:
- secretObjects.data部分:
- key: MY-SECRET-1 objectName: APPA-MY-SECRET-1 - key: MY-SECRET-2 objectName: APPA-MY-SECRET-2 - key: COMMON-SECRET-1 objectName: COMMON-SECRET-1 - key: COMMON-SECRET-2 objectName: COMMON-SECRET-2 - parameters.objects.array部分:
array: - | objectName: APPA-MY-SECRET-1 objectType: secret - | objectName: APPA-MY-SECRET-2 objectType: secret - | objectName: COMMON-SECRET-1 objectType: secret - | objectName: COMMON-SECRET-2 objectType: secret
内容的提问来源于stack exchange,提问作者Vowneee
相关产品推荐
相关产品推荐

