Helm 函数如何在不知道名称的情况下访问值?

问题描述 投票:0回答:1

我正在开发 Helm 图表并尝试创建通用模板函数。目标是传入任何参数(例如 .Values.name)并在不知道参数的具体情况的情况下使用函数模板。

该函数应接受类似 .Values.name 的参数。

如果满足特定条件(例如.Values.enableTpl),它应该使用 tpl 评估参数。

该函数应该处理各种类型,例如字符串和列表。

{{- define "function" -}}
  {{- $value := . -}} <-- this should pick up the parameter
  {{- if .Values.enableTpl }}
    {{ tpl $value $ }}
  {{- else }}
    {{ $value }}
  {{- end }}
{{- end }}

# Usage in template
{{ include "function" .Values.name }} <-- function should not know about this parameter

尝试此操作时,我在尝试检查enableTpl条件时遇到错误:“无法评估字符串类型中的字段值”。 删除 enableTpl 检查也会失败,因为 .不是实际参数“.Values.name”


请注意,这是我的问题的抽象,所以请不要质疑不只是在没有包含的情况下这样做的原因:)

kubernetes-helm
1个回答
0
投票

Helm 语法有点棘手。 Go 模板函数仅采用单个参数,并且在该函数中,

.
$
的默认值都设置为该参数。

这意味着,如果您既需要某些值又需要顶级 Helm 对象,则需要将它们打包到一个对象中。 我曾经通过将两个对象放入列表中来完成此操作

{{ include "function" (list .Values.name .) }}

然后在函数中解压它们。

{{- define "function" -}}
{{- $value := index . 0 -}}
{{- $top := index . 1 -}}
{{- if $top.Values.enableTpl -}}
{{- tpl $value $top -}}
...

请注意,我们已将顶级 Helm 对象显式作为参数传递;将其解压到函数内的

$top
;然后在任何我们需要一个字段的地方,将其限定为访问
$top

您还可以将两个“参数”作为映射传递

dict "value" .Values.name "top" .
。 如果这样做,则无需在函数中解压它们,可以直接引用 e.g.
.top.Values.enableTpl
tpl .value .top
。 这将一些复杂性从函数推给了调用者。 这两种模式都不常见,但我都见过。

© www.soinside.com 2019 - 2024. All rights reserved.