Ansible的assert模块通过已收集的事实实现硬件规格刚性拦截:先用setup采集ansible_processor_vcpus、ansible_memtotal_mb、ansible_architecture等字段,再断言是否满足阈值,不达标则中止任务。

Ansible 的 assert 模块本身不执行检查,而是依赖已收集的事实(facts)做断言判断。要实现“批量分发前对内存与CPU规格做刚性拦截”,核心路径是:先用 setup 模块采集目标机硬件信息 → 再用 assert 模块校验关键字段是否满足预设阈值 → 不达标则任务中止,阻止后续操作。
明确需校验的硬件事实字段
Ansible 自动收集的硬件变量中,以下字段可直接用于容量判断:
-
内存总容量:
ansible_memtotal_mb(单位 MB),注意部分旧版可能为ansible_memtotal_mb或ansible_memory_mb.real.total,推荐统一用前者(Ansible 2.5+ 稳定支持) -
CPU 核心数:
ansible_processor_cores(单颗 CPU 的物理核心数) -
CPU 逻辑线程数:
ansible_processor_vcpus(即总逻辑 CPU 数,含超线程) -
系统架构:
ansible_architecture(如x86_64、aarch64),可用于拦截不兼容平台
编写带断言的 Playbook 实现刚性拦截
以下是一个最小可行示例,要求每台目标机至少 4 核 CPU、8GB 内存,并运行在 x86_64 架构上:
- name: 预检:验证目标机硬件规格
hosts: all
gather_facts: yes
tasks:
- name: 断言 CPU 核心数 ≥ 4
assert:
that:
- ansible_processor_vcpus is defined
- ansible_processor_vcpus >= 4
msg: "CPU 逻辑核数不足 4,当前为 {{ ansible_processor_vcpus }},拒绝部署"
<pre class="brush:php;toolbar:false;">- name: 断言内存 ≥ 8192 MB(即 8GB)
assert:
that:
- ansible_memtotal_mb is defined
- ansible_memtotal_mb >= 8192
msg: "内存总量不足 8GB({{ ansible_memtotal_mb }} MB),终止执行"
- name: 断言架构为 x86_64
assert:
that:
- ansible_architecture == "x86_64"
msg: "非 x86_64 架构(当前为 {{ ansible_architecture }}),不支持该发布包"执行命令:ansible-playbook check_hardware.yml。任意一台不满足条件,Playbook 将立即失败并输出对应提示,后续任务不会触发。
适配不同环境的灵活写法
若需按主机组差异化要求(如生产机要求更高),可结合变量和条件:
- 在
group_vars/prod中定义:min_cpu_cores: 8、min_memory_mb: 16384 - 在 assert 任务中改用:
ansible_processor_vcpus >= min_cpu_cores - 使用
when: inventory_hostname in groups['prod']控制仅对 prod 组生效 - 对虚拟机环境额外加检:
ansible_virtualization_type != "docker"(避免误判容器为真实节点)
注意事项与避坑点
这些细节直接影响拦截是否真正“刚性”:
-
必须开启 facts 收集:确保
gather_facts: yes(默认开启),否则ansible_*变量为空,断言会因未定义而失败 -
避免浮点误差:
ansible_memtotal_mb是整数,但某些 ARM 主机或旧内核可能返回字符串,建议加| int过滤,如ansible_memtotal_mb | int >= 8192 -
不要依赖 uptime 或临时命令:
assert只能作用于已存在的变量,不能调用shell模块结果——需用set_fact先存为变量再断言 -
错误信息要具体:
msg中务必回显实际值(如{{ ansible_memtotal_mb }}),便于快速定位哪台机器、哪个指标不达标











