【问题标题】:Creating YAML for Kubernetes with Python3使用 Python3 为 Kubernetes 创建 YAML
【发布时间】:2019-08-28 23:13:14
【问题描述】:

我正在尝试为 Kubernetes 创建我的角色 YAML 文件,但我遇到了所需 YAML 的这个特定部分:

rules:
- apiGroups: [""] # "" indicates the core API group
  resources: ["pods"]
  verbs: ["get", "watch", "list"]

我尝试将其添加为字典,然后将其添加为 -apiGroups 行中包含字典的列表,但这会导致规则的其余参数出现问题。即使我指定了default_flow_style=False

,当我使用 yaml.dump 时,我也遇到了 [] 显示的问题
def create_role_yml(role_filename, team_name, group_user):
    """
    https://kubernetes.io/docs/reference/
    access-authn-authz/rbac/#role-and-clusterrole
    """

    yml_file_kubernetes_data = dict(

        apiVersion='rbac.authorization.k8s.io/v1',
        kind='Role',
        metadata=dict(
            namespace=team_name,
            name=group_user,
            ),
        rules={
            [{'apiGroups':""}],
            'resourses': '[pods]',
            'verbs':'[get, watch, list]'}

        )

    with open(role_filename, 'w') as outfile:
        yaml.dump(yml_file_kubernetes_data, outfile, 
                  default_flow_style=False)

我想打开 YAML,让它看起来与 Kubernetes 参考 YAML 完全一样:

kind: Role
apiVersion: rbac.authorization.k8s.io/v1
metadata:
  namespace: default
  name: pod-reader
rules:
- apiGroups: [""] # "" indicates the core API group
  resources: ["pods"]
  verbs: ["get", "watch", "list"]

但我将 [ ] 分开,而没有 - 用于 apiGroup。这是我的结果:

kind: Role
apiVersion: rbac.authorization.k8s.io/v1
metadata:
  namespace: default
  name: pod-reader
rules:
apiGroups:
- "" # "" indicates the core API group
resources: 
- "pods"
verbs: 
-"get"
-"watch"
-"list"

【问题讨论】:

  • 您确定在您的输出(帖子的最后三行)中的序列项指示符 (-) 之后没有空格

标签: python-3.x kubernetes yaml pyyaml


【解决方案1】:

你尝试做的事情对于你可以交给 PyYAML 的dump() 的普通参数是不可能的, 使用default_flow_style

  • True: 一切都是流式的(类似 JSON)
  • False: 一切都是块状的
  • None:叶子集合是流式的,其余是块式的

你引用的 YAML 有两个块样式的叶子集合:值 对于键 metadata,以及流式叶子集合: 键 verbs 的值。如果不入侵代表,您将无法 在 PyYAML 中实现这一点。

以您的特定形式生成 YAML 的更简单方法是 使用知道如何的解析器读取-修改-写入您预期的 YAML 保留格式。您可以使用ruamel.yaml 做到这一点,即 专门为保存这些东西而开发的(免责声明:我 我是那个包的作者)。

如果你的输入文件是input.yaml:

kind: Role
apiVersion: rbac.authorization.k8s.io/v1
metadata:
  namespace:
rules:
- apiGroups: [""] # "" indicates the core API group
  resources: ["pods"]
  verbs: ["get", "watch", 'list']

metadata 下的单个条目是故意的,但您可以同时指定两者,或者如果 你分配而不是更新)

还有以下程序:

import sys
from pathlib import Path
import ruamel.yaml

yaml_str = """\
"""

in_file = Path("input.yaml")
out_file = Path("output.yaml")

team_name = "default"
group_user = "pod-reader"


yaml = ruamel.yaml.YAML()
yaml.preserve_quotes = True
data = yaml.load(in_file)
data["metadata"].update(dict(namespace=team_name, name=group_user))
yaml.dump(data, out_file)

output.yaml:

kind: Role
apiVersion: rbac.authorization.k8s.io/v1
metadata:
  namespace: default
  name: pod-reader
rules:
- apiGroups: [""] # "" indicates the core API group
  resources: ["pods"]
  verbs: ["get", "watch", 'list']

请注意,除了块/流样式,还有单/双引号 从原始和评论被保留。你的缩进 已与默认值匹配,因此未明确设置 (yaml.indent(mapping=2, sequence=2, offset=0))。

【讨论】:

    【解决方案2】:

    规则实际上是一个映射数组,因此您需要将其更改为如下所示:

    #!/usr/bin/env python
    
    import yaml
    
    yml_file_kubernetes_data = dict(
    
        apiVersion='rbac.authorization.k8s.io/v1',
        kind='Role',
        metadata=dict(
            namespace='something',
            name='group',
            ),
        rules=[
            {
                'apiGroups': '',
                'resources': [ 'pods' ],
                'verbs': [ 'get', 'watch', 'list' ],
            }
        ],
        )
    
    with open('rbac.yml', 'w') as outfile:
        yaml.dump(yml_file_kubernetes_data, outfile,
                  default_flow_style=False)
    

    如果您想显式使用 [] 数组表示法,则需要使用 ruamel.yml 之类的东西 - 老实说,这确实不值得。这是有效的 YAML

    【讨论】:

      猜你喜欢
      • 2021-09-12
      • 2016-09-03
      • 2021-09-16
      • 2020-08-24
      • 1970-01-01
      • 1970-01-01
      • 2018-09-12
      • 2019-03-14
      • 2021-02-11
      相关资源
      最近更新 更多