【问题标题】:Is there a way to validate/parse a YAML file with go-template variables in it?有没有办法验证/解析带有 go-template 变量的 YAML 文件?
【发布时间】:2020-08-05 17:49:26
【问题描述】:

我有一个“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

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

【问题讨论】:

  • 我认为这不可能。您可以渲染它并 then 检查它是否是有效的 yaml。但在此之前,你不知道输入变量的某些值是否会使yaml失效。
  • 首先将其作为模板执行,然后将其解析为 YAML - 尽管有人可能想知道为什么您首先要这样做。还要避免问诸如“我想知道是否有任何软件包可以帮助我做到这一点?”之类的问题。 - 这里有一个有效的问题,但这个问题(要求图书馆推荐)在 SO 上特别离题。
  • 您可以使用"missingkey=zero" 渲染它并且不使用数据,这样表达式就会被删除,然后尝试加载它。

标签: go yaml kubernetes-helm unmarshalling go-templates


【解决方案1】:

抱怨的不仅仅是 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 映射上下文中无效的内容放入“标签”帮助程序模板中,并且您希望在验证阶段捕获它。

【讨论】:

    【解决方案2】:

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

    【讨论】:

      猜你喜欢
      • 2022-10-06
      • 1970-01-01
      • 1970-01-01
      • 2017-10-26
      • 2021-12-06
      • 2012-07-07
      • 2016-05-23
      • 1970-01-01
      • 2022-11-20
      相关资源
      最近更新 更多