银狐NetDevOps

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

2021-05-17  本文已影响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以外还有很多方法,以后我们会慢慢用到。

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

上一篇下一篇

猜你喜欢

热点阅读