如何在Ansible Playbook中按键值筛选字典列表中的字典
解决Ansible中从字符串形式字典列表提取指定ID的问题
问题原因
你遇到的'str object has no attribute 'name''错误,核心是foreman_environments.stdout是字符串类型的字典列表,直接用selectattr筛选时,过滤器会把字符串当成单个对象处理,自然找不到name属性。必须先把字符串转换成可操作的JSON对象(列表/字典)。
解决方案
通过from_json过滤器将字符串解析为JSON对象,再结合筛选器提取目标ID,具体Playbook示例如下:
方法1:使用selectattr+map组合筛选
- name: 转换环境输出为JSON并提取QA3环境的ID set_fact: target_env_id: "{{ foreman_environments.stdout | from_json | selectattr('name', 'equalto', 'QA3') | map(attribute='id') | first }}" register: env_id_result - name: 验证提取的ID(可选) debug: var: env_id_result.target_env_id
方法2:使用json_query(基于JMESPath,适合复杂查询)
- name: 用JMESPath查询提取QA3环境的ID set_fact: target_env_id: "{{ foreman_environments.stdout | from_json | json_query('[?name==`QA3`].id | [0]') }}" register: env_id_result
关键说明
from_json的作用:将字符串格式的JSON数据转换为Ansible可识别的列表/字典对象,这是后续筛选的前提。first/[0]的作用:取第一个匹配name: QA3的项的ID,如果存在多个同名环境,需根据业务逻辑调整(比如用list收集所有匹配项)。- 格式校验:如果转换或筛选报错,先确认
stdout是合法JSON格式,可通过以下任务排查:
- name: 查看转换后的环境数据结构 debug: var: foreman_environments.stdout | from_json
内容的提问来源于stack exchange,提问作者Todd Pettit
相关产品推荐
相关产品推荐

