Python自动化运维-利用Python-netmiko模块备份设备配置

暖和的春天,万物复苏,运河水像刚刚清醒的小姑娘,浑身布满了活力,唱着新歌,向前奔去。

备份配置文件对于任何一名网络工程师来说都是最重要的任务之一。在这个用例中,我们将使用netmiko库设计一个示例Python脚本。该脚本用来备份设备配置,它适用于不同的供应商与平台。

为方便日后访问或引用,我们将根据设备IP地址格式化输出文件名,例如,SW1备份操作的输出文件保存在dev_192.168.10.1_.cfg中。

设备开启SSH远程连接功能

1、华为设备

<Huawei>system-view 
[huawei]aaa
[Huawei-aaa]local-user huajiao238 password cipher huajiao238 privilege level 15     #权限等级按需求给
[Huawei-aaa]local-user huajiao238 service-type ssh     #给用户绑定服务类型
[Huawei-aaa]quit
[huawei]ssh user huajiao238 authentication password   #密码认证,看你情况选择,如果选择秘钥,记得要生成秘钥哈
[huawei]ssh user huajiao238 service-type stelnet
[huawei]stelnet server enable    #开始ssh服务
[huawei]user-interface vty 0
[Huawei-ui-vty0]authentication-mode aaa   #认证模式为aaa,认证、授权、计费(authentication,authorization,accounting)
[Huawei-ui-vty0]protocol inbound ssh    #设置为SSH或all,默认为telnet

2、思科设备

Router>enable
Router#configure terminal
Router(config)#do show ip ssh  #如果能识别这句命令,说明设备支持ssh
SSH Disabled - version 1.99
%Please create RSA keys to enable SSH (and of atleast 768 bits for SSH v2).
Authentication timeout: 120 secs; Authentication retries: 3
Minimum expected Diffie Hellman key size : 1024 bits
IOS Keys in SECSH format(ssh-rsa, base64 encoded): NONE

Router(config)#hostname huajiao238
huajiao238(config)#ip domain-name www.ytymz.com   #主机名跟域名是一定要配置的,不然无法生成秘钥,名称如无要求就随意
huajiao238(config)#crypto key generate rsa   #生成秘钥,生成成功后自动开启SSH
The name for the keys will be: huajiao238.www.ytymz.com
Choose the size of the key modulus in the range of 360 to 4096 for your
  General Purpose Keys. Choosing a key modulus greater than 512 may take
  a few minutes.

How many bits in the modulus [512]: 1024
% Generating 1024 bit RSA keys, keys will be non-exportable...
[OK] (elapsed time was 1 seconds)

huajiao238(config)#
*Oct 28 17:45:12.671: %SSH-5-ENABLED: SSH 1.99 has been enabled
huajiao238(config)#username huajiao238 secret huajiao238  #配置用户名、密码,secret加密密码,不会明文显示
huajiao238(config)#username huajiao238 privilege 15   #给予权限
huajiao238(config)#line vty 0    #只允许同时一人在线
huajiao238(config-line)#transport input ssh     #配置只允许通过ssh连接
huajiao238(config-line)#login local  #本地用户名密码认证,有条件的也可以采用radius认证
huajiao238#show ip ssh   #查看是否已开启ssh
SSH Enabled - version 1.99
Authentication timeout: 120 secs; Authentication retries: 3
Minimum expected Diffie Hellman key size : 1024 bits
IOS Keys in SECSH format(ssh-rsa, base64 encoded):
ssh-rsa AAAAB3NzaC1yc2EAAAADAQABAAAAgQCrMU3KYFzNhaNuueYiAVYAWbIx8zIorSgWWbw1VQC4
8UWF9XQnVZ6vnIWnwdi2s4PaVE32ICtvaULzK8vmVF5Thl7WgaCjC26evmfgrRyRP+7ORvAgkw2affzX
yJGUpcn0nzdDB0F2n0suU8H0/jXBNacfdbGCmElKt8YlWgaGrQ==

3、其他设备

其他设备大多数与思科类似,请根据其他设备说明文档进行配置。

编写Python脚本

从定义交换机开始,我们希望其配置备份为文本文档(设备文件),用逗号分隔访问设备的用户名、密码等详细信息,这样就可以在Python脚本中使用split()函数来获取这些数据,方便在ConnetHeadler函数中使用这些数据。另外,还可以从Excel工作表或任何数据库中轻松导出该文件以及把该文件导入其中。

文件结构如下:

#<ip address>,<username>,<password>,<enable_password>,<vendor>
192.168.100.1,huajiao238,huajiao238,,cisco
192.168.100.2,huajiao238,huajiao238,,huawei

编写Python脚本,使用with open子句在脚本中导入该文件。在导入的文件对象上使用readlines()方法将文件中的每一行组成列表,然后用for循环语句逐行进行遍历文件,用split()函数获取每一行中用逗号隔开的设备信息,并将它们赋予相应的变量。

from netmiko import ConnectHandler
from datetime import datetime

with open("device_info.txt") as device_info:
    devices = device_info.readlines()
for line in devices:
    line = line.strip("\n")
    ipaddr = line.split(",")[0]
    username = line.split(",")[1]
    password = line.split(",")[2]
    enable_password = line.split(",")[3]
    vendor = line.split(",")[4]
    if vendor.lower() == "cisco":
        device_type = "cisco_ios"
        backup_comaand = "show running-config"
    elif vendor.lower() == "huawei":
        device_type = "huawei"
        backup_comaand = "display current-configuration"

由于我们的目标是创建模块化的,支持多种设备供应商的脚本,因此在if子句中需要检查设备供应商,并为该设备分配正确的device_type和backup_command。

接下来,建立与设备的ssh连接,使用netmiko模块中的.send_command()方法执行备份命令。

print(str(datetime.now())+"connecting to device {}".format(ipaddr))
device_connect = {
    'device_type'   :  device_type,
    'ip'            :   ipaddr,
    'username'      :   username,
    'password'      :   password
}
conect = ConnectHandler(**device_connect);
conect.enable()
running_config = conect.send_command(backup_comaand)
print(str(datetime.now()) + "saveing config from device {}".format(ipaddr))
f = open("dev_"+ipaddr+"_cfg","w")
f.write(running_config)
f.close()
print("===============================================")

在最后的几行中以写入的方式打开一个文件(文件不存在时将自动创建),文件名中包含了前面从设备文件中读取的ipaddr变量。脚本运行结果如下:

D:\pythonProject\demo\pythonProject1\venv\Scripts\python.exe D:/pythonProject/demo/pythonProject1/demoi.py
2020-10-28 19:50:45.808302connecting to device 192.168.100.2
2020-10-28 19:50:54.159646saveing config from device 192.168.100.2
===============================================

Process finished with exit code 0

使用Linux服务器上的cron任务,或Windows服务器上的计划任务,可让服务器在指定时间运行上面的Python脚本。例如每天凌晨一点运行一次,将配置信息存储在device_config_backup目录中,以方便运维团队使用。

以上就是Python自动化运维-利用Python-netmiko模块备份设备配置。人闭上眼睛,是为了和自己相见。更多关于Python自动化运维-利用Python-netmiko模块备份设备配置请关注haodaima.com其它相关文章!

标签: Python netmiko