Ansible 的 setup 模块是系统级事实采集探针,非安装配置工具;它通过轻量脚本收集 CPU 架构、内存、磁盘、网卡等硬件变量,支撑异构环境可靠部署。

Ansible 的 setup 模块不是用来“安装”或“配置”的执行器,而是系统级事实的采集探针。它通过轻量 Python 脚本在目标主机上运行,把 CPU 架构、内存容量、磁盘类型、网卡型号等原始硬件特征转为变量,让后续任务能真正“看懂”每台机器——这才是异构环境批量部署可靠落地的前提。
聚焦关键硬件字段,避免全量收集拖慢效率
默认执行 ansible all -m setup 会拉取上百项事实,既耗时又干扰判断。生产中应直接限定范围,只取真正影响部署逻辑的硬件标识:
-
CPU 架构与指令集:用
filter=ansible_architecture,ansible_machine区分 x86_64 / aarch64 / ppc64le,这是二进制兼容性的第一道门槛 -
内存容量:用
filter=ansible_memtotal_mb判断是否满足服务最低要求(如 Kafka 节点需 ≥16GB) -
磁盘类型与容量:用
filter=ansible_devices或gather_subset=hardware获取ansible_devices.sda.rotational(0=SSD,1=HDD)及size_mb,决定是否启用高性能 I/O 参数 -
网卡型号与驱动:用
filter=ansible_interfaces,ansible_<interface_name>.module</interface_name>(如ansible_eth0.module)识别是 ixgbe、i40e 还是 mlx5_core,用于加载对应内核模块或调优参数
在 Playbook 中用硬件变量做硬性分支
收集到的硬件变量可直接参与 when 判断、include_tasks 分流或模板渲染,确保每类机器只执行适配它的操作:
- 根据内存大小动态设置 JVM 堆内存:
- name: Set heap size for Java app<br> lineinfile:<br> path: /opt/app/jvm.options<br> line: "-Xms{{ (ansible_memtotal_mb // 4) | int }}m -Xmx{{ (ansible_memtotal_mb // 2) | int }}m"<br> when: ansible_memtotal_mb >= 8192 - 按磁盘类型启用不同 I/O 调度器:
- name: Set I/O scheduler for SSD<br> command: echo deadline > /sys/block/sda/queue/scheduler<br> when: ansible_devices.sda.rotational == "0"
- 仅在 Mellanox 网卡上加载 RDMA 配置:
- name: Deploy RDMA config<br> copy:<br> src: rdma.conf<br> dest: /etc/modprobe.d/rdma.conf<br> when: ansible_eth0.module == "mlx5_core"
结合 gather_subset 提升采集精度与速度
setup 模块支持按类别预设采集子集,比单纯用 filter 更高效,尤其适合硬件专项判断:
-
gather_subset=hardware:包含 CPU、内存、设备、BIOS 等,适合做资源型决策(如容器调度限制) -
gather_subset=network:返回所有接口、MAC、MTU、驱动模块,适合网络拓扑感知部署(如自动绑定 bond 接口) -
gather_subset=virtual:快速识别是否为 KVM/QEMU/VMware/AWS EC2,跳过物理机专属任务(如 BIOS 更新) - 组合使用更精准:
gather_subset=hardware,network -a 'filter=ansible_memtotal_mb,ansible_devices,ansible_eth0.module'
容错与验证:防止因硬件信息缺失导致部署中断
部分老旧主机或最小化系统可能缺失某些 facts(如 ansible_devices 在无 root 权限时为空),需主动兜底:
- 用
default过滤器提供安全值:{{ ansible_memtotal_mb | default(4096) }} - 用
is defined和is not none做存在性检查:when: ansible_devices is defined and ansible_devices.sda is defined - 用
fail模块强制中断并提示异常:- name: Abort if no SSD found<br> fail:<br> msg: "No SSD device detected. Deployment requires NVMe or SATA SSD."<br> when: not (ansible_devices | dict2items | selectattr('value.rotational', 'equalto', '0') | list | length > 0)

















