直接用 group_by 模块结合 ansible_architecture 事实可实现运行时按内核架构自动分组,无需预定义 inventory 分组;需确保 gather_facts: true 以获取该变量,组名建议用 arch_{{ ansible_architecture | lower }} 统一小写,生成的临时组仅限当前 playbook 有效,后续任务可直接 targeting 如 arch_aarch64 等组操作。

直接用 group_by 模块结合 ansible_architecture 事实即可实现运行时按内核架构自动分组,无需预定义 inventory 分组。
确认目标主机已采集架构事实
Ansible 默认不自动收集全部 facts,尤其在精简模式下。需显式调用 setup(或 gather_facts: true)确保 ansible_architecture 可用:
- 该变量值如
x86_64、aarch64、ppc64le等,区分大小写且不含空格 - 若跳过 setup,group_by 会因变量未定义而报错
undefined variable
用 group_by 按架构创建临时组
在 playbook 中插入 task,使用 key: arch_{{ ansible_architecture | lower }} 构建组名(统一小写避免大小写敏感问题):
- 示例 task:
group_by:
key: "arch_{{ ansible_architecture | lower }}"
- 执行后,所有
aarch64主机将自动加入内存中组arch_aarch64,x86_64主机加入arch_x86_64,依此类推 - 这些组仅存在于当前 playbook 执行周期,不写入 inventory 文件
后续任务直接针对架构组操作
在同一个 playbook 中,后续 play 可直接以新生成的组为 hosts 目标:
- 例如单独给 ARM 服务器部署交叉编译工具链:
tasks:
- name: 安装 ARM 工具包
apt:
name: gcc-aarch64-linux-gnu
state: present
- 也可用
arch_x86_64组运行 x86 专用二进制安装逻辑 - 支持多组并行处理,无需手动维护静态分组或编写条件判断
验证与调试技巧
运行前加一个 debug task 查看实际架构值,避免因命名不一致导致分组失败:
- - debug:
msg: "This host is {{ ansible_architecture }}" - 执行时加
-v参数可看到 group_by 实际创建了哪些组 - 注意:某些容器环境或最小化系统可能返回
unknown,建议配合when: ansible_architecture != 'unknown'做兜底判断










