Ansible:如何将特定列表转换为字典列表以支持selectattr过滤
把Ansible中的INI风格列表转成字典列表
你的原始数据是msg里的一个列表,元素要么是[[machine]]标记,要么是带缩进的键值对行。要转成目标字典列表,可以分两步用Ansible过滤器处理:
第一步:拆分出每个machine的片段
先把列表合并成完整字符串,再按[[machine]]分割,同时过滤掉空片段:
- set_fact: machine_chunks: "{{ msg | join('\n') | split('[[machine]]') | reject('equalto', '') | list }}"
第二步:把每个片段转成字典
循环每个片段,处理每行的键值对,最终拼成字典列表:
- set_fact: machine_list: "{{ machine_list | default([]) + [ item | split('\n') | reject('match', '^\\s*$') # 过滤空行 | map('trim') # 去掉每行前后的缩进和空格 | map('split', ' = ', 1) # 按第一个" = "分割键与值 | items2dict # 将键值对列表转为字典 ] }}" loop: "{{ machine_chunks }}"
你之前尝试出问题的原因
你直接把stdout_lines转成字符串再分割,破坏了换行结构导致内容混乱;而且用逗号分割完全不符合原始数据的格式——原始数据是用=分隔键值的,不是逗号。按上面的步骤处理后,就能得到你需要的[{"name": "foo", "year": "bar"}, ...]结构,之后可以正常用selectattr()遍历。
内容的提问来源于stack exchange,提问作者Demmy
相关产品推荐
相关产品推荐

