ansible批量采集linux资产的关键在于明确采集范围、安全提取字段并补充命令级指标:通过gather_subset控制facts子集,用default过滤undefined值,结合command获取磁盘、用户、服务等运行态数据,最终聚合为json/html报告。

用 Ansible 批量采集 Linux 服务器集群资产信息,关键不是“能不能”,而是“采什么、怎么采、怎么防错”。核心是利用 setup 模块(即 gather_facts)获取结构化元数据,再结合轻量命令补足细节,避免全量采集拖慢速度或失败。
聚焦必需资产字段,精简 facts 采集范围
默认全量采集耗时且易在容器、受限环境失败。应显式控制子集:
- 用
gather_subset: ["mininal", "hardware", "network"]获取主机名、OS、CPU、内存、网卡基础信息 - 若目标为无网络容器(如 Podman rootless),改用
gather_subset: ["mininal", "!network", "!virtual"] - 保留
gather_facts: true,不关闭——否则后续任务无法引用ansible_facts
安全提取关键资产指标,避开 undefined 报错
facts 字段可能缺失(尤其禁用或采集失败时),直接引用会中断执行:
- 内存总量:
{{ ansible_facts['memtotal_mb'] | default(0) }} - 操作系统:
{{ ansible_facts['distribution'] | default('Unknown') }} {{ ansible_facts['distribution_version'] | default('N/A') }} - CPU 核心数:
{{ ansible_facts['processor_vcpus'] | int | default(1) }} - 主网卡 IP:
{{ ansible_facts['all_ipv4_addresses'] | first | default('0.0.0.0') }}
补充命令级资产采集,覆盖 setup 不提供的细节
setup 不返回磁盘使用率、进程数、已登录用户等运行态指标,需搭配 command 模块:
- 磁盘使用率:用
df -P | awk 'NR>1 {print $1,$5}'提取挂载点与百分比 - 已登录用户数:用
w -h | wc -l或who | wc -l - 关键服务状态:用
systemctl is-active nginx判断服务是否运行 - 输出统一转为 JSON 格式(如
df -P --output=source,pcent,target | tail -n +2 | jq -R 'split(" ") | {device:.[0], use:.[1], mount:.[2]}'),便于后续解析
汇总输出为结构化报告,支持筛选与归档
采集后需落地为可用资产视图,而非仅打印屏幕:
- 用
set_fact聚合各主机数据到hostvars,再通过group_by或json_query提取特定维度(如所有 CentOS 主机的内存总和) - 用
copy模块将hostvars渲染成 JSON 文件存入控制节点:content: "{{ hostvars | to_nice_json }}" - 配合 Jinja2 模板生成 HTML 报告,按 OS、内存区间、磁盘使用率分组着色(OK/Bad/Critical)
- 结果文件可自动推送到 S3、NAS 或邮件附件,实现定期巡检闭环











