Разбор, вероятно, неверного YAML с PyYaml - PullRequest
0 голосов
/ 08 февраля 2019

Я хотел бы проанализировать связанный с куклой конфиг yaml с pyyaml.К сожалению, кажется, что pyyaml ​​не может проанализировать некоторые файлы YAML из-за этой части:

base::files:

  /var/log/fpm:
    ensure: 'directory'
    mode: '777'

  /etc/nginx/ssl/cert:
   ensure: 'directory'

  /apps:
   ensure: 'directory'
   owner: user
   group: user

  ['/apps/ecert-public', '/apps/ecert-public/config', '/apps/ecert-public/releases']:
    ensure: 'directory'
    owner: 'user'
    group: 'user'

  ['/apps/site-public', '/apps/site-public/config', '/apps/site-public/releases']:
    ensure: 'directory'
    owner: 'user'
    group: 'user'

Проблема заключается в отображениях с несколькими значениями (в квадратных скобках).Я получаю следующее сообщение об ошибке при попытке проанализировать эту часть с pyyaml:

при построении сопоставления в "/hieradata/node/wc-de.yaml", строка 133, столбец 3 найден не подлежащий обработке ключв «/hieradata/node/wc-de.yaml», строка 212, столбец 3

Некоторые валидаторы YAML говорят, что это действительный YAML (например: http://www.yamllint.com/), но большинство из них яу меня также есть проблемы с анализом этой части. Кто-нибудь знает, как я могу решить эту проблему с pyyaml? К сожалению, я не могу изменить сам YAML, поэтому мне нужно решение, чтобы разобрать, как оно есть.

1 Ответ

0 голосов
/ 08 февраля 2019

Это совершенно действительный YAML.Проблема в PyYAML.Как и все другие YAML-процессоры, которые не могут загрузить это, о чем я знаю, он может анализировать этот YAML без проблем (и составлять , если процессор реализует этот шаг), но завершиться с ошибкой во время создание шага процесса загрузки.

Если вы используете ruamel.yaml (отказ от ответственности: я являюсь автором этого пакета) и у вас есть входные данные в файле input.yaml:

import sys
from pathlib import Path
import ruamel.yaml

file_name = Path('input.yaml')

yaml = ruamel.yaml.YAML()
data = yaml.load(file_name)
print(data['base::files'][('/apps/ecert-public', '/apps/ecert-public/config', '/apps/ecert-public/releases')]['ensure'])
print('\n-o-o-o-o-o-o-o-o-o-o-o-o-o-o-o-o-o-o-\n')
yaml.dump(data, sys.stdout)

дает:

directory

-o-o-o-o-o-o-o-o-o-o-o-o-o-o-o-o-o-o-

base::files:

  /var/log/fpm:
    ensure: directory
    mode: '777'

  /etc/nginx/ssl/cert:
    ensure: directory

  /apps:
    ensure: directory
    owner: user
    group: user


  [/apps/ecert-public, /apps/ecert-public/config, /apps/ecert-public/releases]:
    ensure: directory
    owner: user
    group: user

  [/apps/site-public, /apps/site-public/config, /apps/site-public/releases]:
    ensure: directory
    owner: user
    group: user
...