有没有办法验证/解析包含 go-template 变量的 YAML 文件?

Cin*_*hou 5 yaml go unmarshalling go-templates kubernetes-helm

我有一个“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 }}
Run Code Online (Sandbox Code Playgroud)

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

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

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

Dav*_*aze 3

不仅仅是 YAML 解析器在抱怨:这实际上是无效的 YAML(因为它{...}是内联映射语法)。看起来它来自 Kubernetes Helm部署工具,一些常规但有趣的用途实际上需要渲染 YAML。

在实践中,您可能想要使用该helm template命令将图表渲染为多文档 YAML,然后对其运行 YAML 验证器。它似乎没有记录,但 Helm 版本 3 实际上会自行执行此验证(Helm 2 不会),因此如果您的图表生成无效的 YAML,此时您会收到错误消息。

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

name: "{{ .Release.Name }}-configmap"
Run Code Online (Sandbox Code Playgroud)

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

{{/* _helpers.tpl */}}
{{- define "<CHARTNAME>.labels" -}}
helm.sh/chart: {{ include "<CHARTNAME>.chart" . }}
{{- end -}}
Run Code Online (Sandbox Code Playgroud)
metadata:
  name: {{ include "<CHARTNAME>.fullname" . }}
  labels:
    {{- include "<CHARTNAME>.labels" . | nindent 4 }}
Run Code Online (Sandbox Code Playgroud)

并且无论引用多少都不会使此 YAML 有效。很可能将一些在 YAML 映射上下文中无效的内容放入“标签”帮助程序模板中,并且您希望在验证阶段捕获它。