使用字典拆分和范围的 Helm 模板缩进错误
Helm Template Indention Error Using Dict Split and Range
我正在尝试设置在我的 helm 图表中拥有动态数量的 volume 和 volumeMounts 的能力。这是我的 deployment.yaml 的样子:
volumeMounts:
{{- if .Values.deployment.hostPath }} {{ $dict := split ":" .Values.deployment.hostPath }} {{ range $idx, $val := $dict }} {{ $mnt := split "," $val }}
- mountPath: {{ $mnt._1 }}
name: {{ $mnt._0 }}
{{ end }}
{{ end }}
volumes:
{{- if .Values.deployment.hostPath }} {{ $dict := split ":" .Values.deployment.hostPath }} {{ range $idx, $val := $dict }} {{ $mnt := split "," $val }}
- name: {{ $mnt._0 }}
hostPath:
path: {{ $mnt._2 }}
{{- if $mnt._3 }}
type: {{ $mnt._3 }}
{{ end }}
{{ end }}
{{ end }}
在 values.yaml 我有这样的东西:
Deployment:
hostPath: test-host-path,/path/on/pod,/path/on/node,Directory
我正在做的是检查是否为 hostPath 定义了任何内容。如果有,我会创建一个字典,通过“:”拆分项目。在第一个示例中,只有一个值字符串,因为没有 : 定界符。然后它执行一个循环范围(以防有多个值集由':'分隔)然后它用逗号分割一组值。
所以对于第一个示例,使用 helm install 就可以正常工作:
values.yaml --> hostPath: test-host-path,/path/on/pod,/path/on/node,Directory
volumeMounts:
- mountPath: /path/on/pod
name: test-host-path
volumes:
- name: test-host-path
hostPath:
path: /path/on/node
type: Directory
类型字段是可选的,所以我有一个块来检查它是否已定义,如果没有,它不会在 yaml 中呈现它。所以在我的下一个例子中,当我在最后一个逗号之后没有任何价值时,它也有效:
values.yaml --> hostPath: test-host-path,/path/on/pod,/path/on/node,
volumeMounts:
- mountPath: /path/on/pod
name: test-host-path
volumes:
- name: test-host-path
hostPath:
path: /path/on/node
但现在如果我尝试添加第二组数据,用“:”分隔,则在 helm install 上会失败:
Deployment:
hostPath: test-host-path,/path/on/pod,/path/on/node,Directory:test-host-path-two,/path/on/pod/two,/path/on/node/two,Directory
Error: YAML parse error on chart/templates/deployment.yaml: error converting YAML to JSON: yaml: line 152: found a tab character that violates indentation
helm.go:94: [debug] error converting YAML to JSON: yaml: line 152: found a tab character that violates indentation
当然它提到了一个选项卡,但我不太明白问题是什么。我使用相同的代码 (dict、range、split) 来填充 configmap 中的多个条目,所以我认为它可以工作。但显然我在这里遗漏了一些东西。任何帮助将不胜感激。
制表符可能潜入的位置并不完全明显。确实跳出来的一件事是模板中有一些额外的白色space;例如,在 {{ range }}
循环开始后有一个 space 可能会抛出问题。
如果您遇到白色space 或缩进问题,需要检查的一件好事是 helm template
输出; Helm 3 将打印“error converting YAML”,如您所示,如果它确实错误,但添加 helm template --debug
选项仍会打印它。
其他有用的经验法则是在一行中只放置一个模板结构;在开口内放置一个 -
"swallow whitespace" 标记但不关闭花括号;通常将模板结构放在第一列。这些规则会让你得到类似
volumeMounts:
{{- if .Values.deployment.hostPath }}
{{- $dict := split ":" .Values.deployment.hostPath }}
{{- range $idx, $val := $dict }}
{{- $mnt := split "," $val }}
- mountPath: {{ $mnt._1 }}
name: {{ $mnt._0 }}
{{- end }}
{{- end }}
volumes:
{{- if .Values.deployment.hostPath }}
{{- $dict := split ":" .Values.deployment.hostPath }}
{{- range $idx, $val := $dict }}
{{- $mnt := split "," $val }}
- name: {{ $mnt._0 }}
hostPath:
path: {{ $mnt._2 }}
{{- if $mnt._3 }}
type: {{ $mnt._3 }}
{{- end }}
{{- end }}
{{- end }}
通过检查此布局,您应该能够判断缩进是正确的。例如,在第一个示例中,在 - mountPath:
之前有一个换行符和 spaces,在最后一个 {{- end }}
之后有一个换行符,但应该清楚没有杂散的换行符或 spaces 在模板代码行之间。
我正在尝试设置在我的 helm 图表中拥有动态数量的 volume 和 volumeMounts 的能力。这是我的 deployment.yaml 的样子:
volumeMounts:
{{- if .Values.deployment.hostPath }} {{ $dict := split ":" .Values.deployment.hostPath }} {{ range $idx, $val := $dict }} {{ $mnt := split "," $val }}
- mountPath: {{ $mnt._1 }}
name: {{ $mnt._0 }}
{{ end }}
{{ end }}
volumes:
{{- if .Values.deployment.hostPath }} {{ $dict := split ":" .Values.deployment.hostPath }} {{ range $idx, $val := $dict }} {{ $mnt := split "," $val }}
- name: {{ $mnt._0 }}
hostPath:
path: {{ $mnt._2 }}
{{- if $mnt._3 }}
type: {{ $mnt._3 }}
{{ end }}
{{ end }}
{{ end }}
在 values.yaml 我有这样的东西:
Deployment:
hostPath: test-host-path,/path/on/pod,/path/on/node,Directory
我正在做的是检查是否为 hostPath 定义了任何内容。如果有,我会创建一个字典,通过“:”拆分项目。在第一个示例中,只有一个值字符串,因为没有 : 定界符。然后它执行一个循环范围(以防有多个值集由':'分隔)然后它用逗号分割一组值。
所以对于第一个示例,使用 helm install 就可以正常工作:
values.yaml --> hostPath: test-host-path,/path/on/pod,/path/on/node,Directory
volumeMounts:
- mountPath: /path/on/pod
name: test-host-path
volumes:
- name: test-host-path
hostPath:
path: /path/on/node
type: Directory
类型字段是可选的,所以我有一个块来检查它是否已定义,如果没有,它不会在 yaml 中呈现它。所以在我的下一个例子中,当我在最后一个逗号之后没有任何价值时,它也有效:
values.yaml --> hostPath: test-host-path,/path/on/pod,/path/on/node,
volumeMounts:
- mountPath: /path/on/pod
name: test-host-path
volumes:
- name: test-host-path
hostPath:
path: /path/on/node
但现在如果我尝试添加第二组数据,用“:”分隔,则在 helm install 上会失败:
Deployment:
hostPath: test-host-path,/path/on/pod,/path/on/node,Directory:test-host-path-two,/path/on/pod/two,/path/on/node/two,Directory
Error: YAML parse error on chart/templates/deployment.yaml: error converting YAML to JSON: yaml: line 152: found a tab character that violates indentation
helm.go:94: [debug] error converting YAML to JSON: yaml: line 152: found a tab character that violates indentation
当然它提到了一个选项卡,但我不太明白问题是什么。我使用相同的代码 (dict、range、split) 来填充 configmap 中的多个条目,所以我认为它可以工作。但显然我在这里遗漏了一些东西。任何帮助将不胜感激。
制表符可能潜入的位置并不完全明显。确实跳出来的一件事是模板中有一些额外的白色space;例如,在 {{ range }}
循环开始后有一个 space 可能会抛出问题。
如果您遇到白色space 或缩进问题,需要检查的一件好事是 helm template
输出; Helm 3 将打印“error converting YAML”,如您所示,如果它确实错误,但添加 helm template --debug
选项仍会打印它。
其他有用的经验法则是在一行中只放置一个模板结构;在开口内放置一个 -
"swallow whitespace" 标记但不关闭花括号;通常将模板结构放在第一列。这些规则会让你得到类似
volumeMounts:
{{- if .Values.deployment.hostPath }}
{{- $dict := split ":" .Values.deployment.hostPath }}
{{- range $idx, $val := $dict }}
{{- $mnt := split "," $val }}
- mountPath: {{ $mnt._1 }}
name: {{ $mnt._0 }}
{{- end }}
{{- end }}
volumes:
{{- if .Values.deployment.hostPath }}
{{- $dict := split ":" .Values.deployment.hostPath }}
{{- range $idx, $val := $dict }}
{{- $mnt := split "," $val }}
- name: {{ $mnt._0 }}
hostPath:
path: {{ $mnt._2 }}
{{- if $mnt._3 }}
type: {{ $mnt._3 }}
{{- end }}
{{- end }}
{{- end }}
通过检查此布局,您应该能够判断缩进是正确的。例如,在第一个示例中,在 - mountPath:
之前有一个换行符和 spaces,在最后一个 {{- end }}
之后有一个换行符,但应该清楚没有杂散的换行符或 spaces 在模板代码行之间。