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