使用PyYaml解析可能无效的YAML

时间:2019-02-08 09:41:49

标签: python yaml puppet pyyaml hiera

我想用pyyaml解析与up相关的yaml配置。不幸的是,由于这一部分,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 :(得分:4)

这是完全有效的YAML。问题是PyYAML。就像所有其他无法加载此代码的YAML处理器一样,据我所知,它可以解析而不会出现问题(如果处理器执行该步骤,则可以 compose ),但是失败在加载过程的构造步骤中。

如果您要使用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