变量mule_runtimes有一个字典列表:
- id: N-Newton
version: 4.3.0
- id: N-Galileo
version: 3.9.0-hf4
- id: N-Einstein
version: 3.8.5-hf4
我想要id = N-爱因斯坦的字典。
我试过使用它:
- debug:
msg: "{{ mule_runtimes | selectattr('id', 'equalto', 'N-Einstein') | to_json }}"
并得到错误:意外的模板类型错误发生在({{ mule_runtimes | selectattr('id', 'equalto', 'N-Einstein'( | to_json }}(:类型为"generator"的对象不可 JSON 序列化。 从列表中选择字典的正确方法是什么?
第一个问题是mule_runtimes | selectattr('id', 'equalto', 'N-Einstein')
返回一个生成器。把它想象成Python中的d for d in mule_runtimes if d['id'] == 'N-Einstein'
。在使用to_json
筛选器之前,需要将其转换为可序列化的 JSON 内容(如列表(。
第二个问题是它不会从列表中选择一个词典。谓词id == 'N-Einstein'
对于多个词典可能为真。如果您知道它只匹配一个词典,则需要将列表转换为单个词典。
综上所述:
{{ mule_runtimes | selectattr('id', 'equalto', 'N-Einstein') | list | last | to_json }}
我建议json_query:
- name: dictionaries
vars:
mule_runtimes:
- id: N-Newton
version: 4.3.0
- id: N-Galileo
version: 3.9.0-hf4
- id: N-Einstein
version: 3.8.5-hf4
json: "{{ mule_runtimes }}"
query: "[?id=='{{ want }}'].version"
want: N-Einstein
debug:
msg: "{{ json | json_query(query) }}"
给出输出:
TASK [test : dictionaries] *****************************************************
ok: [127.0.0.1] => {
"msg": [
"3.8.5-hf4"
]
}