使用Python3为Kubernetes创建YAML

问题描述 投票:1回答:2

我正在尝试为Kubernetes创建我的Role 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"]

但我得到[]分开,没有 - 为api集团。这是我的结果:

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
2个回答
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)

请注意,除了块/流样式外,还会保留原始和注释中的单/双引号。您的缩进已经与默认值匹配,因此不是明确设置(#!/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) )。


0
投票

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

qazxswpoi

如果你想明确使用[]数组表示法,你需要使用类似ruamel.yml的东西 - 老实说,它真的不值得。这是有效的YAML

© www.soinside.com 2019 - 2024. All rights reserved.