Ansible 从字典列表中选择字典



变量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"                                                             
]                                                                           
} 

最新更新