Рубрики
Без рубрики

Пример yaml генератора и валидатора в Python

Если вы работаете с YAML регулярно или нет, то, что большинство людей знают об этом … Помечено Python, Kubernetes, SystemAdministration.

Если вы работаете с YAML регулярно или нет, то, что большинство людей знают о том, что это Определенно Уход за пробелом, и даже осторожные практикующие все еще могут по-прежнему автоматизировать плохие процессы, а с YAML, это плохое время, так что подтверждают (особенно при генерировании YAML, не говоря уже о том, что он пишут его), является обязательным. Давайте возьмем общее использование YAML: Kubernetes проявляется. В моем случае я хотел создать различные конфигурации, заполнить информацию о лету (например, такие вещи, как токены известной длины), а затем сбрасывают в файл YAML, используемый ELCEHVER. Я сделал это с Python, используя Pyyaml. . Чтобы использовать шифрование AT-REST в вашем кластере для таких ресурсов, как Secrets, Kubernetes требует файла EncryptonConfig, который является довольно коротким произведением YAML для генерации, ему просто нужен провайдер, ключ, и какой ресурс должен шифровать в etcd, который генерировать как Ямл, я просто собираюсь представлять это как JSON:

configIn = {
        "kind": "EncryptionConfig",
        "apiVersion": "v1",
        "resources": [
            {
            "resources": [
                "secrets"
            ],
            "providers": [
                {
                "aescbc": {
                    "keys": [
                    {
                        "name": "key1",
                        "secret": "%s" % (generateSecret(32))
                    }
                    ]
                }
                }
            ]
            }
        ]
        }

И тогда мы собираемся использовать это генерируетecret. (A лямбда Это предпринимает длину строки и возвращает версию случайной строки на основе BASE64 случайной строки этой длины), чтобы заполнить значение этого объекта JSON:

import base64
import random
import string
import os
import sys
import yaml
generateSecret = lambda length: base64.b64encode(''.join(random.sample(string.lowercase+string.digits,length))) #32 length
def populateConfig():
    configIn = {
        "kind": "EncryptionConfig",
        "apiVersion": "v1",
        "resources": [
            {
            "resources": [
                "secrets"
            ],
            "providers": [
                {
                "aescbc": {
                    "keys": [
                    {
                        "name": "key1",
                        "secret": "%s" % (generateSecret(32))
                    }
                    ]
                }
                }
            ]
            }
        ]
        }

    configOut = yaml.dump(configIn)
    return configOut

а потом есть yaml.dump Верните этот объект к нам как ЯМЛ:

apiVersion: v1
kind: EncryptionConfig
resources:
- providers:
  - aescbc:
      keys:
      - {name: key1, secret: BASE64_STRING }
  resources: [secrets]

Что является действительным YAML, но чтобы идиоматировать с стилем Kubernetes (и потому, что экспериментальная функция, поддерживаемая этим, не примет это как 1,11), мы изменим Конфигурирование Вариант сброса линии, чтобы выглядеть так:

 configOut = yaml.dump(configIn,default_flow_style=False)

возвращать:

apiVersion: v1
kind: EncryptionConfig
resources:
- providers:
  - aescbc:
      keys:
      - name: key1
        secret: BASE64_STRING
  resources:
  - secrets

Хорошо, отлично, у нас есть наш конфиг, и это выглядит Разумно правильно, но так как он автоматически создан, мы, вероятно, хотим двойной чек. Есть несколько способов сделать это, но потому что мой вклад был относительно простым, и схема не была изменена каким-либо значимым образом, просто заполнять данные, и потому что я бы предпочел связать с этим с библиотеками, которые уже импортировали, мы можно использовать Ямл Встроенный пакет Safe_load Способ посмотреть, если входящий конфиг (например, тот, который возвращается вышеупомянутой функцией), проверяет:

def validateYaml(config):
    try:
        yaml.safe_load(config)
        return config
    except:
        sys.exit('Failed to validate config.')

Эта функция закиснет, если конфигурация не может подтвердить (что становится важным в данный момент), но возвращает действительный конфиг, если он это делает, поэтому с этой информацией мы можем продвинуться к въездной точке нашей программы, чтобы прошить все это вместе, где мы напишем Конфигурация в файл, если это действительно:

if __name__ == '__main__':  
    config = validateYaml(populateConfig())
    EncryptionConfig = open("secrets.conf","w")
    EncryptionConfig.write(config)
    EncryptionConfig.close()
    print "OK"

Если Validateyaml Не удается, это помешает нам написать плохое конфигурацию (или хотя бы определенное не работать, другие проблемы проверки могут представить себя, что Safe_Load может не обнаружить по умолчанию в более усложненном входе YAML).

Оригинал: “https://dev.to/jmarhee/example-of-yaml-generator-and-validator-in-python-1opk”