有没有办法 validate/parse 带有 go-template 变量的 YAML 文件?

Is there a way to validate/parse a YAML file with go-template variables in it?

我有一个“YAML”文件。我想在渲染其中的 go-template 变量之前验证它。例如:

apiVersion: v1
kind: ConfigMap
metadata:
  name: {{ .Release.Name }}-configmap
data:
  myvalue: "Hello World"
  drink: {{ .Values.favorite.drink | default "tea" | quote }}
  food: {{ .Values.favorite.food | upper | quote }}

典型的 YAML 解析器在这里不起作用,因为它将解析 { 作为映射的开始。

err := yaml.Unmarshal(data, &Content)
// Failed to parse the provided YAML: yaml: line 4: did not find expected key

不知是否有任何软件包可以帮我做到这一点?我在网上搜索了一段时间,但没有运气。感谢您的帮助!

不,这是不可能的。先评估模板。

不仅仅是 YAML 解析器抱怨:实际上是无效的 YAML(因为 {...} 是内联映射语法)。这看起来像是来自 Kubernetes Helm 部署工具,并且一些 routine-but-interesting 使用确实需要渲染 YAML。

在实践中,您可能想要使用 helm template 命令将图表呈现为 multi-document YAML,然后 运行 对其进行 YAML 验证。它似乎没有记录,但 Helm 版本 3 实际上会自己进行此验证(Helm 2 不会),因此如果您的图表生成无效的 YAML,您将在此时收到错误。

Helm 的工作方式,它将此“YAML”文件解释为纯文本文件并对其应用 Go text/template 模板,然后将其作为 YAML 读回。在某种程度上,您可以通过自己引用字符串来制作此有效的 YAML:

name: "{{ .Release.Name }}-configmap"

但是有一些相当常见的构造实际上会破坏生成的 YAML。例如,helm create 模板 generates

{{/* _helpers.tpl */}}
{{- define "<CHARTNAME>.labels" -}}
helm.sh/chart: {{ include "<CHARTNAME>.chart" . }}
{{- end -}}
metadata:
  name: {{ include "<CHARTNAME>.fullname" . }}
  labels:
    {{- include "<CHARTNAME>.labels" . | nindent 4 }}

再多的引用也无法使这个 YAML 有效。很有可能将一些在 YAML 映射上下文中无效的内容放入“标签”帮助程序模板中,而您想在验证阶段捕获它。