Если вы работаете с 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”