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

Ansible中使用json_query查询含连字符主机名的问题求助

Ansible json_query筛选带连字符主机的解决方案

问题核心

你的问题出在变量插值时的字符串引号处理错误:

  • 手动给host变量添加多余引号/转义,导致生成的JMESPath表达式在匹配带额外引号的字符串,返回空结果;
  • 去掉引号后,JMESPath会把带连字符的主机名当成非法标识符,触发语法错误。

正确解决方案

方案1:精确匹配(推荐用反引号包裹变量)

利用JMESPath的反引号语法包裹字符串,避免转义问题,变量本身无需加引号:

- name: Query with hyphen
  debug:
    msg: "{{ results.json.list | json_query(querystr) }}"
  vars:
    querystr: '[?hostname==`{{ host }}`].{hostname: hostname, status: status}'
    host: 'server-bbbv-14'

也可以用JMESPath的双引号写法(注意Ansible中要转义双引号,或用单引号包裹整个querystr):

- name: Query with hyphen
  debug:
    msg: "{{ results.json.list | json_query(querystr) }}"
  vars:
    querystr: '[?hostname=="{{ host }}"].{hostname: hostname, status: status}'
    host: 'server-bbbv-14'

方案2:模糊匹配(用contains函数)

如果需要匹配包含特定字符串的主机名,直接用JMESPath的contains函数,连字符无需特殊处理:

- name: Query hosts containing specific string
  debug:
    msg: "{{ results.json.list | json_query('[?contains(hostname, `server-bbbv-14`)].{hostname: hostname, status: status}') }}"

替换为inventory_hostname的实际场景

直接引用内置变量即可,无需额外处理引号:

- name: Query using inventory_hostname
  debug:
    msg: "{{ results.json.list | json_query(querystr) }}"
  vars:
    querystr: '[?hostname==`{{ inventory_hostname }}`].{hostname: hostname, status: status}'

原理说明

JMESPath中字符串字面量支持两种包裹方式:

  • 反引号:无需处理内部特殊字符(如连字符、空格),适合直接引用变量;
  • 双引号:需要注意转义,但兼容性更好。
    Ansible变量插值时会直接替换变量值,因此变量本身不需要额外添加引号,由JMESPath语法负责字符串的包裹即可。

内容的提问来源于stack exchange,提问作者Peter Jackson

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.12 12:35:36