备份配置文件对于任何一名网络工程师来说都是最重要的任务之一。在这个用例中,我们将使用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其它相关文章!