- 后端
- 网络
- 数据建模
【免费下载链接】netbox
The premier source of truth powering network automation. Open source under Apache 2. Try NetBox Cloud free: https://netboxlabs.com/products/free-netbox-cloud/
Platform(平台)是 NetBox 中用于描述运行在设备或虚拟机上的软件类型(如网络操作系统、Linux 发行版)的核心对象,它与制造商(Manufacturer)和设备类型(Device Type)共同构成了“硬件—软件”双维度建模体系。本文以 NetBox 官方模型文档为基础,结合仓库中 Platform 模型源码 与过滤、表单实现,系统讲解 Platform 的字段语义、父子层级、制造商约束以及配置模板联动,帮助你在资产管理中准确区分同型号设备上的不同软件版本。
Platform 的定位:软件维度的“单一事实来源”
在 NetBox 中,Platform 定义了运行在设备(Device)或虚拟机(Virtual Machine)上的软件类型。建模 Platform 的价值在于:当需要区分同一硬件型号的不同软件版本或功能集时,它是唯一可靠的区分维度。
原文档给出了一个典型场景:两台同为 Juniper MX240 的设备,一台运行 Junos 14,另一台运行 Junos 15。此时两台设备的 Device Type(硬件型号)完全相同,但它们可以被赋予不同的 Platform,从而在配置生成、自动化编排和报表统计层面区分彼此。这正体现了 NetBox 作为网络自动化“数据源(source of truth)”的设计理念——平台信息应成为后续自动化流程(如配置渲染、脚本分发)的输入依据。
从源码可以印证这一设计:Device 模型 中的platform外键指向dcim.Platform,且允许为空(blank=True, null=True),删除时采用on_delete=models.SET_NULL——即平台被删除不会级联删除设备,而是将设备上的平台置空。VirtualMachine 模型 同样持有platform外键,说明同一套 Platform 对象可同时服务于物理设备和虚拟机两类资源。
核心概念
父子层级(Hierarchy)
Platform 支持嵌套组织:平台可以挂在某个父平台之下,形成树状层级。例如,可以创建一个通用的 "Linux" 父平台,再在其下分别创建 "Debian" 与 "RHEL" 两个子平台。这种层级结构在多发行版、多系统系列的场景中尤为实用,既保持了数据组织的清晰度,也便于按父节点进行批量检索。
该能力由模型基类支撑:Platform继承自NestedLtreeGroupModel(见 netbox/dcim/models/devices.py),并使用 PostgreSQL 的 ltree 与GistIndex(dcim_platform_path_gist)来高效存储和查询树状路径。类内的clone_fields = ('parent', 'description')表明复制对象时会继承父平台与描述字段。
平台分配是可选的
将平台分配给设备或虚拟机是可选操作。未分配平台的设备依然可以正常管理,只是缺少软件维度信息。对于通用硬件或尚未确认软件版本的设备,可以先留空,待信息确定后再补充。
字段详解
Parent(父平台)
父平台字段标识当前平台所属的上级平台类,可留空(此时该平台位于层级根部)。它是构建 Platform 树形结构的挂载点,配合下文的parent/ancestor过滤参数,可实现对某一分支下所有平台的聚合查询。
Name(名称)
一个人类可读的平台名称,在同一制造商范围内必须唯一。这一约束在模型层以数据库唯一约束实现:
models.UniqueConstraint( fields=('manufacturer', 'name'), name='%(app_label)s_%(class)s_manufacturer_name', nulls_distinct=False, violation_error_message=_("Platform name must be unique.") )(见 netbox/dcim/models/devices.py)注意nulls_distinct=False的语义:当两个平台都不关联制造商(manufacturer 为 NULL)时,其名称仍被视为重复而触发校验;只有名称不同才允许共存。也就是说“通用平台之间名称唯一,同一制造商内的平台名称也唯一”。
Slug(URL 友好的标识符)
Slug 是名称的 URL 友好版本,用于 API、URL 路由和过滤匹配,同样要求在制造商范围内唯一。模型层通过第二个唯一约束dcim_platform_manufacturer_slug保证(见上文源码)。由于 Slug 常用于 REST API 与 GraphQL 查询中的platform参数,建议采用小写、连字符分隔的稳定命名(如junos-15、rhel-9),一旦被自动化流程引用便不易变更。
Manufacturer(制造商)
制造商字段用于将平台限定到特定硬件厂商:如果平台被指定了制造商,那么它只能被分配给设备类型属于该制造商的设备。这一约束的价值在于防止软件与硬件不匹配的误配——例如把仅供 Cisco 硬件使用的 IOS-XR 平台误配到 Juniper 设备上。
原文档同时给出了重要的使用建议:
- 适合:将网络操作系统(Network Operating System,NOS)限定到对应厂商的硬件,例如 Junos 仅限 Juniper、IOS-XR 仅限 Cisco;
- 不适合:定义通用软件平台(如 Linux、Windows)时不要绑定制造商,否则将无法把它们分配给多厂商的硬件。
从模型定义看,manufacturer外键(见 netbox/dcim/models/devices.py)在删除时使用on_delete=models.PROTECT,即被平台引用的制造商无法直接删除,从数据完整性上保护了这种绑定关系。
Configuration Template(配置模板)
平台可绑定一个默认的配置模板(ConfigTemplate),作为分配给该平台的所有设备的默认配置渲染模板。这是一个强大的自动化联动点:当设备关联到平台后,NetBox 会自动将平台的config_template作为默认模板候选(RenderConfigMixin 与设备渲染流程配合),从而基于软件版本差异渲染出不同的配置。
模型层同样通过外键实现,且删除保护为PROTECT:
config_template = models.ForeignKey( to='extras.ConfigTemplate', on_delete=models.PROTECT, related_name='platforms', blank=True, null=True )(见 netbox/dcim/models/devices.py)related_name='platforms'允许从 ConfigTemplate 反向查询所有使用它的平台,便于模板维护者评估影响面。
通过 API 与过滤条件检索平台
在 REST API 中,Platform 通过dcim.Platform序列化器暴露(见 netbox/dcim/api/serializers_/platforms.py),支持标准的 CRUD 与过滤。PlatformFilterSet(见 netbox/dcim/filtersets.py)提供了丰富的过滤维度:
| 过滤参数 | 说明 |
|---|---|
parent_id | 直接父平台(按 ID) |
parent | 直接父平台(按 slug) |
ancestor_id | 任意层级祖先平台(按 ID,基于树结构) |
ancestor | 任意层级祖先平台(按 slug) |
manufacturer_id | 关联制造商(按 ID) |
manufacturer | 关联制造商(按 slug) |
available_for_device_type | 可用于指定设备类型的平台 |
config_template_id | 关联的配置模板 |
其中ancestor系列过滤器与TreeNodeMultipleChoiceFilter结合,可以直接查询某个父平台分支下的全部子平台,这正是层级建模带来的检索红利;available_for_device_type则用于校验某个平台是否可以分配给特定设备类型(即制造商约束的业务化表达)。
通过 Web UI 与表单管理平台
平台的 Web UI 表单定义于 netbox/dcim/forms/model_forms.py(PlatformForm,继承NestedGroupModelForm),在“设备(Devices)→ 平台(Platforms)”菜单下可完成创建、编辑、复制与删除。由于模型继承了层级基类,表单中会自动呈现父平台选择控件,支持直观地拖拽式或下拉式指定层级关系。
此外,平台支持批量创建(CSV 导入)与批量编辑,适用于首次初始化大量平台记录的迁移场景;导入模板中的字段即上文所述的 Parent、Name、Slug、Manufacturer、Configuration Template 等。仓库测试用例 netbox/dcim/tests/test_filtersets.py(PlatformTestCase)覆盖了上述过滤器与约束的核心行为,可作为理解字段语义的参考验证。
最佳实践小结
- 软件版本精细化:利用 Platform 区分同型号设备上的不同 NOS/Linux 发行版,例如
junos-14与junos-15,使报表与自动化配置具备版本维度; - 善用层级:以通用父平台(如
linux)组织系列子平台(debian、rhel),并借助ancestor过滤实现分支聚合; - 谨慎绑定制造商:仅对厂商专属的 NOS 绑定 Manufacturer;通用软件平台保持 Manufacturer 为空,以便跨厂商复用;
- 联动配置模板:为平台绑定默认 ConfigTemplate,让同平台设备的配置渲染自动化,减少人工干预;
- 遵循唯一性约束:命名与 slug 在设计之初即保持厂商范围内的唯一与稳定,避免后期变更波及 API 与自动化脚本。
- 后端
- 网络
- 数据建模
【免费下载链接】netbox
The premier source of truth powering network automation. Open source under Apache 2. Try NetBox Cloud free: https://netboxlabs.com/products/free-netbox-cloud/
相关推荐
15分钟完成黑苹果配置:OpCore-Simplify终极自动化指南
15分钟完成黑苹果配置:OpCore Simplify终极自动化指南 你是否曾经被黑苹果配置的复杂性所困扰?传统的手动配置OpenCore EFI需要数天时间,
后端网络数据建模.NET 配置抽象层 Microsoft.Extensions.Configuration.Abstractions 完全指南:键值对配置模型、路径约定与绑定特性
.NET 配置抽象层 Microsoft.Extensions.Configuration.Abstractions 完全指南:键值对配置模型、路径约定与绑定特
语言运行时标准库JIT编译编译器使用 PrimeNG OrganizationChart 构建层级组织结构图:数据模型、节点选择、模板定制与主题详解
使用 PrimeNG OrganizationChart 构建层级组织结构图:数据模型、节点选择、模板定制与主题详解 OrganizationChart 是 P
前端UI组件
创作声明:本文部分内容由AI辅助生成(AIGC),仅供参考