我有以下YAML文件:
apiVersion: apps/v1
kind: Deployment
metadata:
name: nodejs
namespace: test
labels:
app: hello-world
spec:
selector:
matchLabels:
app: hello-world
replicas: 100
template:
metadata:
labels:
app: hello-world
spec:
containers:
- name: hello-world
image: test/first:latest
ports:
- containerPort: 80
resources:
limits:
memory: 2500Mi
cpu: "2500m"
requests:
memory: 12Mi
cpu: "80m"
---
apiVersion: v1
kind: Service
metadata:
name: nodejs
spec:
selector:
app: hello-world
ports:
- protocol: TCP
port: 80
targetPort: 80
nodePort: 30082
type: NodePort
我需要使用Python编辑YAML文件,我已经尝试了下面的代码,但它不适用于具有多个YAML文档的文件。您可以看到下面的图像:
import ruamel.yaml
yaml = ruamel.yaml.YAML()
yaml.preserve_quotes = True
yaml.explicit_start = True
with open(r"D:\deployment.yml") as stream:
data = yaml.load_all(stream)
test = data[0]['metadata']
test.update(dict(name="Tom1"))
test.labels(dict(name="Tom1"))
test = data['spec']
test.update(dict(name="sfsdf"))
with open(r"D:\deploymentCopy.yml", 'wb') as stream:
yaml.dump(data, stream)
您可以参考以下链接了解更多信息:Python: Replacing a String in a YAML file
2条答案
按热度按时间plicqrtu1#
“它不起作用”并不是很具体地描述问题是什么。
load_all()
生成每个文档,因此通常使用以下命令:如果你想把所有的数据都放在一个可索引的列表中,你必须使用
list()
来生成一个生成的数据列表:如果你用
.load_all()
加载变量data
中的多个文档,很可能你不想把data
转储到单个对象中(使用.dump()
),而是想使用.dump_all()
,所以你把data
的每个元素转储到一个单独的文档中:ruamel.yaml
无法区分转储在其根目录下具有列表(即YAML序列)的数据结构,还是转储应位于不同文档中的数据结构列表。除此之外,官方的YAML FAQ在
yaml.org
网站上指出,YAML文件的推荐扩展名是.yaml
。可能有一些项目自这成为推荐以来(16年前,即至少自2006年9月以来)没有更新过。nue99wik2#
我已经添加了引用Anthon's Answer的完整脚本
请参见以下脚本: