在Linux中使用Ansible查看指定Facts,核心是通过setup模块配合filter参数精准提取,支持通配符、点号层级匹配及gather_subset子集收集,并可重定向保存结果。

在 Linux 中使用 Ansible 查看指定 Facts,核心是通过 setup 模块配合 filter 参数精准提取,避免信息冗余。默认执行 ansible 会返回全部事实,但生产环境中通常只需关注几个关键字段,比如 IP、内存、主机名等。
用 filter 参数快速筛选单个或多个 Facts
直接在命令中指定要过滤的 fact 名称(支持通配符和点号层级):
-
查主机名:
ansible web1 -m setup -a "filter=ansible_hostname" -
查总内存(MB):
ansible db01 -m setup -a "filter=ansible_memtotal_mb" -
查 BIOS 版本:
ansible node01 -m setup -a "filter=ansible_bios_version" -
查默认 IPv4 网络信息(含地址、网关、接口):
ansible app01 -m setup -a "filter=ansible_default_ipv4" -
用通配符批量匹配:
ansible all -m setup -a "filter=ansible_all_ipv4_*"(返回所有 IPv4 地址相关 facts)
在 Playbook 中安全引用并校验过滤后的 Facts
Facts 是动态采集的,可能为空或格式异常。建议结合过滤器做容错处理:
- 用
| ansible.netcommon.ipv4断言合法 IPv4:{{ ansible_default_ipv4.address | ansible.netcommon.ipv4 }}(非法时报错,便于提前发现环境问题) - 加
| default(...)提供兜底值:{{ ansible_default_ipv4.address | default('127.0.0.1') }} - 组合写法更健壮:
{{ (ansible_default_ipv4.address | ansible.netcommon.ipv4) | default('127.0.0.1') }}
跳过全量收集,只拉取必要子集提升效率
若仅需网络或硬件类信息,可禁用默认全量收集,改用 gather_subset 指定范围:
- 只收集网络 facts:
ansible app01 -m setup -a "gather_subset=network" - 只收集硬件 facts:
ansible db01 -m setup -a "gather_subset=hardware" - 同时收集多个子集:
ansible web1 -m setup -a "gather_subset=network,hardware" - 排除特定子集(如跳过包管理器信息):
ansible node01 -m setup -a "gather_subset=!packages"
把过滤结果保存为文件便于离线分析
将输出重定向到本地文件,方便搜索、比对或存档:
ansible node01 -m setup -a "filter=ansible_default_ipv4" > node01-ip.factsansible all -m setup -a "filter=ansible_hostname,ansible_memtotal_mb" > host-summary.json
不复杂但容易忽略:filter 值区分大小写,且必须与 facts 字段名完全一致;点号(.)表示嵌套层级,不能漏写。











