首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >使用jinja 2变量更新Yaml

使用jinja 2变量更新Yaml
EN

Stack Overflow用户
提问于 2021-09-23 12:01:10
回答 1查看 935关注 0票数 1

我有一个类似于这篇文章的用例:How can I update a .yml file, ignoring preexisting Jinja syntax, using Python?

我试着遵循其中给出的答案,但我的YAML语法中没有一个是这样的。以下是我的YAML:

代码语言:javascript
复制
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,但由于无法在该语言中找到任何解决方案,所以我转向Python。

EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2021-09-23 13:10:52

问题是,您链接到的答案,以及您正在使用的ruamel.yaml.jinja2版本,都不知道jinja2 2的if-语句。在加载{{期间,{{-的部分会被替换,因此它可以被识别为YAML,但这会导致解析问题(因为它没有正确缩进,也不是键值对)。相反,它应该变成某种形式的注释,就像在ruamel.yaml.jinja2版本0.2.6中所做的那样。

这样您就可以加载、更新和转储这个多文档的YAML文件:

代码语言:javascript
复制
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')

这意味着:

代码语言:javascript
复制
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 }}
票数 1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/69299611

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档