接上面添加设备的文章
1、少量的设备添加,可以通过将设备信息写入脚本里面。但是如果有几百台,通过在脚本里面写不现实。可以将设备信息写入CSV文件,然让脚本读取CSV文件内容,从而实现批量添加设备。
2、在win上将设备的信息编辑好,复制到linux里面,创建一个CSV格式的文件
3、linux的中生成的CSV文件是在字符之间有规则空格,要将空格替换成逗哈“,”
使用awk 来进行替换,将aaa.cvs文件里面的空格替换为“,”逗号,然后生成111_modified.csv文件
这样Python就可以读取了
awk '{$1=$1; gsub(/ /,","); print}' aaa.csv > 111_modified.csv
批量添加代码如下
import csv
import pynetbox
# 配置NetBox实例URL和API令牌
nb_url = 'http://10.8.110.48/'
token = 'f6b0247f80a3abea244843f9d0661b749494527f'
# 连接到NetBox API
nb = pynetbox.api(nb_url, token=token)
# 读取CSV文件
devices = []
with open('111.csv', mode='r', encoding='utf-8') as file:
csv_reader = csv.DictReader(file)
for row in csv_reader:
devices.append(row)
# 批量添加设备
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.")