用Python解析木偶清单
我的puppet模块有一个puppet清单文件-init.pp 该文件中有类的参数,在大多数情况下,它们的编写方式相同: 输入示例:用Python解析木偶清单,python,string,file,puppet,Python,String,File,Puppet,我的puppet模块有一个puppet清单文件-init.pp 该文件中有类的参数,在大多数情况下,它们的编写方式相同: 输入示例: class test_module( $first_param = 'test', $second_param = 'new' ) param_dict = {'first_param':'test', 'second_param':'new'} 我可以用Python解析这个文件并获得这样一个dict对象(包括所有类参数)的最佳方法是什么 示例
class test_module(
$first_param = 'test',
$second_param = 'new' )
param_dict = {'first_param':'test', 'second_param':'new'}
我可以用Python解析这个文件并获得这样一个dict对象(包括所有类参数)的最佳方法是什么
示例输出:
class test_module(
$first_param = 'test',
$second_param = 'new' )
param_dict = {'first_param':'test', 'second_param':'new'}
提前感谢:)我不知道“最好”的方法是什么,但有一种方法是:
1) 设置RSpecPuppet(请参阅google或了解如何做到这一点)。
2) 编译代码并生成傀儡目录。请看帖子
现在,您编译的Puppet目录是一个JSON文档
3) 目视检查JSON文档以查找您要查找的数据。它在JSON文档中的精确位置取决于您使用的Puppet版本
4) 现在,您可以使用Python从JSON文档中将数据提取为字典。我不知道“最佳”方法,但有一种方法是:
1) 设置RSpecPuppet(请参阅google或了解如何做到这一点)。
2) 编译代码并生成傀儡目录。请看帖子
现在,您编译的Puppet目录是一个JSON文档
3) 目视检查JSON文档以查找您要查找的数据。它在JSON文档中的精确位置取决于您使用的Puppet版本
4) 现在,您可以使用Python从JSON文档中提取数据作为字典。您可以使用正则表达式(简单但脆弱) 您可以按如下方式使用它:
import codecs
with codecs.open(filename,'r') as ff:
dd = parse(ff.read())
您可以使用正则表达式(简单但脆弱) 您可以按如下方式使用它:
import codecs
with codecs.open(filename,'r') as ff:
dd = parse(ff.read())
是一个rubygem,可以安装在Puppet之上,并可以输出包含类参数、文档等列表的JSON文档
安装后(请参见上面的链接),在shell中或从Python程序中运行此命令以生成JSON:
puppet strings generate --emit-json-stdout init.pp
这将产生:
{
"puppet_classes": [
{
"name": "test_module",
"file": "init.pp",
"line": 1,
"docstring": {
"text": "",
"tags": [
{
"tag_name": "param",
"text": "",
"types": [
"Any"
],
"name": "first_param"
},
{
"tag_name": "param",
"text": "",
"types": [
"Any"
],
"name": "second_param"
}
]
},
"defaults": {
"first_param": "'test'",
"second_param": "'new'"
},
"source": "class test_module(\n $first_param = 'test',\n $second_param = 'new' ) {\n}"
}
]
}
(为了简洁起见,JSON略作修剪)
您可以使用JSON加载Python中的JSON。加载
,并从root[“puppet\u classes”][“docstring”][“tags”]
(其中tag\u name
是param
)和root[“puppet\u classes”][“defaults”]中提取参数名和任何默认值
是一个rubygem,可以安装在Puppet之上,并可以输出包含类参数、文档等列表的JSON文档
安装后(请参见上面的链接),在shell中或从Python程序中运行此命令以生成JSON:
puppet strings generate --emit-json-stdout init.pp
这将产生:
{
"puppet_classes": [
{
"name": "test_module",
"file": "init.pp",
"line": 1,
"docstring": {
"text": "",
"tags": [
{
"tag_name": "param",
"text": "",
"types": [
"Any"
],
"name": "first_param"
},
{
"tag_name": "param",
"text": "",
"types": [
"Any"
],
"name": "second_param"
}
]
},
"defaults": {
"first_param": "'test'",
"second_param": "'new'"
},
"source": "class test_module(\n $first_param = 'test',\n $second_param = 'new' ) {\n}"
}
]
}
(为了简洁起见,JSON略作修剪)
您可以使用
JSON加载Python中的JSON。加载
,并从root[“puppet\u classes”][“docstring”][“tags”]
(其中tag\u name
是param
)和root[“puppet\u classes”][“defaults”]中提取参数名和任何默认值
唯一的问题是,regexp还将捕获所有其他变量,并假定赋值运算符之间有一个空格(这在99%的情况下是正确的,但仍然存在)。否则,这就很好了。好吧,这是脆弱的部分:-)别忘了忽略注释(以#
开头的行)实际上我试过了,但没有成功。你能解释一下如何使用re或者你试着做了什么吗?你应该阅读文件的内容并为它提供函数。基本上,我们首先搜索“(‘and’”,然后在其中搜索$var=‘value’。唯一的问题是regexp还将捕获所有其他变量,并假设赋值运算符之间有一个空格(这在99%的情况下是正确的,但仍然如此)。否则,这就很好了。好吧,这是脆弱的部分:-)别忘了忽略注释(以#
开头的行)实际上我试过了,但没有成功。你能解释一下如何使用re或者你试着做了什么吗?你应该阅读文件的内容并为它提供函数。基本上,我们首先搜索“(”和“)”,然后在其中搜索$var='value'