【发布时间】:2021-11-16 19:53:44
【问题描述】:
我有一个类似于这篇文章的用例: How can I update a .yml file, ignoring preexisting Jinja syntax, using Python?
我尝试遵循其中给出的答案,但没有一个适用于我的 YAML 语法。以下是我的 YAML:
kind: Service
metadata:
name: {{ .Chart.Name }}
labels:
app: {{ .Chart.Name }}
service: {{ .Chart.Name }}
spec:
{{- if eq .Values.global.node.networkIpVersion "ipv6" }}
ipFamily: IPv6
{{- end }}
type: ClusterIP
ports:
- name: http2-8080
protocol: TCP
port: 8080
targetPort: 8080
selector:
app: {{ .Chart.Name }}
---
apiVersion: v1
kind: Service
metadata:
name: {{ .Chart.Name }}-traffic
labels:
app: {{ .Chart.Name }}
service: {{ .Chart.Name }}-traffic
spec:
ports:
- name: http-2112
port: {{ .Values.global.monitor.prometheusExporter.trafficListenPort }}
protocol: TCP
targetPort: 2112
selector:
app: {{ .Chart.Name }}
另一件事是我的 YAML 中有多个模板。
我的用例更多用于 Node JS,但由于我找不到该语言的任何解决方案,所以我转向 Python。
【问题讨论】:
-
如果您的用例是在不解释模板指令的情况下修改显示的输入,那么您需要一个可以表示该结构的数据模型,包括模板指令。通常,在您使用 Jinja 处理输入之前,您的输入不是有效的 YAML,因此您无法使用 YAML 解析器加载未处理的输入。 OTOH,Jinja 是一个解释器,据我所知,它不提供对模板结构的 API 访问——即使提供了,非 Jinja 部分也会是断开的字符串,可能不会解析为独立的 YAML 片段。这是在工作中使用错误工具的情况。
-
现在的问题是,什么是正确的工具?有可能,但没有明确的答案。最重要的是,XML 有可能在其 DOM 中表示处理指令。您也可以尝试直接在 YAML 中编码您的模板指令,而不是使用 Jinja,这通常可以使用本地标签(例如
!expr .Chart.Name而不是{{ .Chart.Name}}),但是当您想要将字符串连接到一个值时很快就会变得混乱。您可能想要编辑您的问题以更详细地说明您的用例,但总的来说,这对于 SO 来说太复杂了。
标签: python node.js yaml pyyaml ruamel.yaml