You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何在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"

说明

  1. 路径修正:useroutput的结构是msg.results,所以需要用useroutput.msg.results作为json_query的输入对象
  2. JMESPath查询逻辑:
    • [?changed == true]:筛选出changed属性为true的条目
    • .name:提取这些条目中的name字段,直接生成用户名列表

执行上述修正后,created_list_user即可得到预期的仅包含新增用户名的列表。

内容的提问来源于stack exchange,提问作者Balkrushna Kamble

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.07.31 12:05:33