kubernetes 如何在Python中编辑包含多个YAML文档的文件

b1zrtrql  于 2022-12-22  发布在  Kubernetes
关注(0)|答案(2)|浏览(127)

我有以下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

plicqrtu

plicqrtu1#

“它不起作用”并不是很具体地描述问题是什么。
load_all()生成每个文档,因此通常使用以下命令:

for data in yaml.load_all(stream):
    # work on the data of each individual document

如果你想把所有的数据都放在一个可索引的列表中,你必须使用list()来生成一个生成的数据列表:

data = list(yaml.load_all(stream))

如果你用.load_all()加载变量data中的多个文档,很可能你不想把data转储到单个对象中(使用.dump()),而是想使用.dump_all(),所以你把data的每个元素转储到一个单独的文档中:

with open(r"D:\deploymentCopy.yaml", 'wb') as stream:
    yaml.dump(data, stream)

ruamel.yaml无法区分转储在其根目录下具有列表(即YAML序列)的数据结构,还是转储应位于不同文档中的数据结构列表。
除此之外,官方的YAML FAQ在yaml.org网站上指出,YAML文件的推荐扩展名是.yaml。可能有一些项目自这成为推荐以来(16年前,即至少自2006年9月以来)没有更新过。

nue99wik

nue99wik2#

我已经添加了引用Anthon's Answer的完整脚本
请参见以下脚本:

import ruamel.yaml

yaml = ruamel.yaml.YAML()
yaml.preserve_quotes = True
yaml.explicit_start =  True

with open(r"D:\deployment.yml") as stream:
    data=list(yaml.load_all(stream))

data[0]['metadata']['namespace']="namespace"
data[0]['metadata']['labels']['app']="namespace"
data[0]['spec']['template']['spec']['containers'][0]['name']="test"

data[1]['spec']['selector']['app']="test"

with open(r"D:\deploymentCopy.yml", 'wb') as stream:
    yaml.dump_all(data, stream)

相关问题