Arhn - архитектура программирования

Создание YAML для Kubernetes с помощью Python3

Я пытаюсь создать свой файл 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"

  • Вы уверены, что в вашем выводе нет пробелов после индикатора элемента последовательности (-) (последние три строки вашего сообщения) 07.04.2019

Ответы:


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)).

07.04.2019

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

07.04.2019
Новые материалы

Коллекции публикаций по глубокому обучению
Последние пару месяцев я создавал коллекции последних академических публикаций по различным подполям глубокого обучения в моем блоге https://amundtveit.com - эта публикация дает обзор 25..

Представляем: Pepita
Фреймворк JavaScript с открытым исходным кодом Я знаю, что недостатка в фреймворках JavaScript нет. Но я просто не мог остановиться. Я хотел написать что-то сам, со своими собственными..

Советы по коду Laravel #2
1-) Найти // You can specify the columns you need // in when you use the find method on a model User::find(‘id’, [‘email’,’name’]); // You can increment or decrement // a field in..

Работа с временными рядами спутниковых изображений, часть 3 (аналитика данных)
Анализ временных рядов спутниковых изображений для данных наблюдений за большой Землей (arXiv) Автор: Рольф Симоэс , Жильберто Камара , Жильберто Кейрос , Фелипе Соуза , Педро Р. Андраде ,..

3 способа решить квадратное уравнение (3-й мой любимый) -
1. Методом факторизации — 2. Используя квадратичную формулу — 3. Заполнив квадрат — Давайте поймем это, решив это простое уравнение: Мы пытаемся сделать LHS,..

Создание VR-миров с A-Frame
Виртуальная реальность (и дополненная реальность) стали главными модными терминами в образовательных технологиях. С недорогими VR-гарнитурами, такими как Google Cardboard , и использованием..

Демистификация рекурсии
КОДЕКС Демистификация рекурсии Упрощенная концепция ошеломляющей О чем весь этот шум? Рекурсия, кажется, единственная тема, от которой у каждого начинающего студента-информатика..