NetBox介绍和自动化管理配置

服务器 数据中心
Netbox 还是一个很强大的功能,适合网络工程师或基础架构工程师进行机柜、设备、IP 地址、网络拓扑的管理,如果能对其进行深入开发,还是可以把数据中心的设备理的很清楚的。

一、概览

NetBox 是一个开源的 IP 地址管理(IPAM)和数据中心基础设施管理(DCIM)工具,广泛用于管理和跟踪企业网络的设备、连接、IP 地址、虚拟化资源等。它由 DigitalOcean 开发并开源,目的是提供一个集中化的平台来管理网络基础设施,帮助网络管理员、系统管理员和基础设施工程师提高工作效率。

二、主要功能

  • DCIM (数据中心基础设施管理)
    netbox 的 dcim 可以将站点、区域、租户、机柜、设备等很好的管理起来,并且这几项元素之间可以产生关联关系,能够通过其中一个,找到其他的,例如通过站点看到有多少机柜或设备
    可以在每个设备创建接口,然后连接起来,可以追踪线缆的连接关系
  • IPAM
    IP 地址管理功能,需要先定义前缀列表,会自动组成父子的关系,例如 16 位的会自动包含 24 位的地址段

三、部署

推荐使用 docker-compose 部署,比较简单方便些

可以在 netbox-docker 项目的 readme 中找到安装方式,这里将其列出

git clone -b release https://github.com/netbox-community/netbox-docker.git
cd netbox-docker
tee docker-compose.override.yml <<EOF
services:
  netbox:
    ports:
      - 8000:8080
EOF
docker compose pull
docker compose up

如上所示,安装完成后会侦听 8000 端口。

使用:

docker compose exec netbox /opt/netbox/

netbox/manage.py createsuperuser

命令创建超级管理员。

创建成功后,可通过 http://ip:8000 端口访问。

四、创建设备

1、介绍

强烈推荐使用 API 创建设备,而不是通过 Web 端添加,虽然 netbox 能够导出数据,但是不方便将所有数据批量导出,而且再导入也没那么方便。

有些信息,例如服务器的 CPU、内存、硬盘等信息,可以通过代码获取,并写入到 netbox,这样就保证了数据的准确性,更新的及时性。

可以通过定义 toml 格式的文件,将配置都写到 toml 内,用 Python 读取写入到 Mongo 再使用 netbox 的 Python 模块写入到 netbox。

2、编写toml

定义租户。

[[netbox.tenancy.tenants]]
test01 = { name = "公司1", slug = 'company1' }
test02 = { name = "公司2", slug = 'company2' }

定义 regions。

[[netbox.dcim.regions]]
sh = { name = "上海", slug = 'sh'}
bj = { name = "北京", slug = 'bj'}

定义 sites。

[[netbox.dcim.sites]]
site01 = { "name" = "site01", "slug" = "site01", "status" = "active", physical_address = "北京市海淀区XXX", latitude = 30.0, longitude = 110.0, region = { name = "北京" }}
site02 = { "name" = "site02", "slug" = "site02", "status" = "active", physical_address = "中国上海市浦东新区XXX, region = { name = "上海"} }

可以看到 sites 关联了 region。

定义 locations。

[[netbox.dcim.locations]]
# 也就是模块
100 = { name = "一期100模块", slug = "100", site = { name= "site01" }}

locations 中关联了 site。

定义 racks。

[[netbox.dcim.racks]]
# 204 模块 
"一期100模块_A01" = { name = "一期100模块_A01", site = { name = "site01" }, status = "available", u_height = 42, location = { name = "一期100模块" }, tenant = { name = "公司1"}}

racks 中关联了 site, location, tenant。

定义 manufacturers。

[[netbox.dcim.manufacturers]]
cisco = { name = "cisco", slug = "cisco"}
huawei = { name = "huawei", slug = "huawei"}

定义 device-types。

[[netbox.dcim.device-types]]
# huawei
CE6820-48S6CQ = { manufacturer = { name = "huawei"}, model = "CE6820-48S6CQ", slug = "CE6820-48S6CQ"}
WS-C3750X-48T-S = { manufacturer = { name = "cisco"}, model = "WS-C3750X-48T-S", slug = "WS-C3750X-48T-S"}

定义堆叠组。

[[netbox.dcim.virtual_chassis]]
"堆叠01" = { name = "堆叠01"}

定义 devices。

[[netbox.dcim.devices]]
"device01" = { name = "device01", site = { "name" = "site01" }, tenant = { name = "公司1" }, device_type = { model = "CE6820-48S6CQ" }, role = { name = "核心交换机" }, rack = {name = "一期100模块_A01"}, face = "front", position = 41, virtual_chassis = { name = "堆叠01"}, vc_position = 1, vc_priority = 120}

定义 interface。

[[netbox.dcim.interfaces]]
# 链路聚合组
"device01-Eth-Trunk1" = { device = { name = "device01"}, name = "Eth-Trunk1", type = "lag"}
# 普通接口
"device01_10GE1/0/1" = { device = { name = "device01"}, name = "10GE1/0/1", type = "10gbase-x-sfpp", lag = "Eth-Trunk1"}

定义 cables。

[[netbox.dcim.cables]]
cables_001 = {type = "smf", a_terminations = { device = "device01", name = "10GE1/0/1"}, b_terminations = { device = "device02", name = "GigabitEthernet0/0/7"}}
cables_002 = {type = "smf", a_terminations = { device = "device01", name = "10GE2/0/1"}, b_terminations = { device = "device02", name = "GigabitEthernet0/0/6"}}

定义 prefixes。

[[netbox.ipam.prefixes]]
"192.168.0.0/16" = { prefix = "192.168.0.0/16", "status" = "active", site = { name = "site01"}}
"192.168.100.0/24" = { prefix = "192.168.100.0/24", "status" = "active", site = { name = "site02"}, description = "wifi"}

定义 ip-addresses。

[[netbox.ipam.ip-addresses]]
# BGP
"200.1.1.1/32" = { address = "200.1.1.1/32" , tenant = { name = "公司1"} }
"200.1.1.2/32" = { address = "200.1.1.2/32" , tenant = { name = "公司2"} }

定义 ip-ranges。

[[netbox.ipam.ip-ranges]]
"200.1.1.1_200.1.1.10" = { start_address = "200.1.1.1/32", end_address = "200.1.1.10/32", tenant = { name = "客户01" }}

3、编写代码

在使用 netbox 的 rest api 时,发现有部分 API 的 POST 请求无法更新,未找到具体的原因,所以推荐使用 pynetbox 模块,使用很方便。

读取 toml 配置可以使用 toml 模块,加载后是字典格式,使用很方便。

导入模块并做初始化。

import os
import pynetbox
import toml

config = toml.load('config.toml')
NETBOX_URL = "http://x.x.x.x:8000"
# 可通过环境变量获取
API_TOKEN = os.getenv('NETBOX_API_TOKEN')
nb = pynetbox.api(NETBOX_URL, token=API_TOKEN)

创建:

# 创建
sites = config['netbox']['dcim']['sites']
for site in config['netbox']['dcim']['sites']:
    for values in site.values():
        nb.dcim.sites.create(**values)


# 更新
# 更新时需要先获取 data_id,并传入到待更新的数据内
data_id = nb.dcim.sites.get(name="site01").id
sites['id'] = data_id
nb.dcim.sites.update(**sites)

查询:

devices = nb.dcim.devices.all()
for device in devices:
    print(device.name)

特殊情况处理。

有些字段,例如 regions、cables 是存在关联关系的。

例如 regions 中有时需要写 parent 字段,就像武汉的 parent 是湖北。

我们在配置文件中是这么定义的。

wh = { name = "武汉", slug = 'wh', parent = "湖北"}

但是 pynetbox 在创建时,要求把 parent 转换为 id,所以就需要先做一层查询。

parent_id = nb.dcim.regions.get(name=detail['parent'])
# parent_id 放入待更新的 region 字典内
regions_value['parent'] = parent_id
nb.dcim.regions.create(**regions_value)

同样的,cables 也可以这么做。

五、数字科技峰会

NetBox 的优点如下:

  • 提供了一个灵活且高度可定制的数据模型,支持管理设备、IP 地址、机架等多个基础设施元素,且易于扩展
  • API 功能非常完善,几乎可以做所有的 Web 能操作的配置
  • 开源且免费
  • 用户页面比较直观,例如机柜立面图
  • IPAM 功能比较好用,可以跟踪和管理 IP 地址空间,避免 IP 地址冲突
  • 可以管理设备端口与线缆,解决使用 Excel 表时无法管理端口表的问题

缺点如下:

  • 功能集中在基础设施和网络相关的,如果已有其他的 CMDB,在使用上会有割裂的情况,需要做一定的开发
  • 在大规模环境中,部署和维护 NetBox 可能比较复杂,特别是在高可用性或多集群的场景下

总的来说,NetBox 还是一个很强大的功能,适合网络工程师或基础架构工程师进行机柜、设备、IP 地址、网络拓扑的管理,如果能对其进行深入开发,还是可以把数据中心的设备理的很清楚的。

责任编辑:姜华 来源: 新钛云服
相关推荐

2013-08-30 14:30:59

系统自动化自动化配置SaltStack

2015-09-16 11:13:51

ChefWindows集群运维

2021-11-10 09:00:00

工具Chef开发

2015-10-21 15:08:25

电缆自动化

2009-12-15 17:43:04

Ruby自动化驱动

2010-12-06 09:59:58

2009-12-23 16:19:25

WPF UI自动化技术

2015-10-09 13:14:10

clip自动化运维工具

2013-03-22 15:15:28

自动化管理部署虚拟化

2010-04-02 09:22:42

2017-12-17 21:58:18

2010-12-06 10:10:54

2021-04-19 14:00:03

ExchangelibPython邮箱自动化管理

2009-09-07 09:29:26

2019-04-17 07:59:09

Puppet自动化集群管理

2015-01-29 09:26:35

数据中心自动化网络交换机

2024-06-11 10:41:14

2021-07-14 13:11:02

papermillJupyterPython

2022-01-20 16:35:35

补丁漏洞网络安全

2019-07-16 19:00:00

Ansible配置自动化
点赞
收藏

51CTO技术栈公众号