• netbox 介绍和自动化管理配置
    01概 览
    NetBox 是一个开源的 IP 地址管理(IPAM)和数据中心基础设施管理(DCIM)工具,广泛用于管理和跟踪企业网络的设备、连接、IP 地址、虚拟化资源等。它由 DigitalOcean 开发并开源,目的是提供一个集中化的平台来管理网络基础设施,帮助网络管理员、系统管理员和基础设施工程师提高工作效率。
    02主要功能
    • DCIM (数据中心基础设施管理) netbox 的 dcim 可以将站点、区域、租户、机柜、设备等很好的管理起来,并且这几项元素之间可以产生关联关系,能够通过其中一个,找到其他的,例如通过站点看到有多少机柜或设备 可以在每个设备创建接口,然后连接起来,可以追踪线缆的连接关系
    • IPAM IP 地址管理功能,需要先定义前缀列表,会自动组成父子的关系,例如 16 位的会自动包含 24 位的地址段
    03部 署
    推荐使用 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 端口访问
    04创建设备
    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]]
    [[netbox.dcim.virtual_chassis]]
    定义 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
    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]]
    [[netbox.ipam.ip-ranges]]
    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()
    devices = nb.dcim.devices.all()
    特殊情况处理
    有些字段,例如 regions、cables 是存在关联关系的
    例如 regions 中有时需要写 parent 字段,就像武汉的 parent 是湖北
    我们在配置文件中是这么定义的
    wh = { name = “武汉”, slug = ‘wh’, parent = “湖北”}
    但是 pynetbox 在创建时,要求把 parent 转换为 id,所以就需要先做一层查询
    parent_id = nb.dcim.regions.get(name=detail[‘parent’])
    parent_id = nb.dcim.regions.get(name=detail[‘parent’])
    同样的,cables 也可以这么做
    05数字科技峰会
    netbox 的优点如下
    1. 提供了一个灵活且高度可定制的数据模型,支持管理设备、IP 地址、机架等多个基础设施元素,且易于扩展
    2. API 功能非常完善,几乎可以做所有的 Web 能操作的配置
    3. 开源且免费
    4. 用户页面比较直观,例如机柜立面图
    5. IPAM 功能比较好用,可以跟踪和管理 IP 地址空间,避免 IP 地址冲突
    6. 可以管理设备端口与线缆,解决使用 Excel 表时无法管理端口表的问题
    缺点如下
    1. 功能集中在基础设施和网络相关的,如果已有其他的 CMDB,在使用上会有割裂的情况,需要做一定的开发
    2. 在大规模环境中,部署和维护 NetBox 可能比较复杂,特别是在高可用性或多集群的场景下
    总的来说,netbox 还是一个很强大的功能,适合网络工程师或基础架构工程师进行机柜、设备、IP 地址、网络拓扑的管理,如果能对其进行深入开发,还是可以把数据中心的设备理的很清楚的。
     
    如有相关问题,请在文章后面给小编留言,小编安排作者第一时间和您联系,为您答疑解惑。
    «
    »
以专业成就每一位客户,让企业IT只为效果和安全买单

以专业成就每一位客户,让企业IT只为效果和安全买单