Ansible中无法通过索引访问JSON查询返回的列表值问题
解决Ansible中json_query结果列表索引报错问题
问题场景
已开启gather_facts: True,通过{{ ansible_facts['mounts']|json_query('[?mount==/home].size_available') }}获取到/home分区的可用空间,返回结果为列表格式(如[34545646])。尝试用[0]索引取第一个值时,触发模板错误:
"msg": "template error while templating string: expected token 'end of print statement', got '['. String: > {{ansible_facts['mounts']|json_query('[?mount==
/home].size_available')[0]}}"
报错原因
Ansible使用的Jinja2模板引擎会将|视为过滤器分隔符,原写法中|后的[0]会被误判为非法过滤器,导致解析失败,即便实际结果是可索引的列表。
解决方案
方案1:在json_query中直接返回单个值
修改json_query表达式,直接定位到第一个匹配项的size_available字段,返回单个数值而非列表:
{{ ansible_facts['mounts'] | json_query('[?mount==`/home`][0].size_available') }}
方案2:用括号包裹管道表达式
通过括号将整个管道运算结果包裹,让模板引擎先计算出列表,再执行索引操作:
{{ (ansible_facts['mounts'] | json_query('[?mount==`/home`].size_available'))[0] }}
方案3:先通过set_fact存储结果
将json_query的结果存入变量,后续引用变量时再取索引:
- name: 存储/home分区可用空间列表 set_fact: home_available_list: "{{ ansible_facts['mounts'] | json_query('[?mount==`/home`].size_available') }}" - name: 检查/home空间是否充足 debug: msg: "/home可用空间不足" when: home_available_list[0] < 500000000 # 替换为你的静态阈值
验证说明
以上三种方案均可正常获取单个数值,支持后续与静态值进行比较,从而控制Playbook的执行逻辑。
内容的提问来源于stack exchange,提问作者Cat Hariss
相关产品推荐
相关产品推荐

