用python解析puppet-api yaml

xeo*_*eor 14 python yaml puppet

我正在创建一个脚本,需要解析puppet输出的yaml输出.

当我再次提出请求示例https:// puppet:8140/production/catalog/my.testserver.no我会得到一些yaml回来看起来像:

--- &id001 !ruby/object:Puppet::Resource::Catalog
  aliases: {}
  applying: false
  classes: 
    - s_baseconfig
    ...
  edges: 
    - &id111 !ruby/object:Puppet::Relationship
      source: &id047 !ruby/object:Puppet::Resource
        catalog: *id001
        exported: 
Run Code Online (Sandbox Code Playgroud)

等等......问题是当我做一个yaml.load(yamlstream)时,我会得到一个错误:

yaml.constructor.ConstructorError: could not determine a constructor for the tag '!ruby/object:Puppet::Resource::Catalog'
 in "<string>", line 1, column 5:
   --- &id001 !ruby/object:Puppet::Reso ... 
       ^
Run Code Online (Sandbox Code Playgroud)

据我所知,这个&id001部分在yaml中得到支持.

有没有办法解决?我可以告诉yaml解析器忽略它们吗?我只需要yaml流中的几行,也许正则表达式是我的朋友在这里?以前做过任何yaml清理正则表达式的人吗?

您可以使用curl获取yaml输出,如:

curl --cert /var/lib/puppet/ssl/certs/$(hostname).pem --key /var/lib/puppet/ssl/private_keys/$(hostname).pem --cacert /var/lib/puppet/ssl/certs/ca.pem -H 'Accept: yaml' https://puppet:8140/production/catalog/$(hostname)
Run Code Online (Sandbox Code Playgroud)

我还在puppet mailinglist @ http://www.mail-archive.com/puppet-users@googlegroups.com/msg24143.html中找到了一些相关信息.但我不能让它正常工作......

Sha*_*lan 23

我已经通过电子邮件发送了PyYAML的创建者Kirill Simonov,以获得解析Puppet YAML文件的帮助.

他很乐意帮助完成以下代码.此代码用于解析Puppet日志,但我确信您可以修改它以解析其他Puppet YAML文件.

我们的想法是为Ruby对象创建正确的加载器,然后PyYAML可以读取数据.

开始:

#!/usr/bin/env python

import yaml

def construct_ruby_object(loader, suffix, node):
    return loader.construct_yaml_map(node)

def construct_ruby_sym(loader, node):
    return loader.construct_yaml_str(node)

yaml.add_multi_constructor(u"!ruby/object:", construct_ruby_object)
yaml.add_constructor(u"!ruby/sym", construct_ruby_sym)


stream = file('201203130939.yaml','r')
mydata = yaml.load(stream)
print mydata
Run Code Online (Sandbox Code Playgroud)