如何在Ansible中基于changed条件从字典列表生成新列表?
问题:在Ansible中筛选
changed为true的用户条目生成用户名列表 需求
从useroutput的结果列表中,筛选出changed属性为true的条目,生成仅包含用户名的新列表created_list_user。
现有Playbook代码
- name: Ensure Provided id is exist user: name: "{{ item }}" state: present loop: "{{ user_name_list }}" register: useroutput - debug: msg: "{{ useroutput }}" - name: set fact for make list for id created user set_fact: created_list_user: "{{ useroutput | json_query(jmesquery) }}" vars: jmesquery: "results[*].{user_name: name }" when: results[*].changed|lower == true
debug输出的useroutput数据
{ "msg": { "changed": true, "msg": "All items completed", "results": [ { "changed": false, "item": "uxapal1004", "name": "uxapal1004" }, { "changed": true, "item": "uxapal1005", "name": "uxapal1005" }, { "changed": true, "item": "uxapal1006", "name": "uxapal1006" } ] } }
预期输出
created_list_user: [ uxapal1005, uxapal1006 ]
修正方案
原set_fact任务的when条件写法错误,且未在json_query中添加过滤逻辑。正确的做法是直接在JMESPath查询语句中完成筛选和字段提取:
修正后的set_fact任务
- name: set fact for make list for id created user set_fact: created_list_user: "{{ useroutput.msg.results | json_query(jmesquery) }}" vars: jmesquery: "[?changed == `true`].name"
说明
- 路径修正:
useroutput的结构是msg.results,所以需要用useroutput.msg.results作为json_query的输入对象 - JMESPath查询逻辑:
[?changed ==true]:筛选出changed属性为true的条目.name:提取这些条目中的name字段,直接生成用户名列表
执行上述修正后,created_list_user即可得到预期的仅包含新增用户名的列表。
内容的提问来源于stack exchange,提问作者Balkrushna Kamble
相关产品推荐
相关产品推荐

