ansible 不能直接刷网卡固件,但可安全批量驱动厂商工具完成升级。需适配intel、nvidia、broadcom等专用工具链,结合校验、备份、串行控制、block/rescue回滚及cmdb对接,实现标准化、可审计的固件更新流程。

Ansible 本身不直接提供网卡固件升级能力,但可以作为统一调度引擎,把固件更新流程标准化、原子化、可回滚。关键不是“Ansible 能不能刷固件”,而是“如何用 Ansible 安全、可控、批量地驱动厂商工具完成固件更新”。
确认硬件支持与固件工具链
不同厂商(Intel、Mellanox/NVIDIA、Broadcom、Marvell)的网卡需使用对应官方工具,且多数要求在特定 OS 环境下运行:
- Intel:使用 fwupdate(Linux)或 BootUtil(DOS/UEFI),部分型号需先加载驱动(
igb_uio或uio_pci_generic) - NVIDIA/Mellanox:依赖 mstflint + mlxconfig,通常需安装
mst-utils和mlnx-ofed套件 - Broadcom:使用 bnxt-tools(如
bnxtflash),要求内核模块bnxt_en已加载且未被占用 - 通用前提:目标节点必须支持带外(如 BMC/IPMI)或带内(OS 运行时)升级;部分固件仅允许在设备重启前更新,需配合 reboot 模块精准控制时机
构建安全、可中断的 Playbook 流程
固件升级不可逆,Ansible 必须嵌入校验、备份、超时和失败兜底机制:
- 执行前采集当前固件版本:
command: lspci -vv -s {{ pci_slot }} | grep 'firmware revision',用 register 存为变量,用于后续比对 - 校验固件包完整性:用 stat 检查本地 firmware 文件是否存在,再用 checksum 模块比对 SHA256(提前在 vars 中定义预期哈希值)
- 分组串行执行:设置 serial: 5,避免集群级网络风暴或电源冲击;对关键业务节点可单独划入
critical_nodes组,进一步降速至serial: 1 - 封装升级命令为 block + rescue:主 block 调用厂商工具执行刷新;rescue 区块自动触发
reboot并等待 SSH 恢复,若超时则标记失败并跳过后续任务
权限、上下文与状态持久化
网卡固件操作常涉及内核模块、PCI 设备锁定及 root 权限,Ansible 需显式声明执行上下文:
- 所有任务设 become: yes,且指定 become_method: sudo;对某些工具(如
fwupdate),还需设置 environment: 注入LD_LIBRARY_PATH或PATH - 禁用 Ansible 的 fact 缓存(
gather_facts: false),因固件更新后 PCI 设备可能重枚举,需在 reboot 后重新setup获取新硬件信息 - 升级成功后,用 lineinfile 或 copy 将新版本号写入统一日志文件(如
/var/log/firmware_upgrade.log),便于后续用ansible -m command -a "cat /var/log/firmware_upgrade.log"批量核查
对接硬件生命周期与变更管理
生产环境需将固件升级纳入 CMDB 和变更流程,Ansible 可作为执行层衔接:
- 从 CMDB API 拉取目标节点列表及对应网卡型号、当前固件版本、维护窗口时间,动态生成 inventory 和 extra_vars
- Playbook 开头加入 assert 模块,检查当前时间是否在预设维护窗口内(如
ansible_date_time.hour在 2-5 之间),否则中止 - 升级完成后调用 webhook(用 uri 模块)向 ITSM 系统(如 ServiceNow)提交工单闭环记录,包含节点 IP、旧/新固件版本、执行耗时、操作人











