netbox介紹和自動化管理配置

新鈦雲服已累計為您分享826篇技術乾貨
01
概 覽
NetBox 是一個開源的 IP 地址管理(IPAM)和資料中心基礎設施管理(DCIM)工具,廣泛用於管理和跟蹤企業網路的裝置、連線、IP 地址、虛擬化資源等。它由 DigitalOcean 開發並開源,目的是提供一個集中化的平臺來管理網路基礎設施,幫助網路管理員、系統管理員和基礎設施工程師提高工作效率。
02
主要功能
  • DCIM (資料中心基礎設施管理)
    netbox 的 dcim 可以將站點、區域、租戶、機櫃、裝置等很好的管理起來,並且這幾項元素之間可以產生關聯關係,能夠透過其中一個,找到其他的,例如透過站點看到有多少機櫃或裝置
    可以在每個裝置建立介面,然後連線起來,可以追蹤線纜的連線關係
  • IPAM
    IP 地址管理功能,需要先定義字首列表,會自動組成父子的關係,例如 16 位的會自動包含 24 位的地址段
03
部 署
推薦使用 docker-compose 部署,比較簡單方便些
可以在 netbox-docker 專案的 readme 中找到安裝方式,這裡將其列出
gitclone -b release https://github.com/netbox-community/netbox-docker.gitcdnetbox-dockerteedocker-compose.override.yml <<EOFservices:netbox:ports:-8000:8080EOFdockercompose pulldockercompose 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]]# huaweiCE6820-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 osimport pynetboximport tomlconfig = 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").idsites['id'] = data_idnb.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_idnb.dcim.regions.create(**regions_value)
同樣的,cables 也可以這麼做
05
數字科技峰會
netbox 的優點如下
  1. 提供了一個靈活且高度可定製的資料模型,支援管理裝置、IP 地址、機架等多個基礎設施元素,且易於擴充套件
  2. API 功能非常完善,幾乎可以做所有的 Web 能操作的配置
  3. 開源且免費
  4. 使用者頁面比較直觀,例如機櫃立面圖
  5. IPAM 功能比較好用,可以跟蹤和管理 IP 地址空間,避免 IP 地址衝突
  6. 可以管理裝置埠與線纜,解決使用 Excel 表時無法管理埠表的問題
缺點如下
  1. 功能集中在基礎設施和網路相關的,如果已有其他的 CMDB,在使用上會有割裂的情況,需要做一定的開發
  2. 在大規模環境中,部署和維護 NetBox 可能比較複雜,特別是在高可用性或多叢集的場景下
總的來說,netbox 還是一個很強大的功能,適合網路工程師或基礎架構工程師進行機櫃、裝置、IP 地址、網路拓撲的管理,如果能對其進行深入開發,還是可以把資料中心的裝置理的很清楚的。
如有相關問題,請在文章後面給小編留言,小編安排作者第一時間和您聯絡,為您答疑解惑。
    推薦閱讀   

    推薦影片    

相關文章