python-3.x - 使用 Python3 为 Kubernetes 创建 YAML

标签 python-3.x kubernetes yaml pyyaml

我正在尝试为 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"

最佳答案

使用可以传递给 PyYAML 的 dump() 的普通参数,您尝试做的事情是不可能的, 使用 default_flow_style

只能为您提供非常精确的路线控制
  • True:一切都是流程风格(类似 JSON)
  • False:一切都是 block 样式
  • :叶子集合为流式,其余为 block 式

您引用的 YAML 具有两个 block 样式叶集合:值 对于关键的元数据以及流式叶子集合: 键动词的值。如果不破解代表,你就无法 在 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']

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

关于python-3.x - 使用 Python3 为 Kubernetes 创建 YAML,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/55562664/

相关文章:

kubernetes - 我应该为kubernetes入口 list 中的主机使用什么值?

.net - 从 AKS 访问 Azure Blob 存储

kubernetes - 如何正确使用Kubernetes进行作业调度?

python - 在python中将列表写入txt文件

python - 如何将函数中的多个变量移至全局范围?

amazon-web-services - 使用 cloudformation yaml 在路由表子网关联中关联多个子网

Python:我可以在 Ansible 的帮助下在 yaml 配置文件中使用变量和简单表达式吗?

templates - Github pull request 模板使用 config.yml 检测 YAML front matter 并应用于字段

python - 在每个子图之间以适当的间距绘制子图

python-3.x - 根据存储在向量中的列名称对 pandas 数据框进行子集化