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

标签 go yaml kubernetes-helm unmarshalling go-templates

我有一个“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部署工具,以及一些常规但有趣的用途实际上需要呈现 YAML。

在实践中你可能想要的是使用 helm template命令将图表呈现为多文档 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 映射上下文中无效的内容放入“标签”帮助程序模板中,而您想在验证阶段捕获它。

关于go - 有没有办法验证/解析其中包含 go-template 变量的 YAML 文件?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/63270815/

相关文章:

go - 从 Golang 中的文本文件中读取?

go - 如何迭代 google.protobuf.ListValue

java - 如何更改 snakeyaml 中的隐式类型(int 到 double)

azure - 将容器从 ACR 部署到 AKS

kubernetes-helm - 在值 YAML 文件中使用变量

testing - 如何在 go test 中检查日志/输出?

android - 特拉维斯-CI `Android 28 licenses have not been accepted`

Airflow 2 Helm Chart - 如何指定mysql连接字符串

postgresql - 在 Gitlab CI 中部署 helm chart 时如何修复节点主机名太长

macos - Golang - 发布基本命令 "vet"和 "godoc"