如何通过NetBox API对接本地脚本实现设备数据自动入库?
实现NetBox网段扫描自动入库方案
一、在NetBox中添加网段输入交互区域
用NetBox自带的**自定义脚本(Custom Scripts)**快速实现网段输入功能,无需复杂插件开发:
- 登录NetBox后台,进入「Scripts」页面
- 创建新脚本,继承
extras.scripts.Script类,添加网段输入字段:
from extras.scripts import Script, StringVar import requests import pynetbox class ScanAndImport(Script): # 定义网段输入框 target_cidr = StringVar( description="输入要扫描的IP网段(如192.168.104.0/24)", required=True ) class Meta: name = "网段扫描并入库" description = "输入IP网段,调用本地扫描API获取设备信息并导入NetBox"
二、对接本地扫描API获取结果
在脚本中添加调用本地API的逻辑,传入网段参数并接收结构化扫描结果:
def run(self, data, commit): # 本地扫描API地址 scan_api_url = "http://你的本地API地址/scan" # 发送POST请求携带网段参数 response = requests.post(scan_api_url, json={"cidr": data["target_cidr"]}) if response.status_code != 200: return f"扫描API调用失败:{response.text}" scan_results = response.json() self.log_info(f"成功获取{len(scan_results)}条设备扫描结果")
三、解析结果并写入NetBox数据库
使用pynetbox客户端连接NetBox,将扫描到的MAC、主机名、虚拟机属性等信息入库:
- 先在NetBox中创建好对应的设备角色、厂商等基础数据(比如「虚拟机」角色)
- 在脚本中添加入库逻辑:
# 初始化NetBox客户端 nb = pynetbox.api( "http://你的NetBox地址", token="你的NetBox API令牌" ) for device in scan_results: # 检查IP地址是否已存在 ip_obj = nb.ipam.ip_addresses.get(address=device["ip_address"]) if not ip_obj: ip_obj = nb.ipam.ip_addresses.create(address=device["ip_address"], status="active") # 准备设备数据 device_data = { "name": device["hostname"], "role": nb.dcim.device_roles.get(name="虚拟机" if device["is_vm"] else "物理设备").id, "status": "active", "primary_ip4": ip_obj.id } # 检查设备是否已存在,不存在则创建 existing_device = nb.dcim.devices.get(name=device["hostname"]) if not existing_device: new_device = nb.dcim.devices.create(**device_data) # 添加MAC地址到设备接口 interface = nb.dcim.interfaces.create( device=new_device.id, name="eth0", mac_address=device["mac_address"] ) self.log_success(f"成功导入设备:{device['hostname']}") else: self.log_info(f"设备{device['hostname']}已存在,跳过") return "扫描入库流程完成"
四、测试验证
- 在NetBox的「Scripts」页面运行该脚本,输入
192.168.104.0/24 - 查看脚本日志,确认扫描结果正常获取并入库
- 进入NetBox的「Devices」和「IP Addresses」页面,验证数据是否正确添加
内容的提问来源于stack exchange,提问作者John
相关产品推荐
相关产品推荐

