如何查询Ansible变量对应的gather_subset分组?
如何查询Ansible变量所属的gather_subset分组
要确定某个Ansible变量(比如ansible_hostname)属于哪个gather_subset分组,以及找到包含它的最小子集,你可以用以下几种方法:
1. 查看setup模块的源码定义
Ansible内置的setup模块源码里,明确划分了各个gather_subset对应的变量集合。以ansible_hostname为例:
- 它直接归属
system子集,该子集负责收集主机名、内核版本、操作系统类型等基础系统信息。 min子集是默认的最小核心集合,包含system、user等基础子集,因此ansible_hostname也会被min子集间接包含。all子集包含所有可用的子集,自然也涵盖system。
2. 通过ansible-doc查看子集说明
执行命令ansible-doc ansible.builtin.setup,在gather_subset参数的详细说明里,会列出每个子集涵盖的内容范围。比如其中会明确提到system子集包含主机标识类信息,min子集包含最基础的系统、用户等核心事实。
3. 测试验证最小子集
你可以通过逐步调整gather_subset的范围,验证哪个是包含目标变量的最小子集:
- name: 验证system子集包含ansible_hostname hosts: all gather_facts: true gather_subset: ["system", "!all", "!min"] tasks: - name: 输出ansible_hostname ansible.builtin.debug: var: ansible_hostname - name: 验证无system子集时无法获取ansible_hostname hosts: all gather_facts: true gather_subset: ["!system", "min"] tasks: - name: 尝试输出ansible_hostname(会提示未定义) ansible.builtin.debug: var: ansible_hostname ignore_errors: true
第一个playbook会正常输出ansible_hostname,第二个则会提示变量未定义,这就确认了system是包含该变量的最小子集。
另外需要注意:如果你想全局配置只收集必要的子集,直接在play或ansible.cfg里设置gather_subset: system即可,无需单独执行setup任务。
内容的提问来源于stack exchange,提问作者Stefan
相关产品推荐
相关产品推荐

