使用字典拆分和范围的 Helm 模板缩进错误

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

我正在尝试设置在我的舵图中具有动态数量的卷和卷安装的能力。 这是我的部署.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 安装会失败:

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)来填充配置映射中的多个条目,所以我认为它可以工作。但显然我在这里遗漏了一些东西。 任何帮助将不胜感激。

kubernetes yaml kubernetes-helm go-templates
1个回答
2
投票

制表符可能潜入的位置并不完全明显。确实跳出来的一件事是模板中存在一些额外的空白;例如,在

{{ range }}
循环开始后有一个空格,可能会导致问题发生。

如果遇到空格或缩进问题,最好检查一下

helm template
输出;如果确实错误,Helm 3 将打印“转换 YAML 时出错”,如您所示,但添加
helm template --debug
选项无论如何都会打印它。

其他有用的经验法则是在一行上只放置一个模板结构;在开口内放置一个

-
“吞掉空白”标记,但不关闭大括号;通常将模板结构放在第一列。 这些规则会给你带来类似的东西

    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:
之前有一个换行符和空格,最后一个
{{- end }}
之后有一个换行符,但应该清楚的是,模板代码行之间没有杂散的换行符或空格。

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