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

如何获取Ansible Playbook中除ansible_*外的所有变量?

问题解答

1. 是否存在无需过滤的、可替代hostvars的变量组?

Ansible没有内置的变量组可以直接替代hostvars[inventory_hostname]且自动排除ansible_开头的变量。hostvars本身是整合了所有主机相关变量的集合,包括Ansible自动收集的facts(即ansible_开头的变量)、用户自定义变量、inventory变量等,这些变量混合存储,没有单独的内置分组将非ansible_变量单独提取出来。

如果仅需引用特定的用户自定义变量,你可以在inventory、playbook的vars区块或者group_vars/host_vars目录中单独定义并直接引用,但这种方式无法覆盖所有非ansible_开头的变量(比如通过set_fact动态生成的变量)。

2. 过滤hostvars的可行方案

以下是两种实用的内置过滤器方案,无需编写自定义插件:

方案一:使用dict2items+selectattr+items2dict

通过将字典转换为键值对列表,过滤掉键名以ansible_开头的条目,再转回字典:

- name: 展示过滤后的非ansible_开头变量
  debug:
    var: hostvars[inventory_hostname] | dict2items | selectattr('key', 'match', '^(?!ansible_)') | items2dict
  • dict2items:将hostvars字典转换为[{key: "变量名", value: "变量值"}, ...]格式的列表
  • selectattr('key', 'match', '^(?!ansible_)'):用正则表达式的负向预查,筛选出键名不是以ansible_开头的条目
  • items2dict:将过滤后的键值对列表重新转换为字典格式

方案二:使用json_query过滤器

需要确保控制节点安装了jmespath(可通过pip install jmespath安装),利用JMESPath语法过滤键名:

- name: 过滤并展示非ansible_开头的变量键值对
  debug:
    var: hostvars[inventory_hostname] | json_query('{[keys(@)[?starts_with(@, `ansible_`) == `false`]]: @[keys(@)[?starts_with(@, `ansible_`) == `false`]]}')

如果只需要获取变量名列表,可以简化为:

- name: 获取非ansible_开头的变量名列表
  debug:
    var: hostvars[inventory_hostname] | json_query('keys(@)[?starts_with(@, `ansible_`) == `false`]')

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.16 08:15:37