1、Netbox搭建完成后,需要将实际中的设备信息添加进入Netbox系统
2、需要提前在系统中配置好相关参数(站点、位置、机柜、设备角色、厂商、设备类型、Vlans等相关想信息,如果不配置会让脚本显得稍微复杂,我已经写好了相关参数)
详细脚本如下
import pynetbox
# 配置NetBox实例URL和API令牌
#API在管理员栏,API Tokens里面创建
nb_url = 'http://10.8.110.48/'
token = 'f6b0247f80a3abea244843f9d0661b749494527f'
# 连接到NetBox API
nb = pynetbox.api(nb_url, token=token)
# 设备列表
devices = [
{
'name': '2box-B-jieru5',
'device_type': 'S5735-L48T4S-A1',
'device_role': '接入层交换机',
'site': '江夏基地',
'rack': 'B3柜',
'position': 10,
'primary_ip': '10.5.5.151/24',
'vlan_name': 'Vlan100' },
{
'name': '2box-B-jieru6',
'device_type': 'S5735-L48T4S-A1',
'device_role': '接入层交换机',
'site': '江夏基地',
'rack': 'B3柜',
'position': 20,
'primary_ip': '10.5.5.152/24',
'vlan_name': 'Vlan100'
},
]
# 批量添加设备
for device in devices:
# 获取相关对象的ID
device_types = nb.dcim.device_types.filter(model=device['device_type'])
device_roles = nb.dcim.device_roles.filter(name=device['device_role'])
sites = nb.dcim.sites.filter(name=device['site'])
racks = nb.dcim.racks.filter(name=device['rack'])
device_type = list(device_types)[0] if device_types else None
device_role = list(device_roles)[0] if device_roles else None
site = list(sites)[0] if sites else None
rack = list(racks)[0] if racks else None
# 打印调试信息
print(f"Device: {device['name']}")
print(f"Device Type: {device_type}")
print(f"Device Role: {device_role}")
print(f"Site: {site}")
print(f"Rack: {rack}")
# 检查是否获取到所有必要对象
if not device_type:
print(f"Error: Cannot find device_type '{device['device_type']}' for {device['name']}.")
continue
if not device_role:
print(f"Error: Cannot find device_role '{device['device_role']}' for {device['name']}.")
continue
if not site:
print(f"Error: Cannot find site '{device['site']}' for {device['name']}.")
continue
if not rack:
print(f"Error: Cannot find rack '{device['rack']}' for {device['name']}.")
continue
# 创建设备
new_device = nb.dcim.devices.create(
name=device['name'],
device_type=device_type.id,
role=device_role.id,
site=site.id,
rack=rack.id,
position=device['position'],
face='front', # 设置设备安装在机架的前面
)
print(f"Successfully added {device['name']} with ID {new_device.id}.")
# 确保VLAN接口存在
interfaces = nb.dcim.interfaces.filter(device_id=new_device.id, name=device['vlan_name'])
if not interfaces:
interface = nb.dcim.interfaces.create(
device=new_device.id,
name=device['vlan_name'],
type='virtual', # 假设VLAN接口是虚拟接口
)
print(f"Created interface {device['vlan_name']} for {device['name']}.")
else:
interface = interfaces[0]
# 分配IP地址到VLAN接口
if 'primary_ip' in device:
# 检查IP地址是否已经存在
ip_addresses = nb.ipam.ip_addresses.filter(address=device['primary_ip'])
ip_addresses_list = list(ip_addresses) # 将RecordSet对象转换为列表
if not ip_addresses_list:
ip_address = nb.ipam.ip_addresses.create(
address=device['primary_ip'],
assigned_object_type='dcim.interface',
assigned_object_id=interface.id,
)
else:
ip_address = ip_addresses_list[0]
# 更新IP地址的分配对象
ip_address.update({
'assigned_object_type': 'dcim.interface',
'assigned_object_id': interface.id,
})
# 设置为主要IP地址
new_device.update({'primary_ip4': ip_address.id})
print(f"Successfully assigned IP {device['primary_ip']} to {device['name']} on interface {interface.name}.")
else:
print(f"Error: Primary IP address is missing for {device['name']}.")
print("All devices processed.")
vlans、IP地址、设备,名称以实际为准。
当有很多台设备的时候,采用把上面把设备信息包含在代码里面不现实,后续更新脚本读取表格(CSV)的方式来添加设备,链接为CSV格式批量添加
Continueding