导入所需库

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分钟

华为交换机监控脚本:Python自动化监控、告警和配置备份

原文地址: https://www.cveoy.top/t/topic/n2dI 著作权归作者所有。请勿转载和采集!

免费AI点我,无需注册和登录