银狐NetDevOps-网络工程师Python初篇(一)Netmiko抓取设备配置

简书断更了一段时间,因为疫情和一些压力较大的项目,没太多时间照顾简书平台。这次回来分享和以前可能有些不同,因为之前一直是科技自媒体的身份,所以一直以来输出的都是科技互联网行业的洞察、见解,从来没分享过纯技术干货。

但我还有另一个身份,就是一名技术人员,并且看到行业内有一些同行确实在NetDevOps方面碰到许多困难,而且都是我走过的道路,所以想专门搞一个专栏输出技术型文章,希望可以帮到大家,并找到同路人。

以下正文:


前言:

本人在网络行业有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",                                       #设备IP

                        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连接

```

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


有2个点单独说明一下:

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


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

session.send_command() # 向设备发送命令,返回输出(基于模式)

session.send_command_timing() # 沿通道发送命令,返回输出(基于时序)

session.send_config_set() # 将配置命令发送到远程设备

session.send_config_from_file() # 发送从文件加载的配置命令

session.save_config() # 保存配置

session.enable() # 输入启用模式

session.find_prompt() # 返回当前路由器提示符

session.commit() # 提交配置(华为和juniper适用)

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

另外还有一个问题,这些内容会在简书和知乎同步更新,大体内容是一致的,不过简书这边代码库的功能感觉不太好用,所以很多内容我会删减,但整个内容架构差不多的,可能逻辑性和文章观看体验还是有差距。未来代码复杂了会对整体代码进行详细拆分和讲解,如果发现简书代码块确实不太友好,可能这边就不做这一步了。

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章