华为交换机监控脚本:Python自动化监控、告警和配置备份
导入所需库
import paramiko import ncclient import time from datetime import datetime
定义交换机类
class Switch:
def __init__(self, ip, username, password):
self.ip = ip
self.username = username
self.password = password
self.ssh = None
self.netconf = None
def connect_ssh(self):
# 建立SSH连接
self.ssh = paramiko.SSHClient()
self.ssh.set_missing_host_key_policy(paramiko.AutoAddPolicy())
self.ssh.connect(self.ip, username=self.username, password=self.password)
def connect_netconf(self):
# 建立NETCONF连接
self.netconf = ncclient.manager.connect(host=self.ip, port=830, username=self.username, password=self.password, hostkey_verify=False)
def execute_command(self, command):
# 执行命令并返回结果
stdin, stdout, stderr = self.ssh.exec_command(command)
result = stdout.read().decode('utf-8')
return result
def get_fan_status(self):
# 获取风扇状态
command = 'display fan'
result = self.execute_command(command)
for line in result.split('
'): if 'FAN' in line: status = line.split()[-1] if status != 'Normal': return 'faulty' return 'normal'
def get_power_status(self):
# 获取电源状态
command = 'display power'
result = self.execute_command(command)
for line in result.split('
'): if 'PWR' in line: status = line.split()[-1] if status != 'Normal': return 'faulty' return 'normal'
def get_lacp_status(self):
# 获取LACP状态
command = 'display lacp summary'
result = self.execute_command(command)
for line in result.split('
'): if 'AggId' in line: status = line.split()[-1] if status == 'down': return 'faulty' return 'normal'
def get_cpu_status(self):
# 获取CPU利用率
command = 'display cpu-usage'
result = self.execute_command(command)
for line in result.split('
'): if 'CPU Usage' in line: usage = int(line.split()[-1]) if usage > 80: return 'faulty' return 'normal'
def get_memory_status(self):
# 获取内存利用率
command = 'display memory-usage'
result = self.execute_command(command)
for line in result.split('
'): if 'Memory Usage' in line: usage = int(line.split()[-1]) if usage > 80: return 'faulty' return 'normal'
def get_ospf_status(self):
# 获取OSPF邻居状态
command = 'display ospf peer'
result = self.execute_command(command)
for line in result.split('
'): if 'Full' in line: status = line.split()[-1] if status != 'Full': return 'faulty' return 'normal'
def monitor_status(self):
# 监控关键状态
fan_status = self.get_fan_status()
power_status = self.get_power_status()
lacp_status = self.get_lacp_status()
cpu_status = self.get_cpu_status()
memory_status = self.get_memory_status()
ospf_status = self.get_ospf_status()
now = datetime.now().strftime('%Y-%m-%d %H:%M:%S')
print(f'{now} Fan status: {fan_status}, Power status: {power_status}, LACP status: {lacp_status}, CPU status: {cpu_status}, Memory status: {memory_status}, OSPF status: {ospf_status}')
if fan_status == 'faulty' or power_status == 'faulty':
print('Fan or power is faulty!')
def backup_config(self):
# 备份配置文件
now = datetime.now().strftime('%Y%m%d%H%M%S')
filename = f'{self.ip}_{now}.cfg'
command = f'save configuration to {filename}'
self.execute_command(command)
transport = self.ssh.get_transport()
sftp = transport.open_sftp()
sftp.get(filename, filename)
sftp.close()
print(f'{filename} saved.')
def configure_log_host(self):
# 配置日志主机
config = """
<config>
<system>
<log>
<host>
<udp>
<ip-address>10.1.60.2</ip-address>
<port>514</port>
</udp>
</host>
</log>
</system>
</config>
"""
self.netconf.edit_config(config, target='running')
print('Log host configured.')
读取命令文件
with open('commands.txt', 'r') as f: commands = f.readlines()
创建交换机对象
switch = Switch(ip='192.168.1.1', username='admin', password='password')
建立SSH连接
switch.connect_ssh()
建立NETCONF连接
switch.connect_netconf()
执行监控命令并输出结果
while True: for command in commands: result = switch.execute_command(command) print(result) switch.monitor_status() switch.backup_config() switch.configure_log_host() time.sleep(300) # 5分钟
原文地址: https://www.cveoy.top/t/topic/n2dI 著作权归作者所有。请勿转载和采集!