如何在Ansible中对已注册变量使用json_query提取audit_action_name
如何用Ansible的json_query提取数组中所有对象的audit_action_name字段?
问题描述
我在编写Ansible角色时,通过ansible.windows.win_powershell模块获取SQL Server的审计设置详情,注册变量list_of_audit_actions后,其output字段是一个包含多个对象的数组。尝试使用json_query提取所有audit_action_name的值,但当前写法返回空结果。
测试任务:
- name: Sample Test debug: msg: "{{list_of_audit_actions.output}}"
list_of_audit_actions.output的核心结构:
[ {"audit_action_name": "AUDIT_CHANGE_GROUP", ...}, {"audit_action_name": "AUDIT_CHANGE_GROUP", ...}, {"audit_action_name": "FAILED_LOGIN_GROUP", ...} ]
错误写法:
- name: Sample Test debug: msg: "{{list_of_audit_actions.output| community.general.json_query('audit_action_name')}}"
问题原因
list_of_audit_actions.output是数组(列表)类型,而非单个对象。直接使用audit_action_name会尝试从数组本身提取该字段,但数组不存在这个属性,因此返回空结果。需要遍历数组内的每个元素,逐一提取每个对象的audit_action_name字段。
正确写法
使用JSONPath的数组遍历语法[*].audit_action_name,表示遍历数组中所有元素,提取每个元素的audit_action_name字段:
- name: Extract all audit_action_name values debug: msg: "{{ list_of_audit_actions.output | community.general.json_query('[*].audit_action_name') }}"
预期结果
执行后会得到包含所有目标字段值的列表:
ok: [target_host] => { "msg": [ "AUDIT_CHANGE_GROUP", "AUDIT_CHANGE_GROUP", "FAILED_LOGIN_GROUP" ] }
如果需要对结果去重,可以叠加unique过滤器:
- name: Extract unique audit_action_name values debug: msg: "{{ (list_of_audit_actions.output | community.general.json_query('[*].audit_action_name')) | unique }}"
去重后的结果:
ok: [target_host] => { "msg": [ "AUDIT_CHANGE_GROUP", "FAILED_LOGIN_GROUP" ] }
内容的提问来源于stack exchange,提问作者user12007109
相关产品推荐
相关产品推荐

