在ansible中将文件行转换为字典

在ansible中将文件行转换为字典,ansible,jinja2,Ansible,Jinja2,有一个包含以下格式的行的文件: category1 name=item1 category1 attributes=attr1, attr2 category1 name=item2 category1 attributes=attr1, attr2, attr3 category2 name=item1 category2 attributes=attr1 正在查找ansible中的词典,如下所示: category1 name=item1 category1 attributes=attr

有一个包含以下格式的行的文件:

category1 name=item1
category1 attributes=attr1, attr2
category1 name=item2
category1 attributes=attr1, attr2, attr3
category2 name=item1
category2 attributes=attr1
正在查找ansible中的词典,如下所示:

category1 name=item1
category1 attributes=attr1, attr2
category1 name=item2
category1 attributes=attr1, attr2, attr3
category2 name=item1
category2 attributes=attr1
-类别1:
-名称:项目1
属性:[attr1,attr2]
-名称:项目2
属性:[attr1、attr2、attr3]
-类别2:
-名称:项目1
属性:[1]
我试着使用jinja2,现在我得到的是以下内容。问题是代码在每一步之后都变得复杂。是否有任何方法可以使用过滤器或其他方法,以更可读的代码生成预期的结果

代码:

-设置事实:
转换的数据:>-
{%-set res=dict()-%}
{%-用于content.stdout_行中的行-%}
{%-set key_val=line.split(“”,1)-%}
{%-set second_level=[]-%}
{%-如果定义了res[key_val[0]-%}
{%-set second_level=res[key_val[0]]-%}
{%-endif-%}
{%-set val\u split=key\u val[1]。split('=')-%}
{%-set}=second_level.append(dict({val_split[0]:(val_split[1]。split(',')| map('trim')| list)}))-%}
{%-set}=res.update({key\u val[0]:第二级})-%}
{%-endfor-%}
{{res}}
产生:

category1:
- name:
  - item1
- attributes:
  - attr1
  - attr2
- name:
  - item2
- attributes:
  - attr1
  - attr2
  - attr3
category2:
- name:
  - item1
- attributes:
  - attr1

我强烈建议您停止使用Jinja编写此代码,转而使用Python。它可以是一个查找插件、一个模块,或者只是一个从stdin读取并输出json的非常简单的脚本

Jinja不是为算法而设计的。虽然您可以使用图灵完整Jinja2模板语言实现任何有效的可计算函数,但这对您和阅读您的代码的任何其他人来说都是非常痛苦的


如果在Python中执行此操作,则可以添加一些测试(只需在脚本中定义几个“test_case1”、“test_case2”函数并使用pytest运行它们)。如果没有测试,您将永远无法获得所有情况下的稳定代码(例如,如果某行丢失,或存在重新排序,或重复等)。

小问题:在
categroy2
中,属性是数组,尽管它是唯一的元素,名称是字符串,但其背后的逻辑是什么?您的实际输出也不能反映这一点。类别
属性
可能包含一个或多个项。没有特殊要求,但使用相同的类型使其更易于处理。感谢您的回复。所以使用现有的过滤器或模块做不了什么?你可以做任何你想做的事情,但是编写和测试都很困难。你的金甲越有逻辑,它就越脆弱。