使用 PyYaml 解析可能无效的 YAML

Tho*_* S. 2 python yaml puppet pyyaml hiera

我想用 pyyaml 解析与 puppet 相关的 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'
Run Code Online (Sandbox Code Playgroud)

问题是具有多个值的映射(在方括号内)。尝试使用 pyyaml 解析此部分时收到以下错误消息:

在“/hieradata/node/wc-de.yaml”第 133 行第 3 列中构建映射时,在“/hieradata/node/wc-de.yaml”第 212 行第 3 列中发现不可哈希键

一些 YAML 验证器说这是有效的 YAML(例如:http : //www.yamllint.com/),但我尝试过的大多数验证器在解析这部分时也有问题。有谁知道我如何用 pyyaml 解决这个问题?不幸的是我不能改变 YAML 本身,所以我需要一个解决方案来解析它是如何的。

Ant*_*hon 5

这是完全有效的 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)
Run Code Online (Sandbox Code Playgroud)

给出:

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
Run Code Online (Sandbox Code Playgroud)