词典列表中的Ansible选择字典

时间:2020-06-10 22:14:00

标签: 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-Einstein的字典。

我尝试使用此功能:

- debug:
    msg: "{{ mule_runtimes | selectattr('id', 'equalto', 'N-Einstein') | to_json }}"

并得到错误:({{mule_runtimes | selectattr('id','equalto','N-Einstein')| to_json}})发生意外的模板类型错误:类型为'generator'的对象不是JSON可序列化的。 从列表中选择字典的正确方法是什么?

2 个答案:

答案 0 :(得分:1)

第一个问题是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 }}

答案 1 :(得分:0)

我建议使用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"                                                             
    ]                                                                           
}