Создание YAML для Kubernetes с Python3 - PullRequest
1 голос
/ 07 апреля 2019

Я пытаюсь создать свой ролевый YAML-файл для Kubernetes, и я застреваю в этом конкретном разделе необходимого YAML:

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

Я попытался добавить его в качестве словаря, а затем список со словарем внутри словаря для строки -apiGroups, но это затем вызывает проблемы с остальными аргументами для правил. У меня также возникают проблемы с тем, что [] появляется так же, когда я использую yaml.dump, хотя я указываю default_flow_style=False

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, и он будет выглядеть точно так же, как ссылка YAML в Kubernetes:

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"

Ответы [ 2 ]

1 голос
/ 07 апреля 2019

То, что вы пытаетесь сделать, невозможно с обычными параметрами, которые вы можете передать PyYAML dump(), который дает вам только очень контроль курса, используя default_flow_style

  • True: все в стиле потока (как в JSON)
  • False: все в стиле блока
  • None: коллекции листьев имеют стиль потока, а стиль остальных блоков

Вы ссылаетесь, что YAML имеет обе коллекции листов в стиле блока: значение для ключа metadata, а также коллекций листов в стиле потока: значение для ключа verbs. Без взлома представителя вы не сможете добиться этого в PyYAML.

Более простой способ создания YAML в вашей конкретной форме - это чтение-изменение-запись ожидаемого YAML с парсером, который знает, как сохранить форматирование. Вы можете сделать это с ruamel.yaml, который специально разработанный для сохранения таких вещей (отказ от ответственности: I я являюсь автором этого пакета).

Если ваш входной файл 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']

Обратите внимание, что помимо стиля блока / потока также есть одинарные / двойные кавычки от оригинала и комментарий сохранились. Ваш отступ уже совпадает со значением по умолчанию, так что не установлен Explicity (yaml.indent(mapping=2, sequence=2, offset=0)).

0 голосов
/ 07 апреля 2019

Правила на самом деле представляют собой массив карт, поэтому вы можете изменить его так, чтобы он выглядел следующим образом:

#!/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

...