setup模块是Ansible内置的事实收集器,仅通过SSH运行轻量脚本,将主机的系统、CPU、网络等原始信息以JSON格式返回并转为变量,供条件判断与差异化部署使用。

什么是setup模块的核心用途
setup模块是Ansible内置的“事实收集器”,它不安装软件、不修改配置,只通过SSH连接远程主机,运行轻量Python脚本,把操作系统、CPU架构、内核、网络、硬件等原始信息以结构化JSON形式返回。这些信息自动转为Ansible变量(如ansible_architecture、ansible_machine),供后续任务做条件判断——这正是实现差异化发布的底层依据。
快速获取服务器CPU与系统架构关键字段
执行以下命令,几秒内即可确认目标主机的基础架构类型:
-
查看CPU架构(x86_64 / aarch64 / ppc64le等):
ansible web01 -m setup -a 'filter=ansible_architecture' -
确认机器类型与指令集:
ansible web01 -m setup -a 'filter=ansible_machine,ansible_system' -
获取操作系统发行版及版本号:
ansible web01 -m setup -a 'filter=ansible_distribution,ansible_distribution_version' -
检查是否为虚拟化环境(影响容器/内核模块部署):
ansible web01 -m setup -a 'gather_subset=virtual'
例如输出中"ansible_architecture": "aarch64"即表示ARM64平台,"ansible_distribution": "CentOS"和"ansible_distribution_version": "7.9"则明确指向特定发行版组合。
在Playbook中基于架构做差异化发布
收集到的事实可直接用于when条件、include_tasks或模板变量。典型用法如下:
- 根据CPU架构选择二进制包:
- name: Copy ARM64 binary<br> copy:<br> src: "./bin/app-{{ ansible_architecture }}"<br> dest: "/opt/app/bin/"<br> when: ansible_architecture == "aarch64" - 按操作系统家族分发不同依赖:
- name: Install packages for RHEL family<br> yum:<br> name: "{{ item }}"<br> state: present<br> loop:<br> - nginx<br> - python3<br> when: ansible_facts.ansible_os_family == "RedHat" - 跳过不兼容平台的任务:
- name: Skip kernel module load on non-x86<br> command: modprobe mydriver<br> when: ansible_architecture == "x86_64"
提升效率:避免全量收集,精准限定范围
默认ansible -m setup会拉取上百项事实,耗时且冗余。生产环境中应主动限制范围:
- 只收集架构相关字段:
ansible all -m setup -a 'filter=ansible_architecture,ansible_machine,ansible_distribution*' - 仅启用最小化子集(不含硬件/网络):
ansible all -m setup -a 'gather_subset=min' - 排除耗时项(如hardware可能触发
dmidecode):ansible all -m setup -a 'gather_subset=!hardware,!network' - 配合
--tree将每台主机事实存为独立文件,便于离线分析:ansible all -m setup --tree /tmp/arch_facts
这样既加快响应速度,又减少控制节点内存占用,特别适合大规模集群预检。











