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
相关产品推荐
相关产品推荐

