解析与PyYaml可能无效YAML

问题描述 投票:1回答:1

我想用解析一个pyyaml木偶相关YAML配置。 Unforunately似乎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栏unhashable键

一些YAML验证说,这是有效的YAML(如:http://www.yamllint.com/),但大部分我已经试过也有问题,解析这一部分。有没有人一个想法,我怎么能解决pyyaml这个问题?不幸的是我无法改变的YAML本身,所以我需要一个解决方案来分析它是怎么回事。

python yaml puppet pyyaml hiera
1个回答
4
投票

这是完全有效的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
© www.soinside.com 2019 - 2024. All rights reserved.