使用 ruamel 使用新字段更新 Yaml 文件
Updating the Yaml file, with new fields using ruamel
我正在尝试使用 ruamel 更新 yaml 文件 python。
proc=subprocess.Popen(['kubectl','get','pod','web3','-o','yaml','--export'], stdout=subprocess.PIPE)
rein=proc.stdout.read()
result, indent, block_seq_indent = ruamel.yaml.util.load_yaml_guess_indent(rein, preserve_quotes=True)
到目前为止我已经试过了:
result['spec'].append('nodeSelector')
给出错误:
result['spec'].append('nodeSelector')
AttributeError: 'CommentedMap' object has no attribute 'append'
也试过这样的:
result['spec']['nodeSelector']['kubernetes.io/hostname']='kubew1'
给出:
result['spec']['nodeSelector']['kubernetes.io/hostname']='kubew1'
File "/usr/local/lib/python3.6/dist-packages/ruamel/yaml/comments.py", line 752, in __getitem__
return ordereddict.__getitem__(self, key)
KeyError: 'nodeSelector'
我的初始 Yaml 文件是:
apiVersion: v1
kind: Pod
metadata:
creationTimestamp: null
labels:
app: demo
name: web
name: web3
selfLink: /api/v1/namespaces/default/pods/web3
spec:
containers:
- image: aexlab/flask-sample-one
imagePullPolicy: Always
name: web
ports:
- containerPort: 5000
name: http
protocol: TCP
resources: {}
terminationMessagePath: /dev/termination-log
terminationMessagePolicy: File
volumeMounts:
- mountPath: /var/run/secrets/kubernetes.io/serviceaccount
name: default-token-7bcc9
readOnly: true
dnsPolicy: ClusterFirst
enableServiceLinks: true
我想在 'spec' 中添加的预期字段是:
nodeSelector:
kubernetes.io/hostname: kubew1
关于如何使用 ruamel 库实现此目的的任何想法。
在您的 YAML 文件中,您的根级别集合是一个映射,并且该映射中的键 spec
的值本身就是一个映射。这两个映射都使用名为 CommentedMap
.
的 ruamel.yaml
加载为类似 dict
的对象
与普通的 dict
s 一样,您可以添加键值对、删除键(及其值)以及更新键的值,但是没有 .append()
方法,因为有一个列表(即将一个额外的项目附加到列表)。
您的输出有点简洁,但当然您不能只将 nodeSelector
添加到任何内容(list/sequence 或 dict/mapping)并期望添加 kubernetes.io/hostname: kubew1
(一个映射本身)自动。
您的尝试:
result['spec']['nodeSelector']['kubernetes.io/hostname'] = 'kubew1'
无法工作,因为没有字典 result['spec']['nodeSelector']
,您可以在其中添加键 kubernetes.io/hostname
。
您要么首先必须创建一个以空字典作为值的键:
result['spec']['nodeSelector'] = {}
result['spec']['nodeSelector']['kubernetes.io/hostname'] = 'kubew1'
或做
result['spec']['nodeSelector'] = {'kubernetes.io/hostname': 'kubew1'}
请注意,以上内容与 ruamel.yaml
没有太大关系,那只是基本的 Python 数据结构操作。另请注意,在 ruamel 命名空间中有超过 100 个库,其中 ruamel.yaml
只是作为开源发布的几个库之一,因此使用 ruamel
不是很清楚的声明,当然上下文通常提供了关于您实际使用哪个库的足够信息。
我正在尝试使用 ruamel 更新 yaml 文件 python。
proc=subprocess.Popen(['kubectl','get','pod','web3','-o','yaml','--export'], stdout=subprocess.PIPE)
rein=proc.stdout.read()
result, indent, block_seq_indent = ruamel.yaml.util.load_yaml_guess_indent(rein, preserve_quotes=True)
到目前为止我已经试过了:
result['spec'].append('nodeSelector')
给出错误:
result['spec'].append('nodeSelector')
AttributeError: 'CommentedMap' object has no attribute 'append'
也试过这样的:
result['spec']['nodeSelector']['kubernetes.io/hostname']='kubew1'
给出:
result['spec']['nodeSelector']['kubernetes.io/hostname']='kubew1'
File "/usr/local/lib/python3.6/dist-packages/ruamel/yaml/comments.py", line 752, in __getitem__
return ordereddict.__getitem__(self, key)
KeyError: 'nodeSelector'
我的初始 Yaml 文件是:
apiVersion: v1
kind: Pod
metadata:
creationTimestamp: null
labels:
app: demo
name: web
name: web3
selfLink: /api/v1/namespaces/default/pods/web3
spec:
containers:
- image: aexlab/flask-sample-one
imagePullPolicy: Always
name: web
ports:
- containerPort: 5000
name: http
protocol: TCP
resources: {}
terminationMessagePath: /dev/termination-log
terminationMessagePolicy: File
volumeMounts:
- mountPath: /var/run/secrets/kubernetes.io/serviceaccount
name: default-token-7bcc9
readOnly: true
dnsPolicy: ClusterFirst
enableServiceLinks: true
我想在 'spec' 中添加的预期字段是:
nodeSelector:
kubernetes.io/hostname: kubew1
关于如何使用 ruamel 库实现此目的的任何想法。
在您的 YAML 文件中,您的根级别集合是一个映射,并且该映射中的键 spec
的值本身就是一个映射。这两个映射都使用名为 CommentedMap
.
ruamel.yaml
加载为类似 dict
的对象
与普通的 dict
s 一样,您可以添加键值对、删除键(及其值)以及更新键的值,但是没有 .append()
方法,因为有一个列表(即将一个额外的项目附加到列表)。
您的输出有点简洁,但当然您不能只将 nodeSelector
添加到任何内容(list/sequence 或 dict/mapping)并期望添加 kubernetes.io/hostname: kubew1
(一个映射本身)自动。
您的尝试:
result['spec']['nodeSelector']['kubernetes.io/hostname'] = 'kubew1'
无法工作,因为没有字典 result['spec']['nodeSelector']
,您可以在其中添加键 kubernetes.io/hostname
。
您要么首先必须创建一个以空字典作为值的键:
result['spec']['nodeSelector'] = {}
result['spec']['nodeSelector']['kubernetes.io/hostname'] = 'kubew1'
或做
result['spec']['nodeSelector'] = {'kubernetes.io/hostname': 'kubew1'}
请注意,以上内容与 ruamel.yaml
没有太大关系,那只是基本的 Python 数据结构操作。另请注意,在 ruamel 命名空间中有超过 100 个库,其中 ruamel.yaml
只是作为开源发布的几个库之一,因此使用 ruamel
不是很清楚的声明,当然上下文通常提供了关于您实际使用哪个库的足够信息。