问题描述
我将尝试重现一个 helm 模板函数的一个非常奇怪的行为(或者可能是我的误解),它基本上检测 values.yaml 文件中节点的存在。其实没那么简单,但这是最简单的方法来说明问题:
我使用的是 v2.16.1 helm 版本,但它在较新的 3.3 上被复制。 按照以下步骤操作:
- 创建示例图表
helm create myChart
- 将函数附加到 myChart 助手
cat << EOF >> myChart/templates/_helpers.tpl
{{- define "myChart.hasNodeA" -}}
{{- \$found := false -}}
{{- if .Values.A -}}
{{- \$found := true -}}
{{- end -}}
{{- print \$found -}}
{{- end -}}
EOF
(注意美元转义,这只是为了方便您使用 cat/EOF 附加函数)
- 在部署中附加呈现的条件:
cat << EOF >> myChart/templates/deployment.yaml
{{- if eq (include "myChart.hasNodeA" .) "true" }}
hasNodeA: "yes"
{{- end }}
{{- if eq (include "myChart.hasNodeA" .) "false" }}
hasNodeA: "no"
{{- end }}
EOF
- 在没有和有节点的情况下进行渲染:
helm template myChart | grep hasNodeA
这里显示“no”,虽然它“正确”,但这是因为函数总是返回“false”
添加节点:
cat << EOF >> myChart/values.yaml
A:
whatever: 555
EOF
你会看到问题:
helm template myChart | grep hasNodeA
这个节目再次“不”。
问题是函数条件正在满足,事实上,如果你测试这个(编辑_helpers.tpl文件将打印输出移到中间):
{{- define "myChart.hasNodeA" -}}
{{- $found := false -}}
{{- if .Values.A -}}
{{- $found := true -}}
{{- print $found -}}
{{- end -}}
{{- end -}}
你会看到条件真的通过了:
$> helm template myChart | grep hasNodeA
hasNodeA: "yes"
显然这不适用于负面情况。 这里奇怪的是,在条件中配置的变量在最后打印时似乎被忽略了。
对这种行为有什么想法吗? 谢谢你
解决方法
在 Helm 中,使用运算符 :=
在其上下文中创建一个新变量。在本例中,您正在创建一个新的 $found
变量。在 Helm v3 中,您可以使用 =
运算符解决此问题。
如果您使用的是 Helm v2,那么这将使用大量 if 来解决。
BR