如何获取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
相关产品推荐
相关产品推荐

