如何从 Python 将竖线 (|) 添加到 yaml 文件中

Liv*_*ont 2 python yaml pyyaml kubernetes configmap

我有一个任务。我需要编写 python 代码来为 kubernetes 生成 yaml 文件。到目前为止我一直在使用 pyyaml 并且效果很好。这是我生成的 yaml 文件:

apiVersion: v1
kind: ConfigMap
data:
  info: 
    name: hostname.com
    aio-max-nr: 262144
    cpu:
      cpuLogicalCores: 4
    memory:
      memTotal: 33567170560
    net.core.somaxconn: 1024
    ...
Run Code Online (Sandbox Code Playgroud)

但是,当我尝试创建此 configMap 时,错误是 info 需要 string() 而不是地图。所以我探索了一下,解决这个问题的最简单方法似乎是在信息后面添加一个管道,如下所示:

apiVersion: v1
kind: ConfigMap
data:
  info: | # this will translate everything in data into a string but still keep the format in yaml file for readability
    name: hostname.com
    aio-max-nr: 262144
    cpu:
      cpuLogicalCores: 4
    memory:
      memTotal: 33567170560
    net.core.somaxconn: 1024
    ...
Run Code Online (Sandbox Code Playgroud)

这样我的configmap就创建成功了。我的苦恼是我不知道如何从 python 代码中添加管道栏。这里我手动添加了它,但我想自动化整个过程。

我写的Python代码的一部分是,假装数据是一个dict():

content = dict()
content["apiVersion"] = "v1"
content["kind"] = "ConfigMap"
data = {...}
info = {"info": data}
content["data"] = info

# Get all contents ready. Now write into a yaml file
fileName = "out.yaml"
with open(fileName, 'w') as outfile:
    yaml.dump(content, outfile, default_flow_style=False)   
Run Code Online (Sandbox Code Playgroud)

我在网上查了很多案例,但没有一个符合我的需求。提前致谢。

fly*_*lyx 5

管道使包含的值成为字符串。该字符串不会由 YAML 处理,即使它包含采用 YAML 语法的数据也是如此。因此,您需要提供一个字符串作为值。

由于字符串包含 YAML 语法中的数据,因此您可以通过在上一步中使用 YAML 处理包含的数据来创建字符串。要使 PyYAML 以文字块样式(即使用|)转储标量,您需要一个自定义表示器:

import yaml, sys
from yaml.resolver import BaseResolver

class AsLiteral(str):
  pass

def represent_literal(dumper, data):
  return dumper.represent_scalar(BaseResolver.DEFAULT_SCALAR_TAG,
      data, style="|")

yaml.add_representer(AsLiteral, represent_literal)

info = {
  "name": "hostname.com",
  "aio-max-nr": 262144,
  "cpu": {
    "cpuLogicalCores": 4
  }
}

info_str = AsLiteral(yaml.dump(info))

data = {
  "apiVersion": "v1",
  "kind": "ConfigMap",
  "data": {
    "info": info_str
  }
}

yaml.dump(data, sys.stdout)
Run Code Online (Sandbox Code Playgroud)

通过将渲染的 YAML 数据放入类型中AsLiteral,将调用注册的自定义表示器,将所需的样式设置为|