使用 jinja 2 变量更新 Yaml
Update Yaml with jinja 2 variables in it
我有一个与此类似的用例post:
How can I update a .yml file, ignoring preexisting Jinja syntax, using Python?
我尝试遵循其中给出的答案,但 none 那些为我的 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。
问题是你link的答案,以及ruamel.yaml.jinja2
的版本
你正在使用的不知道 jinja2 的 if 语句。加载过程中
{{-
的 {{
部分被替换,因此它可以被识别为 YAML,但这会导致解析问题
(因为它没有正确缩进,也没有键值对)。
相反,它应该变成某种形式的注释,就像在 ruamel.yaml.jinja2 版本 0.2.6.
中所做的那样
有了它,您可以加载、更新和转储此多文档
YAML 文件:
import os
import sys
import pathlib
import ruamel.yaml
input = pathlib.Path('input.yaml')
yaml = ruamel.yaml.YAML(typ='jinja2')
print('ruamel.yaml.jinja2 version:', ruamel.yaml.jinja2.__version__)
print('====================')
sys.stdout.flush()
data = list(yaml.load_all(input))
# print(data)
data[0]['spec']['ports'][0]['port'] = 1234 # first document update
data[1]['spec']['ports'][0]['targetPort'] = 5678 # second document update
yaml.dump_all(data, pathlib.Path('output.yaml'))
os.system('diff -u input.yaml output.yaml')
给出:
ruamel.yaml.jinja2 version: 0.2.6
====================
--- input.yaml 2021-09-23 14:55:42.303722955 +0200
+++ output.yaml 2021-09-23 15:13:14.663716699 +0200
@@ -12,7 +12,7 @@
ports:
- name: http2-8080
protocol: TCP
- port: 8080
+ port: 1234
targetPort: 8080
selector:
app: {{ .Chart.Name }}
@@ -29,6 +29,6 @@
- name: http-2112
port: {{ .Values.global.monitor.prometheusExporter.trafficListenPort }}
protocol: TCP
- targetPort: 2112
+ targetPort: 5678
selector:
app: {{ .Chart.Name }}
我有一个与此类似的用例post: How can I update a .yml file, ignoring preexisting Jinja syntax, using Python?
我尝试遵循其中给出的答案,但 none 那些为我的 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。
问题是你link的答案,以及ruamel.yaml.jinja2
的版本
你正在使用的不知道 jinja2 的 if 语句。加载过程中
{{-
的 {{
部分被替换,因此它可以被识别为 YAML,但这会导致解析问题
(因为它没有正确缩进,也没有键值对)。
相反,它应该变成某种形式的注释,就像在 ruamel.yaml.jinja2 版本 0.2.6.
有了它,您可以加载、更新和转储此多文档 YAML 文件:
import os
import sys
import pathlib
import ruamel.yaml
input = pathlib.Path('input.yaml')
yaml = ruamel.yaml.YAML(typ='jinja2')
print('ruamel.yaml.jinja2 version:', ruamel.yaml.jinja2.__version__)
print('====================')
sys.stdout.flush()
data = list(yaml.load_all(input))
# print(data)
data[0]['spec']['ports'][0]['port'] = 1234 # first document update
data[1]['spec']['ports'][0]['targetPort'] = 5678 # second document update
yaml.dump_all(data, pathlib.Path('output.yaml'))
os.system('diff -u input.yaml output.yaml')
给出:
ruamel.yaml.jinja2 version: 0.2.6
====================
--- input.yaml 2021-09-23 14:55:42.303722955 +0200
+++ output.yaml 2021-09-23 15:13:14.663716699 +0200
@@ -12,7 +12,7 @@
ports:
- name: http2-8080
protocol: TCP
- port: 8080
+ port: 1234
targetPort: 8080
selector:
app: {{ .Chart.Name }}
@@ -29,6 +29,6 @@
- name: http-2112
port: {{ .Values.global.monitor.prometheusExporter.trafficListenPort }}
protocol: TCP
- targetPort: 2112
+ targetPort: 5678
selector:
app: {{ .Chart.Name }}