Ansible返回AnsibleUnicode而非JSON,无法用json_query过滤
解决Ansible中json_query无法过滤AnsibleUnicode类型数据的问题
问题根源
你的RPN.stdout是AnsibleUnicode类型的半结构化字符串,并非完整合法的JSON对象(仅包含members字段的键值对,缺少外层大括号),而json_query仅能作用于已解析的JSON字典/列表,直接使用会返回null。
解决步骤
- 补全合法JSON结构:将原字符串拼接为完整的JSON格式(添加外层
{}) - 解析为JSON对象:用
from_json过滤器将字符串转换为Ansible可处理的字典类型 - 执行json_query过滤:针对解析后的对象提取
ip字段
修改后的完整Playbook示例
- hosts: localhost gather_facts: false vars: - RPN: stdout: >- "members": [ { "id": 0, "ip": "x.x.x.x", "owner": "buzut", "private_ip": "10.91.154.39", "speed": 100, "status": "active" } ] tasks: - name: 解析字符串为JSON并提取IP debug: msg: "{{ ('{' ~ RPN.stdout ~ '}') | from_json | json_query('members[*].ip') }}"
替代方案(直接用Ansible原生索引)
如果不想依赖json_query,也可以直接通过字典索引提取目标值:
- name: 直接提取单个IP debug: msg: "{{ (( '{' ~ RPN.stdout ~ '}' ) | from_json).members[0].ip }}"
内容的提问来源于stack exchange,提问作者alexander moro
相关产品推荐
相关产品推荐

