Динамически управлять синтаксическим анализом ключей в файле YAML с помощью Python - PullRequest
0 голосов
/ 21 июня 2020

У меня есть файл YAML, который нужно разобрать на Python; это остов инвентарного файла Ansible, который может меняться ежедневно; Я пишу синтаксический анализатор, который будет создавать этот файл инвентаризации.

Допустим, у меня есть этот файл yaml:

---
all:
  server1: ipaddr1
  server2: ipaddr2
  server3: ipaddr3
dbservers:
  server2
  server3
webgwservers:
  server1

У меня есть следующий фрагмент кода для загрузки YAML:

    environment = yaml.load(bom, Loader=yaml.SafeLoader)

        for x in environment.keys():
        key = environment[x]
        if type(key) is list:
            print(x+ ":")
            if x == 'all':
                for xx in environment['all']:
                    for k,v in xx.items():
                        print(k+":"+v)
            if x == 'infra':

Теперь я хочу иметь возможность перечислить все ключи верхнего уровня ('all', 'dbservers', 'webgwservers') и в соответствии с их типом (списки, dicts, et c) сделать что-то. Дело в том, что у меня могли быть данные для yaml - больше ключей верхнего уровня.

Таким образом, мне нужен способ проанализировать ключи верхнего уровня и получить их имена без жесткого кодирования этих имен ключей.

1 Ответ

0 голосов
/ 21 июня 2020

Исправлено как-то, не очень удовлетворительно:

def createinventory(inputfile, outputfile, ansroot):
    with open(inputfile, 'r') as bom:
        environment = yaml.load(bom, Loader=yaml.SafeLoader)

        with open(ansroot + '/inventory/' + outputfile, 'w') as outfile:
            for keyname in environment.keys():
                if keyname != 'defaults' and keyname != 'dnszone':
                    key = environment[keyname]
                    #parseSubkeys(key, x, outfile)
                    outfile.write('[{}]\n'.format(keyname))
                    for xx in key:
                        for k, v in xx.items():
                            outfile.write('{}\t\tansible_host={}\n'.format(k, v))
                    outfile.write('\n')

    return 0

(это, конечно, не производственный код)

...