企业网络自动化:NetBox、Nornir、Ansible与Git实战

网络自动化最常见的失败方式,是拿一份不准确的 Excel 清单直接批量下发命令。真正可持续的体系应先建立可信数据源,再生成配置、执行预检查、分批变更、验证结果并保存审计证据。本文以 NetBox 作为 Source of Truth,配合 Git、Ansible 和 Nornir 构建生产闭环。

网络设备命令和能力因厂商、型号、系统版本而异。任何自动下发都必须先在实验环境和单台低风险设备验证,并准备带外管理和回滚路径。

一、自动化不是批量SSH

成熟的变更链路应是:

需求/工单
  ↓
NetBox事实源
  ↓
校验与配置渲染
  ↓
Git评审与审批
  ↓
预检查和差异预览
  ↓
灰度下发
  ↓
业务验证
  ↓
回写状态与审计

如果资产、接口、VLAN、IP 或线路数据不可信,自动化只会更快地放大错误。

二、职责边界

NetBox

保存设备、机架、站点、接口、线路、VLAN、VRF、前缀、IP、租户、标签和自定义字段。它描述“期望状态与事实”,不应被当成实时监控数据库。

Git

保存模板、变量模型、自动化代码、测试和评审历史。敏感凭据不应直接提交到仓库。

Ansible

适合声明式模块、标准化 Playbook、批量任务和已有运维团队流程。

Nornir

是 Python 自动化框架,适合复杂并发、细粒度过滤、自定义流程和结果处理。

NAPALM/Netmiko/Scrapli

提供多厂商抽象或 CLI/NETCONF/SSH 连接能力。应根据平台支持选择,而不是强求所有设备使用同一驱动。

三、设计NetBox数据模型

先定义命名和唯一性:

  • Region、Site、Location;
  • 机房、机柜、U 位;
  • Manufacturer、Device Type、Platform;
  • Device Role;
  • Tenant;
  • VRF、VLAN Group、VLAN;
  • Prefix、IP Address;
  • Circuit、Provider;
  • 接口、聚合口、线缆连接;
  • 配置上下文与自定义字段。

常见自定义字段:

  • 管理域和负责人;
  • 变更窗口;
  • 设备重要级别;
  • 高可用组;
  • Loopback、Router ID;
  • 自动化允许级别;
  • 配置模板版本;
  • 上次备份和验证时间。

不要把所有字段都塞进设备备注。结构化字段才能校验、筛选和生成配置。

四、数据治理

事实源要有责任人和更新流程:

  1. 新设备入库前创建对象;
  2. 地址和 VLAN 从 NetBox 分配;
  3. 变更先修改期望状态并进入评审;
  4. 自动化执行后回写运行状态或差异;
  5. 退役时释放地址、线路和机柜资源;
  6. 定期发现孤立 IP、重复序列号、断开的接口和过期设备。

关键约束应自动校验:

  • 主机名唯一;
  • 管理 IP 唯一;
  • 同一 VLAN/VRF 的前缀合法;
  • 接口速率和介质与设备类型匹配;
  • MLAG/堆叠成员数量正确;
  • 线路两端完整;
  • 自动化目标具备平台和驱动字段。

五、API与动态清单

NetBox 提供 REST API 和 GraphQL。查询时使用只读令牌、最小权限和分页,避免脚本获取全部字段。

Ansible 可使用 NetBox inventory plugin,按站点、角色、平台或标签生成组。清单只负责目标和变量来源,不应在多个地方重复维护相同地址。

示例逻辑:

plugin: netbox.netbox.nb_inventory
api_endpoint: https://netbox.example.com
token: "{{ lookup('env', 'NETBOX_TOKEN') }}"
validate_certs: true
group_by:
  - sites
  - device_roles
  - platforms
query_filters:
  - status: active
  - tag: automation-enabled

令牌通过密钥系统或流水线变量注入,不写入 Git。

六、配置模板工程化

Jinja2 模板应与数据 Schema 配套,避免在模板中堆积大量业务判断。

推荐目录:

network-automation/
├── inventories/
├── models/
├── templates/
│   ├── cisco_ios/
│   ├── huawei_vrp/
│   └── h3c_comware/
├── roles/
├── tests/
├── playbooks/
└── docs/

模板输出前执行:

  • 必填字段校验;
  • IP、掩码、ASN、VLAN 范围校验;
  • 接口名称标准化;
  • 平台能力矩阵校验;
  • 生成配置语法检查;
  • 与黄金样例对比。

厂商差异应由平台适配层处理。不要用一个巨大模板通过几十个 if 兼容所有设备。

七、配置备份与差异

定期拉取运行配置,规范化动态字段后存入受控仓库或备份系统。需要过滤密码散列、SNMP community、私钥和其他敏感内容。

每次变更前保存:

  • running/startup configuration;
  • 设备版本、启动镜像和补丁;
  • 邻居、路由、链路聚合和冗余状态;
  • 变更前业务探测结果;
  • NetBox 对象版本。

差异预览要区分命令顺序变化与真实语义变化。部分平台配置回显会重排,单纯文本 diff 容易产生噪声。

八、Ansible安全执行

- name: Precheck device facts
  hosts: edge
  gather_facts: false
  serial: 1
  max_fail_percentage: 0
  tasks:
    - name: Collect facts
      ansible.netcommon.cli_command:
        command: display version
      register: version_output
      changed_when: false

生产原则:

  • 使用厂商模块优先于裸 shell;
  • 设置 serial,先单台灰度;
  • 预检查失败即停止;
  • 变更与验证分成明确阶段;
  • 结果写入工单和制品;
  • 设备命令设置合理超时;
  • 禁止全网无限并发;
  • 不把失败设备默默跳过。

九、Nornir并发与过滤

Nornir 可按 inventory 属性筛选目标并控制 worker。并发数应根据跳板机、AAA、设备 CPU 和链路承载能力确定。

流程建议:

  1. 从 NetBox 获取候选设备;
  2. 根据工单和标签二次过滤;
  3. 验证目标数量和设备列表;
  4. 并发执行只读预检查;
  5. 按故障域分批下发;
  6. 每批完成后验证;
  7. 超过失败阈值立即停止。

十、预检查设计

预检查应确认:

  • 管理地址可达;
  • SSH/NETCONF/API 可登录;
  • 当前版本受支持;
  • 设备 CPU、内存和存储正常;
  • 堆叠、IRF、CSS、MLAG、VRRP 状态正常;
  • 目标接口和邻居符合预期;
  • 当前配置未出现未审计漂移;
  • 带外管理可用;
  • 备份完成;
  • 变更窗口有效。

若基线已经异常,应先判断是否取消变更,而不是在未知状态上继续叠加。

十一、变更分批策略

按站点、冗余对、机柜或业务域分组。冗余设备不能同时操作。

示例:

第0批:实验设备
第1批:单个低风险站点的一台设备
第2批:同类设备的10%
第3批:剩余设备分故障域推进

每批设置观察时间,验证控制面和数据面。不要因为 CLI 返回成功就认为业务正常。

十二、验证与业务探测

验证至少包含:

  • 配置是否存在且无多余项;
  • 接口、聚合、冗余协议状态;
  • OSPF/ISIS/BGP 邻居;
  • 路由数量和关键前缀;
  • MAC、ARP/ND 和 ACL 计数;
  • 端到端 Ping、TCP、DNS 或 HTTP;
  • 丢包、延迟和流量曲线;
  • 监控与日志是否出现新告警。

网络变更的成功条件应在变更前写清楚,并可由脚本判定。

十三、回滚设计

回滚不是简单把旧配置全量覆盖。不同设备可能支持候选配置、commit confirmed、checkpoint、配置会话或回滚点。

优先使用平台原生的事务能力:

  • 下发候选配置;
  • 对比差异;
  • 定时自动回滚;
  • 验证后确认提交。

对于只支持即时 CLI 的设备,应按变更生成逆向命令,并验证逆向命令不会删除其他业务配置。重大变更必须准备带外接入和现场支持。

十四、漂移检测

运行配置与期望状态不一致即漂移。漂移可能来自紧急手工操作、自动化失败、模板缺陷或设备自生成字段。

治理流程:

  1. 定期采集并规范化配置;
  2. 与期望配置做结构化比较;
  3. 过滤动态和无语义字段;
  4. 创建漂移事件;
  5. 判断回写事实源还是恢复期望状态;
  6. 保留审批和处置记录。

不要在发现漂移后立即全自动覆盖,未知的现场救火配置可能正在维持业务。

十五、凭据与审计

  • 个人账号与自动化服务账号分离;
  • 使用 TACACS+/RADIUS/AAA 审计;
  • 密码、私钥和令牌进入 Vault 等密钥系统;
  • 自动化账号按命令或 API 最小授权;
  • 生产与测试凭据分离;
  • 日志脱敏但保留操作者、目标、时间和结果;
  • 定期轮换并验证撤销旧凭据。

十六、多厂商实践

思科 IOS/IOS XE/NX-OS、华为 VRP、华三 Comware 在命令、分页、提交方式和返回格式上不同。应维护平台能力矩阵:

能力 记录内容
连接方式 SSH、NETCONF、RESTCONF、API
事务 candidate、commit、checkpoint
配置备份 获取与恢复命令
结构化数据 YANG、JSON、XML、TextFSM
软件升级 镜像、补丁、回滚机制
高可用 堆叠、MLAG、VRRP等

自动化目标是统一流程,不是抹平所有厂商差异。

十七、流水线与审批

建议把自动化接入 CI:

  1. 提交 Merge Request;
  2. Schema、模板和单元测试;
  3. 渲染配置并生成差异制品;
  4. 同行评审;
  5. 生产审批;
  6. 预检查;
  7. 灰度执行;
  8. 后检查和业务探测;
  9. 结果回写工单与 NetBox。

流水线应把目标设备清单显示给审批人,防止过滤条件错误导致全网变更。

十八、上线清单

  • [ ] NetBox 对象、字段、命名和责任人已定义;
  • [ ] 地址与 VLAN 分配流程以事实源为准;
  • [ ] 自动化目标需显式标签授权;
  • [ ] 模板、数据模型和平台能力有测试;
  • [ ] 凭据不进入 Git,账号最小权限;
  • [ ] 每次执行有目标确认、预检查和配置备份;
  • [ ] 冗余设备不会同批变更;
  • [ ] 设备验证和业务探测都自动执行;
  • [ ] 失败阈值、停止条件和回滚路径明确;
  • [ ] 配置漂移、结果和审计证据可追溯。

十九、结语

网络自动化的核心不是写更多脚本,而是让数据、变更、验证和审计形成闭环。先提高事实源质量,再逐步从只读采集、配置备份、差异检测扩展到灰度下发;只有能够安全停止和回滚的自动化,才真正适合生产。

参考资料

Copyright © yan-jian.com 2023 - 2026 · Powered by GitBook更新时间: 2026-10-28 21:12:05

results matching ""

    No results matching ""