银狐NetDevOps-网络运维Python初篇(一)Netmiko抓取设备配置

科技银狐

前言:

本人在网络行业有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进行更深一步的详解,整体内容也会循序渐进,根据需求的递进将简单的代码慢慢填充内容,个人感觉这样更有利于学习,也是我的学习路径。

最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
  • 序言:七十年代末,一起剥皮案震惊了整个滨河市,随后出现的几起案子,更是在滨河造成了极大的恐慌,老刑警刘岩,带你破解...
    沈念sama阅读 206,126评论 6 481
  • 序言:滨河连续发生了三起死亡事件,死亡现场离奇诡异,居然都是意外死亡,警方通过查阅死者的电脑和手机,发现死者居然都...
    沈念sama阅读 88,254评论 2 382
  • 文/潘晓璐 我一进店门,熙熙楼的掌柜王于贵愁眉苦脸地迎上来,“玉大人,你说我怎么就摊上这事。” “怎么了?”我有些...
    开封第一讲书人阅读 152,445评论 0 341
  • 文/不坏的土叔 我叫张陵,是天一观的道长。 经常有香客问我,道长,这世上最难降的妖魔是什么? 我笑而不...
    开封第一讲书人阅读 55,185评论 1 278
  • 正文 为了忘掉前任,我火速办了婚礼,结果婚礼上,老公的妹妹穿的比我还像新娘。我一直安慰自己,他们只是感情好,可当我...
    茶点故事阅读 64,178评论 5 371
  • 文/花漫 我一把揭开白布。 她就那样静静地躺着,像睡着了一般。 火红的嫁衣衬着肌肤如雪。 梳的纹丝不乱的头发上,一...
    开封第一讲书人阅读 48,970评论 1 284
  • 那天,我揣着相机与录音,去河边找鬼。 笑死,一个胖子当着我的面吹牛,可吹牛的内容都是我干的。 我是一名探鬼主播,决...
    沈念sama阅读 38,276评论 3 399
  • 文/苍兰香墨 我猛地睁开眼,长吁一口气:“原来是场噩梦啊……” “哼!你这毒妇竟也来了?” 一声冷哼从身侧响起,我...
    开封第一讲书人阅读 36,927评论 0 259
  • 序言:老挝万荣一对情侣失踪,失踪者是张志新(化名)和其女友刘颖,没想到半个月后,有当地人在树林里发现了一具尸体,经...
    沈念sama阅读 43,400评论 1 300
  • 正文 独居荒郊野岭守林人离奇死亡,尸身上长有42处带血的脓包…… 初始之章·张勋 以下内容为张勋视角 年9月15日...
    茶点故事阅读 35,883评论 2 323
  • 正文 我和宋清朗相恋三年,在试婚纱的时候发现自己被绿了。 大学时的朋友给我发了我未婚夫和他白月光在一起吃饭的照片。...
    茶点故事阅读 37,997评论 1 333
  • 序言:一个原本活蹦乱跳的男人离奇死亡,死状恐怖,灵堂内的尸体忽然破棺而出,到底是诈尸还是另有隐情,我是刑警宁泽,带...
    沈念sama阅读 33,646评论 4 322
  • 正文 年R本政府宣布,位于F岛的核电站,受9级特大地震影响,放射性物质发生泄漏。R本人自食恶果不足惜,却给世界环境...
    茶点故事阅读 39,213评论 3 307
  • 文/蒙蒙 一、第九天 我趴在偏房一处隐蔽的房顶上张望。 院中可真热闹,春花似锦、人声如沸。这庄子的主人今日做“春日...
    开封第一讲书人阅读 30,204评论 0 19
  • 文/苍兰香墨 我抬头看了看天上的太阳。三九已至,却和暖如春,着一层夹袄步出监牢的瞬间,已是汗流浃背。 一阵脚步声响...
    开封第一讲书人阅读 31,423评论 1 260
  • 我被黑心中介骗来泰国打工, 没想到刚下飞机就差点儿被人妖公主榨干…… 1. 我叫王不留,地道东北人。 一个月前我还...
    沈念sama阅读 45,423评论 2 352
  • 正文 我出身青楼,却偏偏与公主长得像,于是被迫代替她去往敌国和亲。 传闻我的和亲对象是个残疾皇子,可洞房花烛夜当晚...
    茶点故事阅读 42,722评论 2 345

推荐阅读更多精彩内容

  • 前言 自上一篇文章《用python怎么telnet到网络设备》,简单使用了telnetlib库给大家演示了下,但是...
    点滴技术阅读 768评论 0 2
  • [ TOC ] 0. 前言 自上一篇文章《用python怎么telnet到网络设备》,简单使用了telnetlib...
    点滴技术阅读 254评论 0 3
  • 1. 网络编程基础 1.1 介绍 网络编程基础(1) OSI模型和TCP/IP协议计算机网络、OSI七层模型、TC...
    nimw阅读 1,138评论 0 0
  • 我是黑夜里大雨纷飞的人啊 1 “又到一年六月,有人笑有人哭,有人欢乐有人忧愁,有人惊喜有人失落,有的觉得收获满满有...
    陌忘宇阅读 8,521评论 28 53
  • 信任包括信任自己和信任他人 很多时候,很多事情,失败、遗憾、错过,源于不自信,不信任他人 觉得自己做不成,别人做不...
    吴氵晃阅读 6,181评论 4 8