helm 语法 {{ something }} 和 {{- something }} 有什么区别?

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

我试图理解 helm 模板并发现这样的语法:

  {{- if not .Values.autoscaling.enabled }}
  replicas: {{ .Values.replicaCount }}
  {{- end }}

所以我认为每件事都必须以

{{-
开头,但后来我发现了其他没有该语法的语法:

        - name: {{ .Chart.Name }}

所以我的问题是这两种语法有什么区别?破折号有什么作用?什么时候需要?

kubernetes-helm
1个回答
30
投票

Helm 模板语法基于 Go 编程语言的text/template 包
大括号

{{
}}
是进入和退出模板逻辑的左括号和右括号。

Helm 文档位于 https://helm.sh/docs/chart_template_guide/control_structures/ 讨论了为什么在示例中需要这种语法。

YAML 赋予空白意义,因此管理空白变得非常重要。 [...] 模板声明的花括号语法

{{
可以用特殊字符修改,以告诉模板引擎压缩空格。
{{-
(添加破折号和空格)表示应该向左切掉空格,而
-}}
表示应该消耗右边的空格。当心!换行符是空格!

所以答案是这样的。

{{
语法和
{{-
语法的区别是
{{- something }}
会导致左边的空格被删除。如果没有这个,将包含任何额外的空间,这可能会导致 YAML 格式不正确。

请参阅 Helm 文档,其中详细介绍了此语法的工作原理并删除了额外的空格。

你会经常看到破折号出现在控制结构中,因为没有这个额外的空间会添加到你的 YAML 文件中,这可能会导致创建无效的语法。所以,例如,

{{- if semverCompare ">=1.14-0" .Capabilities.KubeVersion.GitVersion -}}
apiVersion: networking.k8s.io/v1beta1
{{- else -}}
apiVersion: extensions/v1beta1
{{- end }}

使得属性

apiVersion
被输出(在YAML文件中)而不在属性前后添加空行。

简单的例子

Go 模板文档

执行源为

的模板时
"{{23 -}} < {{- 45}}"

生成的输出将是

"23<45"

这表明破折号语法导致空格被删除。

学习使用 Helm 语法进行实验

下面我将解释如何开始尝试 helm 语法 使用一个简单的一次性项目。

下面的命令我创建一个临时目录

testhelm
并进入它,然后运行
create helm mytest
创建一个helm应用程序。

接下来,我创建一个示例 helm YAML 文件。这是您要将要测试的内容放入其中的文件。下面我使用了文件

mytest/templates/my.yaml
,但是可以创建任何文件。

Helm 显然获取模板目录中的所有文件并解析/处理它们以创建 YAML 输出(用于创建 Kubernetes YAML 文件以配置 K8S 应用程序)。

在我们的案例中,我们只是利用

helm
命令创建一个测试台供我们使用。

如果您使用的是基于 UNIX 的系统,您应该能够复制并粘贴下面的整个代码示例以创建 testbed 以开始试验。

mkdir testhelm
cd testhelm

helm create mytest

cat <<EOF > mytest/templates/my.yaml
expression1: "{{   23    }} < {{     45    }}"
expression2: "{{   23    -}} < {{-    45    }}"

aTest0: ArgWithNoSpace
aTest1:      Arg with spaces on left and right
aTest2:      "    spaces-on-left-and-right    "
aTest3: {{ "     spaces-on-left-and-right   " }}
aTest4: {{ "     spaces-on-left-and-right   " | trim | quote }}

aTest5: Some
{{- "Thing Funky is" -}} goingOn
     {{- "    here"}}
drink2: {{ .Values.drink2 | default "coffee" | quote }}
aTest6: Some    {{ "Thing Funky is" }}    goingOn    {{ "    here"}}
EOF

然后运行

helm template
命令,如下所示,并研究您获得的输出。

helm template myproj ./mychart | less
. . . output trimmed . . .
# Source: mychart/templates/my.yaml
expression1: "23 < 45"
expression2: "23<45"

aTest0: ArgWithNoSpace
aTest1:      Arg with spaces on left and right
aTest2:      "    spaces-on-left-and-right    "
aTest3:      spaces-on-left-and-right
aTest4: "spaces-on-left-and-right"

aTest5: SomeThing Funky isgoingOn    here
drink2: "coffee"
aTest6: Some Thing Funky is goingOn    here

前两个名称/值对

expression1
expression2
显示使用和不使用破折号语法的区别。

还要注意

aTest5
的语法,它导致多行合并为一行输出。

使用这种方法以一口大小的块消化 Helm 语法,因此当您需要修复某些东西时,您可以理解您所看到的内容。

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