我想用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本身,因此我需要一种解决方案来解析它的状态。
答案 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