模拟实现NetDevOps全生命周期自动化网络运维
本报告基于华为eNSP模拟器构建了一套NetDevOps全生命周期网络自动化平台。项目采用三层架构设计,通过Python(Netmiko)实现设备批量配置下发,并引入Docker容器化技术搭建运维平台。系统包含三个核心阶段:Day0完成网络拓扑设计;Day1通过Python脚本实现OSPF、MSTP、VRRP等复杂业务的自动化部署,并解决eNSP老旧加密算法兼容性问题;Day2构建包含Portai
目录
4.3.3 集中式日志审计 (Rsyslog + Frontail)
0. 前言与声明
由于本人水平与能力有限,本报告仅用于部分 NetDevOps 的学习、研究与验证。
项目实验环境基于华为 eNSP 模拟器搭建。受限于模拟器底层架构及设备镜像版本,部分功能实现与现网真实设备存在差异,具体说明如下:
-
设备兼容性与安全性:eNSP 模拟的 AR 系列路由器 SSH 服务默认加密算法较旧。为兼容现代 SSH 客户端(如 Windows OpenSSH, Paramiko),必须强制将 RSA 密钥长度配置为 2048 位(
rsa local-key-pair create),这与部分现网设备默认配置可能不同。 -
自动化数据源:在 Day 1 自动化部署阶段,本项目的 Python 脚本为简化逻辑,采用静态字典(Static Dictionary)存储设备资产信息(IP、账号、角色)。在实际生产环境中,通常会通过读取 Excel/CSV 文件或对接 CMDB(配置管理数据库)来动态获取海量资产数据。
-
功能完整性:模拟器环境可能存在报文转发性能限制或特定特性支持不全的情况,不代表真实业务场景下的最终性能指标。
1. 项目概述
随着企业网络规模的日益复杂化,传统基于命令行(CLI)的手工运维模式已难以满足高效、稳定的业务需求,且存在人为配置错误风险高、故障响应滞后等痛点。本项目旨在构建一套基于 NetDevOps 理念的全生命周期网络自动化平台。
项目遵循网络生命周期的三个核心阶段进行设计与实现:
-
Day 0(设计与规划):利用 eNSP 搭建高可用企业网络拓扑,完成底层路由与交换架构的设计。
-
Day 1(部署与开局):使用 Python (Netmiko) 开发自动化脚本,实现网络设备的批量配置下发与业务上线,大幅提升部署效率。
-
Day 2(监控与运维):引入 Docker 容器化技术,构建集监控、日志、备份于一体的 Linux 运维平台,保障网络的长期稳定运行。
通过这一闭环体系,本项目成功实现了从底层架构设计到上层自动化运维的完整交付。
2. Day 0:基于ensp的网络架构设计与仿真

注意“Linux-service”内部的ip要和虚拟机里面的ip一致(虚拟机要联网,在网络适配器里面调整成nat模式)。要添加端口映射表的双向通道
2.1 拓扑架构设计
本项目采用经典的三层网络架构(核心层-汇聚层-接入层),并在出口区与管理区进行了专门设计。
-
出口区 (Edge): 部署 AR2240 路由器 (
Edge-Router),负责 NAT 转换与外网互联。 -
核心区 (Core): 部署 S5700 交换机 (
Core-SW) 作为核心骨干,负责全网高速转发与流量镜像。 -
管理区 (Mgt): 部署 AR3260 路由器 (
Mgt-Router) 作为运维网关,连接 Docker 运维平台与核心网络。 -
汇聚层 (Agg): 部署两台 S5700 (
Agg-SW1/2) 组建 VRRP+MSTP 高可用网关。 -
接入层 (Acc): 部署四台 S3700 (
Acc-SW1~4) 连接终端 PC。
2.2 全局网络规划
为确保网络的健壮性与可扩展性,本项目制定了以下全局规划标准:
-
路由协议: 全网运行 OSPF 进程 1。
-
路由区域设计:
-
Area 0 (骨干区域): 承载
Edge <-> Core <-> Agg之间的核心数据转发。 -
Area 1 (业务区域): 承载
Agg <-> Acc之间的终端用户接入路由。 -
Area 2 (管理区域): 承载
Core <-> Mgt之间的运维管理流量。
-
-
高可用性: 汇聚层采用 VRRP + MSTP 技术,实现双机热备与流量负载分担。
-
IP 地址规划:
-
业务网段:
192.168.1.0/24~192.168.4.0/24 -
管理网段:
192.168.78.0/24(映射物理机网段) -
互联平面:
-
Core-Edge 互联:
172.16.1.0/30 -
Core-Mgt 互联:
10.0.99.0/30
-
-
管理平面: 全网设备 Loopback/Vlanif 1 使用
10.0.0.x/24
-
2.3 设备详细配置表
2.3.1 边缘与出口层
|
设备名称 |
角色与功能 |
OSPF 区域 |
关键接口配置 |
特殊配置 |
|---|---|---|---|---|
|
Edge-Router |
内网出口网关,执行 NAT 转换,连接 ISP。 |
Area 0 |
GE0/0/0: GE0/0/1: GE0/0/2: |
NAT Outbound: GE0/0/1 ACL 2000: 允许源 192.168.0.0/16, 10.0.0.0/8 NAT 地址池: 200.1.1.10 - 200.1.1.20 |
|
AR2 (ISP) |
模拟互联网运营商。 |
- |
GE0/0/0: GE0/0/1: |
模拟公网路由 |
2.3.2 核心与管理层
|
设备名称 |
角色与功能 |
OSPF 区域 |
关键接口配置 |
特殊配置 |
|---|---|---|---|---|
|
Core-SW |
网络骨干枢纽,全网流量镜像点。 |
Area 0 (上/下行) Area 2 (管理侧) |
Vlanif 800: Vlanif 900: GE0/0/1: Access VLAN 800 (Edge) GE0/0/2-3: Trunk (Agg) |
全网流量镜像: 将 GE0/0/1~3 的流量镜像至 GE0/0/4 (观察端口),输出到 Linux-Service。 |
|
Mgt-Router |
运维入口,连接物理机 Cloud。 |
Area 2 |
GE0/0/0: GE0/0/1: |
静态路由指向 Core-SW 以打通内网。 |
2.3.3 汇聚层
此层配置了 VRRP 作为 PC 的网关,并配置 MSTP 防止二层环路。
|
设备 |
MSTP 角色 |
VRRP Master (VIP .254) |
VRRP Backup |
互联接口 |
|---|---|---|---|---|
|
Agg-SW1 |
Instance 1 主根 Instance 2 备根 |
VLAN 10 ( VLAN 20 ( |
VLAN 30 ( VLAN 40 ( |
GE0/0/4: 心跳线 (Agg-SW2) 下行: Trunk 连 Acc |
|
Agg-SW2 |
Instance 2 主根 Instance 1 备根 |
VLAN 30 ( VLAN 40 ( |
VLAN 10 ( VLAN 20 ( |
GE0/0/4: 心跳线 (Agg-SW1) 下行: Trunk 连 Acc |
2.3.4 接入层
接入交换机运行 OSPF Area 1 实现管理互通,并作为 DHCP 服务器给 PC 分配 IP。
|
设备 |
服务 VLAN |
管理 IP (Vlanif) |
DHCP 地址池 |
网关指向 (Agg VRRP) |
|---|---|---|---|---|
|
Acc-SW1 |
VLAN 10 |
|
|
|
|
Acc-SW2 |
VLAN 20 |
|
|
|
|
Acc-SW3 |
VLAN 30 |
|
|
|
|
Acc-SW4 |
VLAN 40 |
|
|
|
2.3.5 管理平面 IP 地址表 (SSH连接)
此表为 Day 1 自动化部署脚本 (main.py) 和 Day 2 运维平台 (Oxidized, Uptime Kuma) 的核心资产依据。
|
设备名称 (Device) |
角色 |
SSH 连接 IP (Management IP) |
备注 |
|---|---|---|---|
|
Mgt-Router |
运维网关 |
|
物理机直连入口 |
|
Edge-Router |
出口网关 |
|
需配置静态路由可达 |
|
Core-SW |
核心交换 |
|
需配置静态路由可达 |
|
Agg-SW1 |
汇聚 1 |
|
Vlanif 1 管理地址 |
|
Agg-SW2 |
汇聚 2 |
|
Vlanif 1 管理地址 |
|
Acc-SW1 |
接入 1 |
|
Vlanif 1 管理地址 |
|
Acc-SW2 |
接入 2 |
|
Vlanif 1 管理地址 |
|
Acc-SW3 |
接入 3 |
|
Vlanif 1 管理地址 |
|
Acc-SW4 |
接入 4 |
|
Vlanif 1 管理地址 |
2.4 Day 0 初始化配置
定义:指设备“上架”后的最基本配置,核心目标是打通管理通道,使设备可达。
本项目实践:在 eNSP 命令行中手动完成。针对 AR 路由器与交换机 SSH 配置的差异,制定了标准化的初始化模板:
ensp内部分配置脚本如下
Mgt-router:
system-view
sysname Mgt-Router
# 连云 g0/0/0 (192.168.78.200)
interface g0/0/0
ip address 192.168.78.200 24
undo shutdown
# 连 Core-SW g0/0/4 (10.0.99.1)
interface g0/0/1
ip address 10.0.99.1 30
undo shutdown
quit
# 管理路由:去往 10 网段和 172 网段全部扔给核心
ip route-static 10.0.0.0 8 10.0.99.2
ip route-static 172.16.1.0 30 10.0.99.2
# SSH 基础 (AR 路由器无需在系统视图绑定 service-type)
rsa local-key-pair create
2048
aaa
local-user admin password cipher password123
local-user admin privilege level 15
local-user admin service-type ssh
quit
ssh user admin authentication-type password
stelnet server enable
user-interface vty 0 4
authentication-mode aaa
protocol inbound all
Core-SW:
system-view
sysname Core-SW
vlan batch 800 900
# 管理 IP 与互联
interface Vlanif 1
ip address 10.0.0.1 24
interface g0/0/4
port link-type access
port default vlan 900
interface Vlanif 900
ip address 10.0.99.2 30
interface Vlanif 800
ip address 172.16.1.2 30
interface g0/0/1
port link-type access
port default vlan 800
# 下行 Trunk
interface g0/0/2
port link-type trunk
port trunk allow-pass vlan all
interface GigabitEthernet 0/0/3
port link-type trunk
port trunk allow-pass vlan all
quit
# --- 流量镜像配置:Linux-service 捕获点 ---
observe-port 1 interface GigabitEthernet 0/0/4
interface GigabitEthernet 0/0/1
port-mirroring to observe-port 1 both
interface GigabitEthernet 0/0/2
port-mirroring to observe-port 1 both
interface GigabitEthernet 0/0/3
port-mirroring to observe-port 1 both
quit
ip route-static 192.168.78.0 24 10.0.99.1
# SSH 基础
rsa local-key-pair create
2048
aaa
local-user admin password cipher password123
local-user admin privilege level 15
local-user admin service-type ssh
quit
ssh user admin authentication-type password
ssh user admin service-type stelnet
stelnet server enable
user-interface vty 0 4
authentication-mode aaa
protocol inbound all
注:针对核心交换机 Core-SW,额外配置了 observe-port 观察端口,为后续 Day 1 的全流量镜像分析预留物理接口。
Edge-Router:
system-view
sysname Edge-Router
# 三向接口激活
interface g0/0/2
ip address 172.16.1.1 30
undo shutdown
interface g0/0/1
ip address 200.1.1.1 24
undo shutdown
interface g0/0/0
ip address 192.168.0.254 24
undo shutdown
quit
ip route-static 10.0.0.0 8 172.16.1.2
ip route-static 192.168.78.0 24 172.16.1.2
# SSH 环境
rsa local-key-pair create
2048
aaa
local-user admin password cipher password123
local-user admin privilege level 15
local-user admin service-type ssh
quit
ssh user admin authentication-type password
stelnet server enable
user-interface vty 0 4
authentication-mode aaa
protocol inbound all
Agg-SW1:
system-view
sysname Agg-SW1
interface Vlanif 1
ip address 10.0.0.11 24
quit
ip route-static 0.0.0.0 0 10.0.0.1
# SSH 环境
rsa local-key-pair create
2048
aaa
local-user admin password cipher password123
local-user admin privilege level 15
local-user admin service-type ssh
quit
ssh user admin authentication-type password
ssh user admin service-type stelnet
stelnet server enable
user-interface vty 0 4
authentication-mode aaa
protocol inbound all
Acc-SW1:
system-view
sysname Acc-SW1
interface Vlanif 1
ip address 10.0.0.21 24
quit
ip route-static 0.0.0.0 0 10.0.0.1
rsa local-key-pair create
2048
aaa
local-user admin password cipher password123
local-user admin privilege level 15
local-user admin service-type ssh
quit
ssh user admin authentication-type password
ssh user admin service-type stelnet
stelnet server enable
user-interface vty 0 4
authentication-mode aaa
protocol inbound all
外网与隔离区:
# --- AR2 ---
system-view
sysname AR2
interface g0/0/0
ip address 200.1.1.2 24
undo shutdown
interface g0/0/1
ip address 201.1.1.1 24
undo shutdown
quit
ip route-static 10.0.0.0 8 200.1.1.1
ip route-static 192.168.0.0 16 200.1.1.1
ip route-static 192.168.78.0 24 200.1.1.1
# --- LSW8 ---
system-view
sysname LSW8
vlan batch 100
interface g0/0/1
port link-type access
port default vlan 100
interface g0/0/2
port link-type access
port default vlan 100
# --- LSW9 ---
system-view
sysname LSW9
vlan batch 1
interface GigabitEthernet 0/0/1
port link-type access
port default vlan 1
interface GigabitEthernet 0/0/2
port link-type access
port default vlan 1
2.5 逻辑数据流向总结
-
PC 上网流向 (业务流): PC -> Acc-SW -> Agg-SW (VRRP Gateway) -> Core-SW -> Edge-Router (NAT) -> ISP
-
运维管理流向 (管理流): 物理机 (192.168.78.x) -> Mgt-Router -> Core-SW -> Agg-SW -> Acc-SW -> 目标设备管理 IP
2.6 主机验证
2.6.1 添加临时静态路由表
进入cmd管理员模式输入以下路由表(重启电脑失效)
route add 10.0.0.0 mask 255.0.0.0 192.168.78.200
route add 172.16.1.0 mask 255.255.255.252 192.168.78.200

2.6.2 ping测试
测试 Mgt/Core/Edge:
ping 192.168.78.200 & ping 10.0.99.2 & ping 172.16.1.1
测试汇聚 Agg1-2:
ping 10.0.0.11 & ping 10.0.0.12
测试接入 Acc1-4:
ping 10.0.0.21 & ping 10.0.0.22 & ping 10.0.0.23 & ping 10.0.0.24

2.6.3 ssh测试
由于ensp加密算法老旧,故需要强制降低电脑的安全标准,去迁就ensp老设备
验证核心 Core-SW
ssh -o KexAlgorithms=+diffie-hellman-group1-sha1 -o HostKeyAlgorithms=+ssh-rsa -o Ciphers=+aes128-cbc -o MACs=+hmac-sha1 admin@10.0.99.2
验证出口路由器 Edge-Router
ssh -o KexAlgorithms=+diffie-hellman-group1-sha1 -o HostKeyAlgorithms=+ssh-rsa -o Ciphers=+aes128-cbc -o MACs=+hmac-sha1 admin@172.16.1.1
验证接入 SW1 Acc-SW1
ssh -o KexAlgorithms=+diffie-hellman-group1-sha1 -o HostKeyAlgorithms=+ssh-rsa -o Ciphers=+aes128-cbc -o MACs=+hmac-sha1 admin@10.0.0.21
其余ssh连接命令类似,修改末尾ip即可

3. Day 1:基于 Python 的自动化部署
3.1 自动化脚本架构设计
本项目摒弃了传统的“逐台 CLI 配置”模式,自主开发了一套基于 Python Netmiko 库的自动化部署系统。系统采用模块化设计,主要包含以下核心组件:
-
main.py:-
并发控制策略:针对 eNSP 模拟器性能特性,实现了差异化的执行策略。
-
串行模式: 用于核心层与路由器设备,防止 CPU 过载导致 SSH 断连。
-
并发模式 : 利用
threading多线程技术,对汇聚层和接入层交换机进行并发配置,大幅缩短部署时间。
-
-
兼容性补丁 : 针对 paramiko 库默认禁用旧版加密算法的问题,在代码底层强制开启
diffie-hellman-group1-sha1等算法,解决了 eNSP 设备无法连接的难题。
-
import threading
import time
import paramiko
from netmiko import ConnectHandler
# 导入配置文件
from config_templates import CONFIG_TEMPLATES
# ========================================================
# 兼容性补丁
# ========================================================
def enable_legacy_ssh_algos():
"""针对 eNSP 华为设备老旧算法的底层强制修复。"""
paramiko.Transport._preferred_kex = (
"diffie-hellman-group1-sha1",
"diffie-hellman-group14-sha1",
"diffie-hellman-group-exchange-sha1"
)
paramiko.Transport._preferred_keys = ("ssh-rsa",)
paramiko.Transport._preferred_ciphers = ("aes128-cbc", "3des-cbc", "aes128-ctr")
paramiko.Transport._preferred_macs = ("hmac-sha1", "hmac-md5")
enable_legacy_ssh_algos()
# ========================================================
# 1. 资产清单
# ========================================================
USERNAME = 'admin'
PASSWORD = 'password123'
# 1. 核心与网关层 (路由器性能差,必须串行单一配置)
GROUP_CORE = [
{'host': '192.168.78.200', 'role': 'Mgt-Router'},
{'host': '172.16.1.1', 'role': 'Edge-Router'},
{'host': '10.0.99.2', 'role': 'Core-SW'},
]
# 2. 汇聚层 (交换机性能好,可并发)
GROUP_AGG = [
{'host': '10.0.0.11', 'role': 'Agg-SW1'},
{'host': '10.0.0.12', 'role': 'Agg-SW2'},
]
# 3. 接入层 (交换机性能好,可并发)
GROUP_ACC = [
{'host': '10.0.0.21', 'role': 'Acc-SW1'},
{'host': '10.0.0.22', 'role': 'Acc-SW2'},
{'host': '10.0.0.23', 'role': 'Acc-SW3'},
{'host': '10.0.0.24', 'role': 'Acc-SW4'},
]
# ========================================================
# 2. 部署执行引擎
# ========================================================
def deploy_task(device_info):
role = device_info['role']
host = device_info['host']
# 针对 eNSP 路由器 (AR) 增加额外的延迟,防止 CPU 100% 导致断连
delay_factor = 8 if 'Router' in role else 4
connection_params = {
'device_type': 'huawei',
'host': host,
'username': USERNAME,
'password': PASSWORD,
'global_delay_factor': delay_factor,
'timeout': 180,
}
# 重试机制
max_retries = 3
for attempt in range(max_retries):
try:
print(f"[正在连接] {role} ({host}) (Attempt {attempt + 1}/{max_retries})...")
with ConnectHandler(**connection_params) as conn:
conn.enable()
# 屏蔽日志干扰
conn.send_command("undo info-center enable")
if role in CONFIG_TEMPLATES:
print(f"[部署] {role} 开始...")
output = conn.send_config_set(CONFIG_TEMPLATES[role], cmd_verify=False, read_timeout=120)
if "Error" in output:
print(f" {role} 遇到部分命令报错 (可能是重复配置,正常现象)")
print(f"[配置保存] {role}...")
conn.send_command_timing("save\ny")
print(f"[成功] {role}")
else:
print(f"[跳过] {role} 未定义业务配置。")
# 成功执行后跳出重试循环
break
except Exception as e:
err_msg = str(e)
print(f"[失败] {role}: {err_msg[:100]}...")
# 如果是 Socket closed 或 EOF,等待后重试
if "Socket is closed" in err_msg or "End of file" in err_msg or "10054" in err_msg:
if attempt < max_retries - 1:
wait_time = 5 * (attempt + 1)
print(f" 连接意外中断,{wait_time}秒后自动重连...")
time.sleep(wait_time)
else:
print(f" {role} 重试次数耗尽,放弃。")
else:
# 其他错误直接退出
break
def run_batch_concurrent(devices, batch_name):
"""并发执行 (适用于交换机)"""
print(f"\n[启动批次-并发] {batch_name}")
threads = []
for device in devices:
t = threading.Thread(target=deploy_task, args=(device,))
threads.append(t)
t.start()
time.sleep(2)
for t in threads:
t.join()
print(f"[批次完成] {batch_name}")
def run_batch_sequential(devices, batch_name):
"""串行执行 (适用于路由器,防崩)"""
print(f"\n[启动批次-串行] {batch_name} (慢速稳定模式)")
for device in devices:
deploy_task(device)
time.sleep(3) # 设备间歇
print(f"[批次完成] {batch_name}")
def run_all():
print("=" * 60)
print("华为全网业务自动化部署系统")
print("=" * 60)
# 1. 第一阶段:核心骨干 (路由器必须串行,否则 eNSP 必崩)
run_batch_sequential(GROUP_CORE, "Phase 1: 核心与网关层")
# 2. 第二阶段:汇聚层 (交换机可并发)
run_batch_concurrent(GROUP_AGG, "Phase 2: 汇聚层")
# 等待收敛
print("\n 正在等待全网路由收敛 (15秒)...")
time.sleep(15)
# 3. 第三阶段:接入层
run_batch_concurrent(GROUP_ACC, "Phase 3: 接入层")
print("\n" + "=" * 60)
print("自动化业务部署执行完毕!")
print("=" * 60)
if __name__ == "__main__":
run_all()
-
config_templates.py(配置数据):-
实现了逻辑与数据分离。将 OSPF、MSTP、VRRP 等复杂的业务命令封装为字典结构 (
CONFIG_TEMPLATES),便于后续维护与复用。自动下发配置之前可删除之前非必要配置,避免出错
-
# ========================================================
# 核心业务逻辑配置模板 (字典数据)
# ========================================================
# 这里的命令用于:配置接口 IP、OSPF、NAT、MSTP、VRRP 等业务功能
CONFIG_TEMPLATES = {
# --- 出口路由器 ---
'Edge-Router': [
'interface g0/0/0', 'ip address 192.168.0.254 24', 'undo shutdown', 'quit',
'interface g0/0/1', 'ip address 200.1.1.1 24', 'undo shutdown', 'quit',
# NAT 配置
'nat address-group 1 200.1.1.10 200.1.1.20',
'acl 2000',
'rule 5 permit source 192.168.0.0 0.0.255.255',
'rule 10 permit source 10.0.0.0 0.255.255.255',
'quit',
'interface g0/0/1',
'nat outbound 2000 address-group 1',
'quit',
# OSPF
'ip route-static 0.0.0.0 0.0.0.0 200.1.1.2',
'ospf 1 router-id 1.1.1.1',
'import-route static',
'import-route direct',
'area 0',
' network 172.16.1.0 0.0.0.3',
'quit',
'quit'
],
# --- 核心交换机 ---
'Core-SW': [
'undo ospf 1',
'undo observe-port 1',
'interface g0/0/1', 'undo port-mirroring to observe-port 1 both', 'quit',
'interface g0/0/2', 'undo port-mirroring to observe-port 1 both', 'quit',
'interface g0/0/3', 'undo port-mirroring to observe-port 1 both', 'quit',
# === 开始新配置 ===
'vlan batch 10 20 30 40 800 900',
'stp mode mstp', 'stp region-configuration', 'region-name HWEI', 'revision-level 1',
' instance 1 vlan 10 20', ' instance 2 vlan 30 40', ' active region-configuration', 'quit',
'interface g0/0/2', 'port link-type trunk', 'port trunk allow-pass vlan all', 'quit',
'interface g0/0/3', 'port link-type trunk', 'port trunk allow-pass vlan all', 'quit',
# 流量镜像
'observe-port 1 interface GigabitEthernet 0/0/4',
'interface GigabitEthernet 0/0/1', 'port-mirroring to observe-port 1 both',
'interface GigabitEthernet 0/0/2', 'port-mirroring to observe-port 1 both',
'interface GigabitEthernet 0/0/3', 'port-mirroring to observe-port 1 both',
# OSPF
'ospf 1 router-id 5.5.5.5',
'import-route direct',
'area 0',
' network 10.0.0.0 0.255.255.255',
' network 172.16.1.0 0.0.0.3',
'quit',
'area 2',
' network 10.0.99.0 0.0.0.3',
'quit',
'quit'
],
# --- 汇聚 SW1 ---
'Agg-SW1': [
'undo ospf 1',
'undo interface Vlanif 10',
'undo interface Vlanif 20',
'undo interface Vlanif 30',
'undo interface Vlanif 40',
# === 开始新配置 ===
'vlan batch 10 20 30 40',
'stp region-configuration', 'region-name HWEI', 'revision-level 1',
' instance 1 vlan 10 20', ' instance 2 vlan 30 40', ' active region-configuration', 'quit',
'stp instance 1 root primary', 'stp instance 2 root secondary',
'interface g0/0/1', 'port link-type trunk', 'port trunk allow-pass vlan all', 'quit',
'interface g0/0/2', 'port link-type trunk', 'port trunk allow-pass vlan all', 'quit',
'interface g0/0/3', 'port link-type trunk', 'port trunk allow-pass vlan all', 'quit',
'interface g0/0/4', 'port link-type trunk', 'port trunk allow-pass vlan all', 'quit',
'interface g0/0/5', 'port link-type trunk', 'port trunk allow-pass vlan all', 'quit',
'interface g0/0/6', 'port link-type trunk', 'port trunk allow-pass vlan all', 'quit',
# VRRP & IP (.241)
'interface Vlanif10', 'ip address 192.168.1.241 24', 'vrrp vrid 10 virtual-ip 192.168.1.254',
'vrrp vrid 10 priority 120', 'quit',
'interface Vlanif20', 'ip address 192.168.2.241 24', 'vrrp vrid 20 virtual-ip 192.168.2.254',
'vrrp vrid 20 priority 120', 'quit',
'interface Vlanif30', 'ip address 192.168.3.241 24', 'vrrp vrid 30 virtual-ip 192.168.3.254', 'quit',
'interface Vlanif40', 'ip address 192.168.4.241 24', 'vrrp vrid 40 virtual-ip 192.168.4.254', 'quit',
# OSPF
'ospf 1',
'area 0', 'network 10.0.0.0 0.0.0.255', 'quit',
'area 1',
' network 192.168.1.0 0.0.0.255',
' network 192.168.2.0 0.0.0.255',
' network 192.168.3.0 0.0.0.255',
' network 192.168.4.0 0.0.0.255',
'quit',
'quit'
],
# --- 汇聚 SW2 ---
'Agg-SW2': [
'undo ospf 1',
'undo interface Vlanif 10',
'undo interface Vlanif 20',
'undo interface Vlanif 30',
'undo interface Vlanif 40',
# === 开始新配置 ===
'vlan batch 10 20 30 40',
'stp region-configuration', 'region-name HWEI', 'revision-level 1',
' instance 1 vlan 10 20', ' instance 2 vlan 30 40', ' active region-configuration', 'quit',
'stp instance 1 root secondary', 'stp instance 2 root primary',
'interface g0/0/1', 'port link-type trunk', 'port trunk allow-pass vlan all', 'quit',
'interface g0/0/2', 'port link-type trunk', 'port trunk allow-pass vlan all', 'quit',
'interface g0/0/3', 'port link-type trunk', 'port trunk allow-pass vlan all', 'quit',
'interface g0/0/4', 'port link-type trunk', 'port trunk allow-pass vlan all', 'quit',
'interface g0/0/5', 'port link-type trunk', 'port trunk allow-pass vlan all', 'quit',
'interface g0/0/6', 'port link-type trunk', 'port trunk allow-pass vlan all', 'quit',
# VRRP & IP (.242)
'interface Vlanif10', 'ip address 192.168.1.242 24', 'vrrp vrid 10 virtual-ip 192.168.1.254', 'quit',
'interface Vlanif20', 'ip address 192.168.2.242 24', 'vrrp vrid 20 virtual-ip 192.168.2.254', 'quit',
'interface Vlanif30', 'ip address 192.168.3.242 24', 'vrrp vrid 30 virtual-ip 192.168.3.254',
'vrrp vrid 30 priority 120', 'quit',
'interface Vlanif40', 'ip address 192.168.4.242 24', 'vrrp vrid 40 virtual-ip 192.168.4.254',
'vrrp vrid 40 priority 120', 'quit',
# OSPF
'ospf 1',
'area 0', 'network 10.0.0.0 0.0.0.255', 'quit',
'area 1',
' network 192.168.1.0 0.0.0.255',
' network 192.168.2.0 0.0.0.255',
' network 192.168.3.0 0.0.0.255',
' network 192.168.4.0 0.0.0.255',
'quit',
'quit'
],
# --- 接入层公共模板 ---
'Acc-SW1': [
'undo dhcp enable',
'undo ospf 1',
'undo ip pool p10',
'undo interface Vlanif 10',
# === 开始新配置 ===
'vlan batch 10', 'dhcp enable',
'stp mode mstp', 'stp region-configuration', 'region-name HWEI', 'revision-level 1',
' instance 1 vlan 10 20', ' instance 2 vlan 30 40', ' active region-configuration', 'quit',
# DHCP
'ip pool p10', 'network 192.168.1.0 mask 24', 'gateway-list 192.168.1.254', 'dns-list 8.8.8.8',
'excluded-ip-address 192.168.1.240 192.168.1.254', 'quit',
# Vlanif (.243)
'interface Vlanif 10', 'ip address 192.168.1.243 24', 'dhcp select global', 'quit',
'interface Ethernet0/0/3', 'port link-type access', 'port default vlan 10', 'stp edged-port enable', 'quit',
'interface Ethernet0/0/4', 'port link-type access', 'port default vlan 10', 'stp edged-port enable', 'quit',
'interface Ethernet0/0/1', 'port link-type trunk', 'port trunk allow-pass vlan all', 'quit',
'interface Ethernet0/0/2', 'port link-type trunk', 'port trunk allow-pass vlan all', 'quit',
'ospf 1', 'area 1', 'network 192.168.1.0 0.0.0.255', 'quit', 'quit'
],
'Acc-SW2': [
'undo dhcp enable', 'undo ospf 1', 'undo ip pool p20', 'undo interface Vlanif 20',
# === 开始新配置 ===
'vlan batch 20', 'dhcp enable',
'stp mode mstp', 'stp region-configuration', 'region-name HWEI', 'revision-level 1',
' instance 1 vlan 10 20', ' instance 2 vlan 30 40', ' active region-configuration', 'quit',
'ip pool p20', 'network 192.168.2.0 mask 24', 'gateway-list 192.168.2.254', 'dns-list 8.8.8.8',
'excluded-ip-address 192.168.2.240 192.168.2.254', 'quit',
'interface Vlanif 20', 'ip address 192.168.2.244 24', 'dhcp select global', 'quit',
'interface Ethernet0/0/3', 'port link-type access', 'port default vlan 20', 'stp edged-port enable', 'quit',
'interface Ethernet0/0/4', 'port link-type access', 'port default vlan 20', 'stp edged-port enable', 'quit',
'interface Ethernet0/0/1', 'port link-type trunk', 'port trunk allow-pass vlan all', 'quit',
'interface Ethernet0/0/2', 'port link-type trunk', 'port trunk allow-pass vlan all', 'quit',
'ospf 1', 'area 1', 'network 192.168.2.0 0.0.0.255', 'quit', 'quit'
],
'Acc-SW3': [
'undo dhcp enable', 'undo ospf 1', 'undo ip pool p30', 'undo interface Vlanif 30',
# === 开始新配置 ===
'vlan batch 30', 'dhcp enable',
'stp mode mstp', 'stp region-configuration', 'region-name HWEI', 'revision-level 1',
' instance 1 vlan 10 20', ' instance 2 vlan 30 40', ' active region-configuration', 'quit',
'ip pool p30', 'network 192.168.3.0 mask 24', 'gateway-list 192.168.3.254', 'dns-list 8.8.8.8',
'excluded-ip-address 192.168.3.240 192.168.3.254', 'quit',
'interface Vlanif 30', 'ip address 192.168.3.245 24', 'dhcp select global', 'quit',
'interface Ethernet0/0/3', 'port link-type access', 'port default vlan 30', 'stp edged-port enable', 'quit',
'interface Ethernet0/0/4', 'port link-type access', 'port default vlan 30', 'stp edged-port enable', 'quit',
'interface Ethernet0/0/1', 'port link-type trunk', 'port trunk allow-pass vlan all', 'quit',
'interface Ethernet0/0/2', 'port link-type trunk', 'port trunk allow-pass vlan all', 'quit',
'ospf 1', 'area 1', 'network 192.168.3.0 0.0.0.255', 'quit', 'quit'
],
'Acc-SW4': [
'undo dhcp enable', 'undo ospf 1', 'undo ip pool p40', 'undo interface Vlanif 40',
# === 开始新配置 ===
'vlan batch 40', 'dhcp enable',
'stp mode mstp', 'stp region-configuration', 'region-name HWEI', 'revision-level 1',
' instance 1 vlan 10 20', ' instance 2 vlan 30 40', ' active region-configuration', 'quit',
'ip pool p40', 'network 192.168.4.0 mask 24', 'gateway-list 192.168.4.254', 'dns-list 8.8.8.8',
'excluded-ip-address 192.168.4.240 192.168.4.254', 'quit',
'interface Vlanif 40', 'ip address 192.168.4.246 24', 'dhcp select global', 'quit',
'interface Ethernet0/0/3', 'port link-type access', 'port default vlan 40', 'stp edged-port enable', 'quit',
'interface Ethernet0/0/4', 'port link-type access', 'port default vlan 40', 'stp edged-port enable', 'quit',
'interface Ethernet0/0/1', 'port link-type trunk', 'port trunk allow-pass vlan all', 'quit',
'interface Ethernet0/0/2', 'port link-type trunk', 'port trunk allow-pass vlan all', 'quit',
'ospf 1', 'area 1', 'network 192.168.4.0 0.0.0.255', 'quit', 'quit'
],
# --- 管理路由器 ---
'Mgt-Router': [
'ospf 1',
'area 2',
' network 192.168.78.0 0.0.0.255',
' network 10.0.99.0 0.0.0.3',
'quit',
'quit'
]
}
3.2 Day 1 业务自动化下发详情
脚本执行后,全网设备将自动完成以下复杂业务的部署:
-
IGP 路由设计 (OSPF):
-
Area 0 (骨干区域): 覆盖 Edge-Router <-> Core-SW <-> Agg-SW,实现高速骨干互通。
-
Area 1 (业务区域): 覆盖汇聚与接入层,承载业务网段路由。
-
Area 2 (管理区域): 覆盖 Mgt-Router,隔离运维流量。
-
-
高可用二层设计 (MSTP + VRRP):
-
MSTP 域配置: 全网配置域名为
HWEI的 MSTP 域。 -
负载均衡:
-
Instance 1 (VLAN 10/20): Agg-SW1 为根桥,Agg-SW2 为备份。
-
Instance 2 (VLAN 30/40): Agg-SW2 为根桥,Agg-SW1 为备份。
-
-
网关冗余: 在汇聚层配置 VRRP,虚拟网关 IP 统一为
254,优先级120配合 MSTP 实现流量的双活负载分担。
-
-
接入安全与优化:
-
Edge Port: 接入交换机连接 PC 端口配置
stp edged-port enable,防止终端上下线引起 STP 震荡。 -
DHCP Snooping: 接入层启用 DHCP 服务,自动剔除冲突地址。
-
3.3 全流量镜像分析
本项目不仅关注“通不通”,更关注“安不安全”。利用 Python 自动化的灵活性,实现了与 Linux 后端服务的联动。
-
技术点:利用 Python 脚本在 Core-SW(核心交换机)上动态配置观察端口(
observe-port)和端口镜像。 -
实现逻辑:脚本识别核心链路端口(G0/0/1, G0/0/2, G0/0/3),下发镜像策略,将经过核心交换机的所有业务流量“克隆”一份,通过物理接口
G0/0/4发送至后端的 Linux-service 服务器。 -
应用场景:为 Day 2 阶段的 Docker 流量分析引擎(如 Snort 或 ELK 栈)提供实时数据源,实现对内网异常流量的深度检测(DPI)。
3.4 Syslog 日志审计联动
为了实现 Day 2 运维平台中的集中式日志审计功能(Rsyslog + Frontail),必须首先打通设备到日志服务器的数据通道。由独立的 Python 脚本 syslog_sender.py用于标准化全网设备的日志发送策略。
-
功能定义:将全网 9 台设备的系统日志(Info-Center)统一指向 Linux 运维平台的 Rsyslog 容器地址。
import threading
import time
import paramiko
from netmiko import ConnectHandler
# ========================================================
# 🛡️ 兼容性补丁 (eNSP 必备)
# ========================================================
def enable_legacy_ssh_algos():
paramiko.Transport._preferred_kex = (
"diffie-hellman-group1-sha1",
"diffie-hellman-group14-sha1",
"diffie-hellman-group-exchange-sha1"
)
paramiko.Transport._preferred_keys = ("ssh-rsa",)
paramiko.Transport._preferred_ciphers = ("aes128-cbc", "3des-cbc", "aes128-ctr")
paramiko.Transport._preferred_macs = ("hmac-sha1", "hmac-md5")
enable_legacy_ssh_algos()
# ========================================================
# 1. 资产清单
# ========================================================
USERNAME = 'admin'
PASSWORD = 'password123'
SYSLOG_SERVER = '192.168.78.128' # 你的虚拟机 IP
ALL_DEVICES = [
{'host': '192.168.78.200', 'role': 'Mgt-Router'},
{'host': '172.16.1.1', 'role': 'Edge-Router'},
{'host': '10.0.99.2', 'role': 'Core-SW'},
{'host': '10.0.0.11', 'role': 'Agg-SW1'},
{'host': '10.0.0.12', 'role': 'Agg-SW2'},
{'host': '10.0.0.21', 'role': 'Acc-SW1'},
{'host': '10.0.0.22', 'role': 'Acc-SW2'},
{'host': '10.0.0.23', 'role': 'Acc-SW3'},
{'host': '10.0.0.24', 'role': 'Acc-SW4'},
]
# ========================================================
# 2. Syslog 配置命令
# ========================================================
SYSLOG_TEMPLATE = [
'info-center enable',
f'info-center loghost {SYSLOG_SERVER} facility local7',
# 关闭一些不必要的详细日志,防止刷屏
'info-center source default channel 2 log level notification',
'quit'
]
def deploy_syslog(device_info):
role = device_info['role']
host = device_info['host']
connection_params = {
'device_type': 'huawei',
'host': host,
'username': USERNAME,
'password': PASSWORD,
'global_delay_factor': 4, # 增加延时防止 eNSP 卡顿
'timeout': 60,
}
try:
print(f"📡 [配置日志] {role} ({host})...")
with ConnectHandler(**connection_params) as conn:
# 清理旧配置 (可选,视情况而定)
# conn.send_command("undo info-center enable")
# 下发新配置
output = conn.send_config_set(SYSLOG_TEMPLATE)
print(output)
conn.send_command("save", expect_string=r"[y/n]")
conn.send_command("y")
print(f"[成功] {role} -> 日志已指向 {SYSLOG_SERVER}")
except Exception as e:
print(f"[失败] {role}: {str(e)[:100]}")
def run_all():
print("=" * 60)
print("华为Syslog 配置下发工具")
print(f"目标 Rsyslog 服务器: {SYSLOG_SERVER}")
print("=" * 60)
threads = []
for device in ALL_DEVICES:
t = threading.Thread(target=deploy_syslog, args=(device,))
threads.append(t)
t.start()
time.sleep(2) # eNSP 性能较弱,建议间隔时间设为 2 秒
for t in threads:
t.join()
print("\n" + "=" * 60)
print("Syslog 配置完毕!")
print("=" * 60)
if __name__ == "__main__":
run_all()
独立执行机制:该脚本设计为独立运行,不干扰主业务配置(Main Configuration)。它使用与主程序相同的 enable_legacy_ssh_algos 补丁,确保能稳定连接 eNSP 设备。
-
实施效果: 脚本执行后,设备发生任何状态变更(如 OSPF 邻居震荡、SSH 登录、接口 Up/Down),都会立即以 UDP 514 报文发送至
192.168.78.128,并在 Frontail 大屏上实时滚动展示,实现了“配置变更”与“行为审计”的自动化闭环。
3.5 连通性测试
1.需要在虚拟机上配置以下命令,【】内填写自己的网卡:
允许访问核心与管理网段 (10.x.x.x)
sudo ip route add 10.0.0.0/8 via 192.168.78.200 dev 【eth0】
允许访问边缘互联网段 (172.16.x.x)
sudo ip route add 172.16.0.0/12 via 192.168.78.200 dev 【eth0】
允许访问业务 PC 网段 (192.168.x.x)
这不会影响虚拟机自己所在的 192.168.78.0 网段,因为直连路由优先级更高
sudo ip route add 192.168.0.0/16 via 192.168.78.200 dev 【eth0】
2.为保证实验连通性,建议关闭虚拟机防火墙:
sudo systemctl stop firewalld
sudo systemctl disable firewalld



4. Day 2:基于 Docker 的容器化运维平台构建
4.1 概述
在完成了网络的基础架构搭建与自动化部署(Day 1)后,为了保障企业网络的长期稳定运行,本项目引入了基于 Docker 容器技术的 Linux 运维平台,实现了对网络设备的全生命周期管理(Day 2 Operations)。
通过容器编排技术,集成了监控、日志、备份、管理四大核心模块,构建了一套轻量级、可视化的 NetDevOps 解决方案。
4.2 技术架构
本系统部署于 CentOS/Linux 虚拟机中,采用 Docker Compose 进行微服务编排。相比传统物理机部署,容器化方案具有部署快、资源占用少、环境隔离性强的优势。
组件清单:
-
服务编排与管理: Portainer CE
-
服务可用性监控: Uptime Kuma
-
日志收集与分析: Rsyslog + Frontail
-
配置备份与版本控制: Oxidized(碍于ensp模拟器的老旧,此块容易出错)
|
服务名称 |
端口 |
访问网址 |
功能备注 |
|
Portainer |
9000 |
http://【虚拟机ip】:9000 |
容器总管家。在这里管理所有服务,看日志、重启容器等。 |
|
Uptime Kuma |
3001 |
http://【虚拟机ip】:3001 |
监控大屏。添加 Ping 监控,查看网络设备存活状态和延迟图表。 |
|
Frontail |
9001 |
http://【虚拟机ip】:9001 |
日志实时流。当你运行 Python 脚本或操作设备时,在这里看滚动的 Syslog。 |
|
Oxidized |
8888 |
http://【虚拟机ip】:8888 |
配置备份。查看设备配置的版本历史,对比配置变更差异 (Diff)。 |
4.3 平台部署与实施步骤
为了确保 Linux 运维平台的顺利交付,本项目制定了严格的“三步走”实施流程,涵盖了从底层文件构建、环境预处理到最终服务拉起与验证的全过程。
4.3.1:基础设施代码化构建
本阶段的目标是在 Linux 文件系统中建立规范的目录结构,并写入各容器的核心配置文件,实现“配置即代码”。
1. 创建标准化目录结构 在 /opt 目录下创建项目总目录及各微服务的持久化挂载点,确保容器重启后数据不丢失。
# 创建项目主目录及子目录
mkdir -p /opt/netops
mkdir -p /opt/netops/logs # 存放 Rsyslog 日志
mkdir -p /opt/netops/uptime-kuma-data # 存放监控数据
mkdir -p /opt/netops/portainer_data # 存放 Portainer 数据
mkdir -p /opt/netops/oxidized # 存放备份配置
2. 编写容器编排文件 (docker-compose.yml)
version: '3'
services:
uptime-kuma:
image: louislam/uptime-kuma:1
container_name: uptime-kuma
restart: always
ports:
- "3001:3001"
volumes:
- ./uptime-kuma-data:/app/data
rsyslog:
image: rsyslog/rsyslog:latest
container_name: rsyslog
restart: always
ports:
- "514:514/udp"
volumes:
- ./logs:/var/log
- ./rsyslog.conf:/etc/rsyslog.conf
frontail:
image: mthenw/frontail
container_name: frontail
restart: always
ports:
- "9001:9001"
command: /log/messages --ui-highlight --disable-usage-stats
volumes:
- ./logs:/log:ro
depends_on:
- rsyslog
portainer:
image: portainer/portainer-ce:latest
container_name: portainer
restart: always
ports:
- "9000:9000"
volumes:
- /var/run/docker.sock:/var/run/docker.sock
- ./portainer_data:/data
oxidized:
image: oxidized/oxidized:latest
container_name: oxidized
restart: always
ports:
- "8888:8888"
environment:
- OXIDIZED_HOME=/home/oxidized/.config/oxidized
- LANG=C.UTF-8
volumes:
- ./oxidized:/home/oxidized/.config/oxidized:z
-
关键配置说明:
-
Oxidized 路径修正:强制指定环境变量
OXIDIZED_HOME指向/home/oxidized/.config/oxidized,以匹配容器内部非 Root 用户的运行环境。 -
SELinux 权限适配:在挂载路径后添加
:z参数(如./oxidized:...:z),自动调整 SELinux 安全上下文,防止权限拒绝错误。
-
3. 配置日志服务 (rsyslog.conf) 定义 Rsyslog 监听 UDP 514 端口,并将接收到的网络设备日志流转存至 /var/log/messages,供前端可视化工具 Frontail 读取。
# 加载 UDP 模块,监听 514 端口
module(load="imudp")
input(type="imudp" port="514")
# 设置默认权限,确保 frontail 能读取
$FileCreateMode 0644
# 将所有接收到的日志 (*.*) 写入 /var/log/messages
*.* /var/log/messages
4. 配置备份服务 (oxidized/config) 编写 Oxidized 的核心逻辑配置,定义设备连接与备份策略:
username: admin
password: password123
model: huaweivrp
interval: 3600
use_syslog: false
debug: false
# === 降低并发,防止把 eNSP 冲垮 ===
threads: 5
timeout: 20
retries: 3
prompt: !ruby/regexp /^.+[#>]\s?$/
rest: 0.0.0.0:8888
input:
default: ssh
debug: false
ssh:
secure: false
auth_methods: ["password"]
output:
default: file
file:
directory: /home/oxidized/.config/oxidized/backups
source:
default: csv
csv:
file: /home/oxidized/.config/oxidized/router.db
delimiter: !ruby/regexp /:/
map:
name: 0
model: 1
ip: 2
5. 建立资产清单 (oxidized/router.db) 创建 CSV 格式的资产列表文件,明确需要备份的目标设备。
# 格式说明: 设备名称:设备型号:IP地址
Mgt-Router:huaweivrp:192.168.78.200
Edge-Router:huaweivrp:172.16.1.1
Core-SW:huaweivrp:10.0.99.2
Agg-SW1:huaweivrp:10.0.0.11
Agg-SW2:huaweivrp:10.0.0.12
Acc-SW1:huaweivrp:10.0.0.21
Acc-SW2:huaweivrp:10.0.0.22
Acc-SW3:huaweivrp:10.0.0.23
Acc-SW4:huaweivrp:10.0.0.24
-
格式规范:
设备名:huaweivrp:IP地址
6. 运行Oxidized报错(huaweivrp not found)的解决办法(仅供参考)
$ sudo docker logs --tail 20 oxidized
2026-01-10 14:10:58.508706 E [159:1140 nodes.rb:27] Oxidized::Nodes -- node {:name=>"Acc-SW2", :model=>"huaweivrp", :ip=>"10.0.0.22"} raised Oxidized::ModelNotFound with message 'huaweivrp not found for node 10.0.0.22'
2026-01-10 14:10:58.508969 E [159:1140 nodes.rb:27] Oxidized::Nodes -- node {:name=>"Acc-SW3", :model=>"huaweivrp", :ip=>"10.0.0.23"} raised Oxidized::ModelNotFound with message 'huaweivrp not found for node 10.0.0.23'
2026-01-10 14:10:58.509574 E [159:1140 nodes.rb:27] Oxidized::Nodes -- node {:name=>"Acc-SW4", :model=>"huaweivrp", :ip=>"10.0.0.24"} raised Oxidized::ModelNotFound with message 'huaweivrp not found for node 10.0.0.24'
若出现“huaweivrp not found”,需要手动安装 华为 VRP 的 model 文件。
第一步:进入 oxidized 容器
sudo docker exec -it oxidized bash
第二步:进入 models 目录
cd /home/oxidized/.config/oxidized/model
如果目录不存在,创建它:
mkdir -p /home/oxidized/.config/oxidized/modelcd /home/oxidized/.config/oxidized/model
第三步:创建 huaweivrp.rb 文件
nano huaweivrp.rb
把下面内容完整粘贴进去(这是社区常用的华为 VRP model,能跑 S 系列、AR 系列、CE 系列):
class Huaweivrp < Oxidized::Model
prompt /^<.*?>$/
comment '# '
cmd 'display current-configuration' do |cfg|
cfg
end
cfg :telnet do
username /^Username:/
password /^Password:/
end
cfg :ssh do
username /^Username:/
password /^Password:/
end
cfg :telnet, :ssh do
post_login 'screen-length 0 temporary'
pre_logout 'quit'
end
end
保存退出(Ctrl+O 回车,Ctrl+X)。
第四步:退出容器
exit
4.3.2:服务启动与业务验证
执行最终部署,并对各模块功能进行验收测试。
1. 启动容器集群 在项目根目录下执行 Docker Compose 启动命令:
cd /opt/netops
sudo docker compose up -d

执行 docker ps,确保所有 5 个容器的状态均为 Up (Started)。
4.3 功能模块详解
4.3.1 可视化容器管理 (Portainer)
-
功能描述: 部署 Portainer 作为 Docker 的图形化管理界面,替代复杂的命令行操作。
-
运维价值: 实现了运维工具栈的统一管理。管理员可以通过 Web 界面实时查看各组件(Oxidized, Uptime Kuma 等)的运行状态、CPU/内存占用,并能快速查看容器日志进行故障排查,极大地降低了运维门槛。




4.3.2 网络服务存活监控 (Uptime Kuma)
-
功能描述: 部署 Uptime Kuma 构建实时监控大屏。配置了针对核心路由器 (Mgt-Router, Edge-Router) 及汇聚交换机的 ICMP (Ping) 探测,以及针对关键服务端口(如 SSH Port 22)的 TCP 探测。
-
运维价值: 实现了故障的秒级发现。一旦网络设备宕机或 SSH 服务异常,大屏状态条立即变红,解决了传统运维中“用户报修才知道断网”的滞后性问题。


4.3.3 集中式日志审计 (Rsyslog + Frontail)
-
功能描述:
-
后端: 使用 Rsyslog 容器监听 UDP 514 端口,集中接收全网华为设备发送的 Syslog 日志。
-
前端: 使用 Frontail 实时读取日志文件,并通过 WebSocket 推送到 Web 页面,实现日志的高亮显示与自动滚动。
-
-
运维价值: 实现了日志的集中化管理。当 Python 自动化脚本下发配置或网络发生震荡时,运维人员无需登录每一台设备查看日志,只需在 Web 端即可掌握全网动态,极大提升了故障根因分析(RCA)的效率。

4.3.4 自动化配置备份与版本控制 (Oxidized)
-
功能描述: 部署 Oxidized 服务,配置其通过 SSH 定期轮询(Interval: 3600s)全网设备。Oxidized 自动执行
display current-configuration,并将结果保存为文件。 -
运维价值: 解决了配置丢失的风险。Oxidized 能够自动识别配置变更,并生成差异对比报告(Diff)。当网络因配置错误导致故障时,管理员可以快速查看“谁在什么时间改了哪行配置”,并依据备份文件快速回滚,保障了配置管理的安全性。


4.4 平台联动流程
本平台与 Day 1 阶段的 Python 脚本形成了完整的自动化闭环:
-
变更: 使用 Python 脚本批量下发新配置(如修改接口描述、调整路由)。
-
审计: 设备立即发送 Syslog 到 Frontail,记录变更操作。
-
监控: Uptime Kuma 持续监测网络连通性,确保变更未导致断网。
-
备份: Oxidized 在检测到配置变动或周期到达时,自动拉取最新配置并存档。
更多推荐

所有评论(0)