美文网首页银狐NetDevOps
银狐NetDevOps-网络运维Python初篇(一)Netmi

银狐NetDevOps-网络运维Python初篇(一)Netmi

作者: 科技银狐 | 来源:发表于2021-05-17 00:16 被阅读0次
    科技银狐

    前言:

    本人在网络行业有8年以上工作经验,CCIE块10年了,HCIE也5年了,目前就职于国内某知名互联网公司。大型国企和大型互联网公司都拥有一定的运维经验,也能体会到相互之间的需求差异。对于前几年大热的SDN网络、NetDevOps自动化运维都有真实的实战经验,对于行业内的尴尬处境还是有一些自己的感悟。

    网络工程师大部分编程能力较弱,这个事情2年前就是如此,也有很多同行指出了这个问题。但是2年后的今天(2020年11月份)依然如此,接触到的就算是国内互联网TOP大厂和头部通信厂商的同事,拥有一定编程能力的还是占少数。但是,随着企业基础设施逐渐增多,就算不谈互联网巨头,中型企业也有成百上千的硬件设备,没有编程能力的网工很难胜任未来的工作。

    目前来看最适合网工优先学习的还是python这门语言,虽然自动化神器ansible这个工具也能用一用,但是很多厂商设备并不支持ansible,而且工具毕竟没有语言灵活,数据中心内如果是大量H3C、锐捷、山石这些自动化能力比较滞后的厂商,只会ansible这种工具的可能就疯掉了。

    相信大家都有一样的痛点,想要学习python这门编程语言并运用到工作中,结果发现网上python教学资料很多,和网络运维相关的寥寥无几。虽然近几年搞传统网络培训的也开始做python方面课程,整个课程90%的内容还是把NetDevOps知识点给你过一遍,最后10%内容给你找几个简单案例。学过以后你会发现很难应用到自己的企业,因为这些培训机构的老师其实没有互联网公司的实战经验,很多场景是想象不出来的。

    所以,我希望可以通过分享我微不足道的学习过程和实战经验,帮助更多想要学习python提升工作效率和核心竞争力,想要踏上NetDevOps道路的人。另一方面也是为了可以找到更多同行之人,大家一起努力让这个行业不在那么尴尬,当更多的人都具备自动化运维能力,整个行业应该也会有所不同。

    因为网上教python基础的内容有很多,所以文章就不多阐述基础内容了,数据结构、算法、进程线程协程、面向对象之类的B站、百度等都有大把资料。当然,笔者在编程方面也是初学者,内容如果有错误或者有不足的地方,还请各位同行指正。


    1、训练场景:Netmiko单线程抓取1台网络设备配置

    第一个场景比较简单,也不涉及批量操作,主要是先熟悉一下如何用python来模拟我们平时的人为操作。

    这里有几个步骤:

    导入合适的python第三方模块,抓取网络设备配置一般的逻辑就是python脚本调用第三方SSH库,然后通过SSH远程登录到设备上,输入CLI命令(show run),并将配置内容打印出来。

    常见的SSH第三方库有pexpect、paramiko、netmiko,paramiko属于给系统运维使用的,针对主机层面的跑批模块,对于网络设备不太友好,而netmiko是在paramiko的基础上改造的,属于专为网络运维打造的模块,除非有些常识设备不支持netmiko,那我们只能用其他的了,正常情况下还是推荐直接使用netmiko模块,不用太关心其他模块。(帮助大家降低学则成本)

    2、实验环境:

    操作系统:windows 10 PC机

    python版本:python 3.8

    网络设备:EVE-NG模拟器(3700 Software (C3725-ADVENTERPRISEK9-M), Version 12.4(15)T14)

    编辑器:vscode(pycharm、sublime均可,推荐vscode)

    3、本章节整体代码(可复制粘贴直接使用)

    #!/usr/bin/env python
    # -*- coding: UTF-8 -*-
    
    from netmiko import ConnectHandler                                #导入netmiko模块
    
    session = ConnectHandler(device_type = "cisco_ios",               #创建SSH连接,并填入相关信息
                            ip = "192.168.147.146",
                            username = "root",
                            password = "root@123",
                            port = 22,
                            verbose = True
                            )
    
    print("connected to 192.168.147.146")                             #打印连接成功提示
    
    config = session.send_command("show running-config")              #抓取配置引入config
    
    print(config)                                                     #回显内容,类似登录设备show run
    
    session.disconnect()                                              #关闭SSH Session
    

    以下为执行程序后的回显内容,其实就和我们人工SSH登录设备show run结果一样

    image

    4、代码分段详解

    头部常用代码

    #!/usr/bin/env python
    # -*- coding: UTF-8 -*-
    

    前两行不用深入理解,复制粘贴就好,

    第一行是为了告诉操作系统执行这个脚本的时候,调用哪个路径的解释器。一般有两种写法:

    1、#!/usr/bin/python

    2、#!/usr/bin/env python

    第二种方式兼容虚拟环境,推荐使用。(虚拟环境以后再说)

    第二行是编码问题,python3默认支持中文,可以没有,python2默认不支持中文,必须有,所以我只是习惯性的加上。

    以上不是本章重点,暂时不用关注太多。

    netmiko 创建SSH代码

    from netmiko import ConnectHandler                                #导入netmiko模块,2种方法下面详解
    
    #创建SSH连接,并填入相关信息
    session = ConnectHandler(device_type = "cisco_ios",               #device_type在下面详解
                            ip = "192.168.147.146",                   #设备管理地址
                            username = "root",                        #SSH用户名
                            password = "root@123",                    #SSH密码
                            port = 22,                                #SSH端口,默认22,可以不写
                            verbose = True                            #允许在标准输出中添加附加信息,可以不写
                            )
    
    

    导入Netmiko模块,并创建SSH连接,

    常用的导入模块有2种方式:

    import netmiko
    

    这种方式就是把整个netmiko模块导入(包含各种对象和函数),但是在调用的时候需要加上模块名称,比如上面的代码就需要改为:

    import netmiko
    
    session = netmiko.ConnectHandler(device_type = "cisco_ios",               #创建SSH连接,并填入相关信息
                            ip = "192.168.147.146",
                            username = "root",
                            password = "root@123",
                            port = 22,
                            verbose = True
                            )
    

    我使用的是第二种导入方式:

    from netmiko import ConnectHandler
    from 模块名 import 函数名
    

    这样就可以使用函数。

    为了不让大家回滚到上面,再次复制一次netmiko代码

    from netmiko import ConnectHandler                                #导入netmiko模块,2种方法下面详解
    
    #创建SSH连接,并填入相关信息
    session = ConnectHandler(device_type = "cisco_ios",               #device_type在下面详解
                            ip = "192.168.147.146",                   #设备管理地址
                            username = "root",                        #SSH用户名
                            password = "root@123",                    #SSH密码
                            port = 22,                                #SSH端口,默认22,可以不写
                            verbose = True                            #允许在标准输出中添加附加信息,可以不写
                            )
    
    

    这时我们需要让PC电脑通过netmiko远程SSH到网络设备,创建一个session,

    所以我们直接使用ConnectHandler函数,里面有几个参数需要注意,

    device_type(字符串str):就是设备类型,其实就是让netmiko知道你要连接什么厂商什么类型的设备,

    官网可以找到支持什么厂商、什么系统,常见的思科、华为、Juniper、H3C、F5、A10等都支持,系统也比较全面,比如思科:Cisco IOS-XE,Cisco IOS-XR,Cisco ASA,Cisco NX-OS等,华为的CE系统等,有兴趣的可以看下官方资料。

    常用的device_type:

    思科:ciscoios,cisco_nxos

    华为:huawei(CE系列交换机)

    H3C:hp_comware(这个注意下,很多人不知道)

    juniper:juniper_junos

    print("connected to 192.168.147.146")                             #打印连接成功提示
    
    config= session.send_command("show running-config")              #抓取配置引入config
    
    print(config)                                                     #回显内容,类似登录设备show run
    
    session.disconnect()                                              #关闭SSH Session
    

    第一个print信息其实是为了给我们一个提示,表示netmiko模块的ConnectHandler函数执行成功,所以下一行代码才会执行。

    已经建立好session后,调用send_command向设备发送CLI命令(字符串形式),并将返回的结果引入config中,最后将config结果打印出来,当然也不能忘了中断SSH Session。

    ##################################################

    注意:

    除了send_command以外还有很多方法,以后我们会慢慢用到。

    • session.send_command() # 仅向设备发送一条字符串命令,通常使用show/display、save命令等单一操作使用,使用后会等待回显。
    • session.send_command_timing() # 和send_command类似,区别是收到回显不会直接结束函数,而是有个等待时间,针对某些大量回显内容的场景可使用。
    • session.send_config_set() # 发送配置命令,该函数属于已在特权模式下,所以可直接发送配置命令,无需输入system-view、config terminal之类的命令,一般搭配list使用。
    • session.send_config_from_file() # 发送从文件加载的配置命令,推荐使用大量配置输入时。
    • session.save_config() # 保存配置
    • session.enable() # 输入启用模式
    • session.find_prompt() # 返回当前路由器提示符
    • session.commit() # 提交配置(华为和juniper适用)

    第一篇文章只是一个开端,没有过多的python内容,也没讲解太多模块细则,主要还是先做一个开始,让大家有一个体会。下一章节会对netmiko进行更深一步的详解,整体内容也会循序渐进,根据需求的递进将简单的代码慢慢填充内容,个人感觉这样更有利于学习,也是我的学习路径。

    相关文章

      网友评论

        本文标题:银狐NetDevOps-网络运维Python初篇(一)Netmi

        本文链接:https://www.haomeiwen.com/subject/dkedjltx.html