如何在 Helm 的范围函数中使用模板化值
How to use template-ized value in the range function in Helm
我正在为 Prometheus 使用 helm chart,并计划为不同的环境提供不同的警报管理器文件集。
现有图表的提取部分:
{{- $root := . -}}
{{- range $key, $value := .Values.alertmanagerFiles }}
{{ $key }}: |
{{ toYaml $value | default "{}" | indent 4 }}
{{- end -}}
为了覆盖这部分,我定义了一个模板变量
{{- define "prometheus.alertmanagerFiles" -}}
{{- if .Values.alertmanagerFiles.custom -}}
{{- printf "alertmanagerFiles_%s" .Values.cluster.env }}
{{- else -}}
{{- default "default" .Values.alertmanagerFiles -}}
{{- end -}}
{{- end -}}
有了这个,我每个环境都有一个新变量 - 例如:alertmanagerFiles_dev 用于开发,但由于我缺乏知识而一无所知,我不知道如何在范围函数。
试过这个但不起作用:
{{- $root := . -}}
{{- range $key, $value := template "prometheus.alertmanagerFiles" . }}
{{ $key }}: |
{{ toYaml $value | default "{}" | indent 4 }}
{{- end -}}
任何帮助、线索或方向都会对我有所帮助。
您不需要为此自定义图表。相反,当您 helm install
或 helm upgrade
图表
时,您可以为每个环境提供一组不同的值
helm upgrade prometheus stable/prometheus --install -f values.dev.yaml
这通常比在模板代码中放置一个间接层更容易和更可取。
如果您确实想要使用您所展示的间接层,您将受到 Go 模板可能的 return 类型的限制。标准的 Go template
指令只写入输出,而不会 return 任何东西。 Helm has an include
function 而是 return 将渲染模板的内容作为字符串。不过,这是唯一可以从模板中 return 的东西。
在您的情况下,prometheus.alertmanagerFiles
模板会生成一个字符串,因此您可以 include
它来获取要包含的顶级值的名称。然后你可以使用标准的 Go 模板 index
函数从 .Values
中提取那个项目。这大致看起来像:
{{- $fileKey := include "prometheus.alertmanagerFiles" . }}
{{- range $key, $value := index .Values $fileKey }}
...
{{- end -}}
我正在为 Prometheus 使用 helm chart,并计划为不同的环境提供不同的警报管理器文件集。 现有图表的提取部分:
{{- $root := . -}}
{{- range $key, $value := .Values.alertmanagerFiles }}
{{ $key }}: |
{{ toYaml $value | default "{}" | indent 4 }}
{{- end -}}
为了覆盖这部分,我定义了一个模板变量
{{- define "prometheus.alertmanagerFiles" -}}
{{- if .Values.alertmanagerFiles.custom -}}
{{- printf "alertmanagerFiles_%s" .Values.cluster.env }}
{{- else -}}
{{- default "default" .Values.alertmanagerFiles -}}
{{- end -}}
{{- end -}}
有了这个,我每个环境都有一个新变量 - 例如:alertmanagerFiles_dev 用于开发,但由于我缺乏知识而一无所知,我不知道如何在范围函数。
试过这个但不起作用:
{{- $root := . -}}
{{- range $key, $value := template "prometheus.alertmanagerFiles" . }}
{{ $key }}: |
{{ toYaml $value | default "{}" | indent 4 }}
{{- end -}}
任何帮助、线索或方向都会对我有所帮助。
您不需要为此自定义图表。相反,当您 helm install
或 helm upgrade
图表
helm upgrade prometheus stable/prometheus --install -f values.dev.yaml
这通常比在模板代码中放置一个间接层更容易和更可取。
如果您确实想要使用您所展示的间接层,您将受到 Go 模板可能的 return 类型的限制。标准的 Go template
指令只写入输出,而不会 return 任何东西。 Helm has an include
function 而是 return 将渲染模板的内容作为字符串。不过,这是唯一可以从模板中 return 的东西。
在您的情况下,prometheus.alertmanagerFiles
模板会生成一个字符串,因此您可以 include
它来获取要包含的顶级值的名称。然后你可以使用标准的 Go 模板 index
函数从 .Values
中提取那个项目。这大致看起来像:
{{- $fileKey := include "prometheus.alertmanagerFiles" . }}
{{- range $key, $value := index .Values $fileKey }}
...
{{- end -}}