跳到主內容

LibreNMS && Oxidized 備份網管設備設定檔 - Ubuntu

  BUBU 之前有看到節省哥分享此服務,曾經試架設過一次,但是後來失敗,最近有看到這類的文章出現,因此再次架設此套件,目前架設已成功可以正常運行。

  這套網通設備可以讓管理人員不用這樣子定期去執行備份,可以這個套件定期將每個台網通設備可以進行備份,這一套還有另外一個優點就是可以與之前版本進行做比對,當設備有問題的時候可以立刻還原到上一版去。

2026.07.11 系統採用 Ubuntu 系統來做建議

運行環境


環境都是在 「Proxmox VE 」 虛擬系統上架設,都是以 「 LXC 」模式為主,除非有特殊狀況會告知使用 「 VM 」 模式

  • 系統環境: Ubuntu 22.04

安裝過程


安裝官方套件

  • Ubuntu 要先啟用以下套件
apt install software-properties-common -y && add-apt-repository universe
  • 安裝必要套件
apt install -y ruby ruby-dev libsqlite3-dev libssl-dev pkg-config cmake libssh2-1-dev libicu-dev zlib1g-dev g++ libyaml-dev libzstd-dev
  • 安裝服務套件
gem install oxidized
gem install oxidized-script oxidized-web
  • 設定服務使用者及密碼
adduser oxidized
  • 切換使用者
su - oxidized
  • 執行 oxidized 服務指令,系統會在該目錄產出一個隱藏目錄是 .config
oxidized
  • 確認是否有正常產出該目錄
ls -la
LibreNMS && Oxidized 設定

  • oxidized 設定檔 vim home/oxidized/.config/oxidized/config 修改前
---
username: username
password: password
model: junos
resolve_dns: true
interval: 3600
use_syslog: false
debug: false
threads: 30
timeout: 20
retries: 3
prompt: !ruby/regexp /^([\w.@-]+[#>]\s?)$/
rest: 127.0.0.1:8888
next_adds_job: false
vars: {}
groups: {}
models: {}
pid: "/root/.config/oxidized/pid"
crash:
  directory: "/root/.config/oxidized/crashes"
  hostnames: false
stats:
  history_size: 10
input:
  default: ssh, telnet
  debug: false
  ssh:
    secure: false
  ftp:
    passive: true
  utf8_encoded: true
output:
  default: file
source:
  default: csv
  csv:
    file: "/root/.config/oxidized/router.db"
    delimiter: !ruby/regexp /:/
    map:
      name: 0
      model: 1
    gpg: false
model_map:
  juniper: junos
  cisco: ios

修改後

---
# ===== 全域預設帳密(最低優先,fail-safe)=====
# [CHANGE] 官方認證優先序:全域 < model < group < group內model < node。
#          任何 group / model 有設定都會覆寫此處。
#          資安建議:頂層填一組「絕對登入不成功」的假帳密,
#          這樣萬一某設備漏設帳密,會明確失敗而非誤用共用帳密登入。
username: nologin
password: invalid_placeholder

# ===== 全域預設 model(fallback)=====
# [CHANGE] 請確認 LibreNMS 每台設備都有正確回傳 os,否則未帶出 model 者會 fallback 成 junos。
model: junos

resolve_dns: false
interval: 3600          # 單位為秒;設為 0 則啟動與之後皆不抓取
use_syslog: false
debug: false
threads: 30             # 建議約略等於或略低於實際設備數
timeout: 20             # 單一操作等待上限(秒)
timelimit: 300          # 整個抓取工作絕對時間上限(秒),一定會被強制執行
retries: 3
prompt: !ruby/regexp /^([\w.@-]+[#>]\s?)$/

# ===== oxidized-web:RESTful API 與網頁介面 =====
# [CHANGE] 原 rest: 語法已 deprecated,改用 extensions.oxidized-web。需 oxidized-web >= 0.16.0。
extensions:
  oxidized-web:
    load: true
    listen: 0.0.0.0
    port: 8888

next_adds_job: false
vars: {}

# ===== 依 model 設定帳密(同機型共用帳密時使用)=====
# [CHANGE] 適用「不分站點,同一機型共用同一組帳密」的情境。
#          若某機型登入只需密碼,username 可設為 nil。
models:
  fortios:
    username: fortiadmin
    password: forti_pass
    # vars:
    #   output_store_mode: on_significant   # 之後搭配 significant_changes 啟用,消除 Fortinet 假異動
  ios:
    username: ciscoadmin
    password: cisco_pass
  junos:
    username: junosadmin
    password: junos_pass
  routeros:
    username: admin
    password: mikrotik_pass
  unifi:
    username: ubnt
    password: ubnt_pass
  dlink:
    username: dlinkadmin
    password: dlink_pass

# ===== 依 group 設定帳密(同站點/群組共用帳密時使用)=====
# [CHANGE] 適用「同一站點內共用帳密」的情境。group 優先權高於 model,會覆寫上面 models 的設定。
#          前提:LibreNMS source map 有帶出 group 欄位(下方 source 已設)。
#          若無 per-group 需求,可整個註解掉,只靠 models 區塊。
groups:
  site_a:
    username: site_a_admin
    password: site_a_pass
  site_b:
    username: site_b_admin
    password: site_b_pass

  # ===== group + model 交叉(最細緻,multi-site 多機型)=====
  # [CHANGE] 適用「同群組內、不同機型要不同帳密」的情境,優先權最高(僅次於單一 node)。
  #          範例:site_c 站點內 fortios 與 ios 各用不同帳密。
  site_c:
    models:
      fortios:
        username: fortiadmin
        password: forti_pass_site_c
      ios:
        username: ciscoadmin
        password: cisco_pass_site_c

pid: "/home/oxidized/.config/oxidized/pid"

crash:
  directory: "/home/oxidized/.config/oxidized/crashes"
  hostnames: false

# ===== 輸入設定 =====
input:
  default: ssh, telnet    # 資安建議:無 telnet 必要設備時改為 `default: ssh`
  debug: false
  ssh:
    secure: false
  ftp:
    passive: true
  utf8_encoded: true

# ===== 輸出到 git(保留 git,LibreNMS diff 比對依賴 commit 歷史)=====
output:
  default: git
  git:
    user: "your name"
    email: [email protected]
    repo: "/home/oxidized/.config/oxidized/oxidized.git"

# ===== 來源:與 LibreNMS 連線 =====
# [CHANGE] 不帶 username/password 欄位,帳密完全由本 config 的 models/groups 決定。
#          務必保留 group,分層認證與 group 帳密都依賴它。
source:
  default: http
  debug: false
  http:
    url: https://librenms/api/v0/oxidized
    map:
      name: hostname
      model: os
      group: group
    headers:
      X-Auth-Token: '01582bf94c03104ecb7953dsadsadwed'

# ===== model 名稱對應 =====
model_map:
  juniper: junos
  cisco: ios
  fortigate: fortios
  mikrotik: routeros
  unifi: unifi
  dlink: dlink
  • 修改 LibreNMS 設定檔
# Oxidized configuration
$config['oxidized']['enabled']                  = TRUE;
$config['oxidized']['url']                      = 'http://oxidized 位置:8888';
$config['oxidized']['features']['versioning']   = true;
$config['oxidized']['group_support']            = false;
$config['oxidized']['default_group']            = 'false';
$config['oxidized']['reload_nodes']             = true;

#$config['oxidized']['maps']['group']['os'][] = array('match' => 'pfsense', 'group' => 'pfsense');
$config['oxidized']['ignore_os'] = array('ping', 'linux', 'generic');
  • 確認 oxidized 是否能正常連線到 librenms API 服務
curl -H 'X-Auth-Token: YOURAPITOKENHERE' https://librenms.org/api/v0/oxidized
設定 oxidized 服務檔

  • 設定檔位置 vim /etc/systemd/system/oxidized.service
# Put this file in /etc/systemd/system.
#
# To set OXIDIZED_HOME instead of the default,
# ~oxidized/.config/oxidized, uncomment (and modify as required) the
# "Environment" variable below so systemd sets the correct
# environment.

[Unit]
Description=Oxidized - Network Device Configuration Backup Tool
After=network-online.target multi-user.target
Wants=network-online.target

[Service]
ExecStart=/usr/local/bin/oxidized
User=oxidized
KillSignal=SIGKILL
#Environment="OXIDIZED_HOME=/etc/oxidized"
Restart=on-failure
RestartSec=300s

[Install]
WantedBy=multi-user.target
  • 啟動服務
sudo systemctl daemon-reload  && sudo systemctl enable --now oxidized.service
  • 確認服務執行狀態
sudo systemctl status oxidized.service
  • 再去 LibreNMS 上確認是否可以看到該網通設備的設定檔

librenms-Oxidized-01.png

  • 也可以去 Oxidized 頁面查看 http://oxidized 位置:8888

librenms-Oxidized-02.png

補充說明


  BUBU 因公司上有設備的帳密是不一樣,因此需要在設定檔裡做另外處理,提供兩種方式。

  • 在 oxidized 設定檔上做設定
source:
  default: http
  debug: false
  http:
    url: https://librenms/api/v0/oxidized
    map:
      name: hostname
      model: os
      group: group
      # 新增加以下兩個參數
      username: username
      password: password
    headers:
    # 這個由 LibreNMS 上的 API 介面產出來金鑰
      X-Auth-Token: '01582bf94c03104ecb7953dsadsadwed'
  • 在 LibreNMS 上做設定
$config['oxidized']['maps']['group']['os'][] = array('match' => 'fortios', 'group' => 'fortios');
$config['oxidized']['maps']['username']['os'][] = array('match' => 'fortios', 'username' => 'admin');
$config['oxidized']['maps']['password']['os'][] = array('match' => 'fortios', 'password' => 'PW_A');
  • 查到的範例
$config['oxidized']['ignore_os'] = array('linux','windows');
$config['oxidized']['ignore_types'] = array('server','power');
$config['oxidized']['maps']['group']['os'][] = array('match' => 'ios', 'group' => 'Cisco');
$config['oxidized']['maps']['group']['os'][] = array('match' => 'iosxe', 'group' => 'Cisco');
$config['oxidized']['maps']['group']['os'][] = array('match' => 'nxos', 'group' => 'Nexus');
$config['oxidized']['maps']['group']['os'][] = array('match' => 'procurve', 'group' => 'Aruba');
$config['oxidized']['maps']['group']['os'][] = array('match' => 'arista_eos', 'group' => 'Arista');

$config['oxidized']['maps']['username']['os'][] = array('match' => 'procurve', 'username' => 'admin');
$config['oxidized']['maps']['password']['os'][] = array('match' => 'procurve', 'password' => 'PW_A');
$config['oxidized']['maps']['username']['os'][] = array('match' => 'arista_eos', 'username' => 'admin');
$config['oxidized']['maps']['password']['os'][] = array('match' => 'arista_eos', 'password' => 'PW_B');
$config['oxidized']['maps']['username']['os'][] = array('regex' => '/ios|nxos|iosxe/', 'username' => 'oxidized');
$config['oxidized']['maps']['password']['os'][] = array('regex' => '/ios|nxos|iosxe/', 'password' => 'PW_Z');
  • 在 oxidized 設定檔上面 vim /home/oxidized/.config/oxidized/config 最後面新增加
models:
  fortios:
     username: admin
     password: PW_A
參考相關網頁

備註


  BUBU 最近在公司發現到在 LibreNMS 上面無法正常查看網通設備的設定檔,那也找到一些相關的資訊直都沒有找到正確答案,後來跟社群裡節省哥請教後查看 Log 檔後,原因是出在 php 的記憶體預設只有 128M 那調整到 512M 就可以正常顯示了。

  • 調整 php.ini 檔 vim /etc/php/8.0/fpm/php.ini
# 調整前
; 記憶體用量上限
memory_limit = 128M

# 調整後
; 記憶體用量上限
memory_limit = 512M



參考相關網頁