新鈦雲服已累計為您分享826篇技術乾貨
NetBox 是一個開源的 IP 地址管理(IPAM)和資料中心基礎設施管理(DCIM)工具,廣泛用於管理和跟蹤企業網路的裝置、連線、IP 地址、虛擬化資源等。它由 DigitalOcean 開發並開源,目的是提供一個集中化的平臺來管理網路基礎設施,幫助網路管理員、系統管理員和基礎設施工程師提高工作效率。
-
DCIM (資料中心基礎設施管理)netbox 的 dcim 可以將站點、區域、租戶、機櫃、裝置等很好的管理起來,並且這幾項元素之間可以產生關聯關係,能夠透過其中一個,找到其他的,例如透過站點看到有多少機櫃或裝置可以在每個裝置建立介面,然後連線起來,可以追蹤線纜的連線關係
-
IPAMIP 地址管理功能,需要先定義字首列表,會自動組成父子的關係,例如 16 位的會自動包含 24 位的地址段
推薦使用 docker-compose 部署,比較簡單方便些
可以在 netbox-docker 專案的 readme 中找到安裝方式,這裡將其列出
gitclone -b release https://github.com/netbox-community/netbox-docker.git
cdnetbox-docker
teedocker-compose.override.yml <<EOF
services:
netbox:
ports:
8000:8080
EOF
dockercompose pull
dockercompose up
如上所示,安裝完成後會偵聽 8000 埠
使用
docker compose exec netbox /opt/netbox/
netbox/manage.py createsuperuser
命令建立超級管理員
建立成功後,可透過 http://ip:8000 埠訪問
強烈推薦使用 API 建立裝置,而不是透過 Web 端新增,雖然 netbox 能夠匯出資料,但是不方便將所有資料批次匯出,而且再匯入也沒那麼方便。
有些資訊,例如伺服器的 CPU、記憶體、硬碟等資訊,可以透過程式碼獲取,並寫入到 netbox,這樣就保證了資料的準確性,更新的及時性
可以透過定義 toml 格式的檔案,將配置都寫到 toml 內,用 Python 讀取寫入到 Mongo 再使用 netbox 的 Python 模組寫入到 netbox
定義租戶
[[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
[ ]]
"一期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"}
定義堆疊組
[ ]]
"堆疊01" = { name = "堆疊01"}
定義 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
[ ]]
"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
[ ]]
"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" }}
在使用 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'])
regions_value['parent'] = parent_id
nb.dcim.regions.create(**regions_value)
同樣的,cables 也可以這麼做
netbox 的優點如下
-
提供了一個靈活且高度可定製的資料模型,支援管理裝置、IP 地址、機架等多個基礎設施元素,且易於擴充套件
-
API 功能非常完善,幾乎可以做所有的 Web 能操作的配置
-
開源且免費
-
使用者頁面比較直觀,例如機櫃立面圖
-
IPAM 功能比較好用,可以跟蹤和管理 IP 地址空間,避免 IP 地址衝突
-
可以管理裝置埠與線纜,解決使用 Excel 表時無法管理埠表的問題
缺點如下
-
功能集中在基礎設施和網路相關的,如果已有其他的 CMDB,在使用上會有割裂的情況,需要做一定的開發
-
在大規模環境中,部署和維護 NetBox 可能比較複雜,特別是在高可用性或多叢集的場景下
總的來說,netbox 還是一個很強大的功能,適合網路工程師或基礎架構工程師進行機櫃、裝置、IP 地址、網路拓撲的管理,如果能對其進行深入開發,還是可以把資料中心的裝置理的很清楚的。
如有相關問題,請在文章後面給小編留言,小編安排作者第一時間和您聯絡,為您答疑解惑。
推薦閱讀


推薦影片