【问题标题】:Updating the Yaml file, with new fields using ruamel使用 ruamel 使用新字段更新 Yaml 文件
【发布时间】:2019-09-08 17:40:48
【问题描述】:

我正在尝试使用 ruamel python 更新 yaml 文件。

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

我想在“规范”中添加的预期字段是:

  nodeSelector:
    kubernetes.io/hostname: kubew1

任何想法如何使用 ruamel 库来实现这一点。

【问题讨论】:

    标签: yaml pyyaml ruamel.yaml


    【解决方案1】:

    在您的 YAML 文件中,您的根级集合是一个映射,并且该映射中键 spec 的值本身就是一个映射。这两个映射都使用名为 CommentedMapruamel.yaml 加载为类似 dict 的对象。

    与普通的dicts 一样,您可以添加键值对、删除键(及其值)和更新键的值,但没有.append() 方法,因为有一个列表(即将额外的项目附加到列表中)。

    您的输出有点简洁,但您当然不能只将nodeSelector 添加到任何内容(列表/序列或字典/映射)并期望它自动添加kubernetes.io/hostname: kubew1(其本身的映射)。

    你的尝试:

    result['spec']['nodeSelector']['kubernetes.io/hostname'] = 'kubew1'
    

    无法工作,因为没有字典 result['spec']['nodeSelector'] 您可以在其中添加密钥 kubernetes.io/hostname

    您要么首先必须创建一个带有 emtpy dict 作为值的键:

    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 不是很清楚的声明,尽管上下文通常提供足够的信息你实际使用的是哪个库。

    【讨论】:

      猜你喜欢
      • 2021-05-02
      • 1970-01-01
      • 1970-01-01
      • 2020-05-23
      • 2021-12-17
      • 1970-01-01
      • 2016-09-26
      • 2015-04-17
      • 1970-01-01
      相关资源
      最近更新 更多