一、前言

        作为一个网工,有时候管理多台网络设可能会遇到力不从心的情况。今天开始我们将利用python语言来实现自动化运维操作。(初步开始学习)

二、环境准备

        目前所用到的环境是 windows + python3.11 + paramiko模块 + IDE工具(pycharm)

         paramiko模块是用于模拟 SSH 方式连接网络设备的

 三、 paramiko模块的安装

        1、pip 的方式安装
                在CMD 中输入 pip  install   paramiko 

        2、paramiko 模块帮助手册

                进入python 环境,然后导入 paramiko 模块, 输入 help(paramiko) 

python 自动运维 python自动化运维教程_自动化

四、连接网络设备

        1、连接网络设备的几个重要参数

                a、主机名(IP 地址)

                b、端口号(默认 22 )

                c、用户名

                d、密码

        2、首先我们导入 paramiko 模块

                 import paramiko

import paramiko

              paramiko 类的代码如下所示

import paramiko
import time


class LoginSSH(object):

    # 基本信息初始化
    def __init__(self, hostname, port, username, password):
        """
        初始化需要的参数信息
        """
        self.hostname = hostname
        self.port = port
        self.username = username
        self.password = password
        self.ssh_client = paramiko.SSHClient()
        # 通过这个set_missing_host_key_policy方法用于实现远程登录是否需要确认输入yes,否则保存(相当于白名单的作用)
        self.ssh_client.set_missing_host_key_policy(paramiko.AutoAddPolicy())
        # 使用connect类来连接远程服务器
        self.ssh_client.connect(hostname=self.hostname,
                                port=self.port,
                                username=self.username,
                                password=self.password)
        self.sw_conn = self.ssh_client.invoke_shell()

    # 该方法是执行交换机命令,并得到命令返回结果
    def recv_result(self, str_cmd):
        self.sw_conn.send(str_cmd)  # 执行命令
        # 用于接收返回的信息
        result = ''
        while True:
            page = self.sw_conn.recv(65535).decode()
            result += page
            time.sleep(0.3)
            if page.endswith('>') or page.endswith(']'):
                break
            if "  ---- More ----" in page:
                self.sw_conn.send(" ")
        # 优化回显内容,不会出现 ---- More ---- 等标识符
        result = result.replace("  ---- More ----\x1b[42D                                          \x1b[42D", '')
        return result

         说明: recv_result()  方法,传入的参数是需要执行的交换机命令, 例如你需要查看所有配置信息,你可以输入“ dis  cu  \n"  , 此处的 ”\n“  模拟的是在输入完命令后回车的操作,要不然会一直卡在输入命令的界面,无法进行下一步操作。

        返回的结果是,执行该命令后所有的回显信息。

        调用方式如下

# 定义一个空列表,该列表是待监控的网络设备集合
sw_list = ['172.16.34.1']
username = '用户名'
passwd = '密码'
# 实例化一个连接对象(该对象已登陆交换机设备)
sw = LoginSSH(sw_list[0], 22, username, passwd)
res1 = sw.recv_result("dis lldp ne br | in FP\n")
print(res1)

        sw_list 是一个待连接网络设备的列表,当然可以写成文件的方式,可以自定义。

        username 和 passwd 分别是用户名及密码信息

        然后   sw = LoginSSH(sw_list[0], 22, username, passwd)  是对该类进行一个实例化操作。

        最后执行 recv_result() 方法获取回显数据

python 自动运维 python自动化运维教程_网络设备_02

        此时你已登陆到网络设备中,也能执行交换机的所有命令了!

完整代码如下:

import paramiko
import time


class LoginSSH(object):

    # 基本信息初始化
    def __init__(self, hostname, port, username, password):
        """
        初始化需要的参数信息
        """
        self.hostname = hostname
        self.port = port
        self.username = username
        self.password = password
        self.ssh_client = paramiko.SSHClient()
        # 通过这个set_missing_host_key_policy方法用于实现远程登录是否需要确认输入yes,否则保存(相当于白名单的作用)
        self.ssh_client.set_missing_host_key_policy(paramiko.AutoAddPolicy())
        # 使用connect类来连接远程服务器
        self.ssh_client.connect(hostname=self.hostname,
                                port=self.port,
                                username=self.username,
                                password=self.password)
        self.sw_conn = self.ssh_client.invoke_shell()

    # 该方法是执行交换机命令,并得到命令返回结果
    def recv_result(self, str_cmd):
        self.sw_conn.send(str_cmd)  # 执行命令
        # 用于接收返回的信息
        result = ''
        while True:
            page = self.sw_conn.recv(65535).decode(encoding="utf-8")
            result += page
            time.sleep(0.1)
            if page.endswith('>') or page.endswith(']'):
                break
            if "  ---- More ----" in page:
                # 当遇到 -- more -- 信息时,模拟敲击空格,让其继续显示余下内容
                self.sw_conn.send(" ")
        # 优化回显内容,不会出现 ---- More ---- 等标识符
        result = result.replace("  ---- More ----\x1b[42D                                          \x1b[42D", '')
        return result


# 定义一个空列表,该列表是待监控的网络设备集合
sw_list = ['主机IP地址']
username = '用户名'
passwd = '密码'
# 实例化一个连接对象(该对象已登陆交换机设备)
sw = LoginSSH(sw_list[0], 22, username, passwd)
res1 = sw.recv_result("dis lldp ne br | in FP\n")
print(res1)

下一期实现- 【 自动化运维(2)- 利用 Python 自动备份交换机配置 】