好的,现在我们知道我们遇到了问题,但是如何解决呢?作为一种解决方案,网络上有许多网络监控工具和配置备份工具,可用于完成所有这些任务,但可能需要付费。但是,如果您可以使用少量脚本行来获得自己的解决方案呢?这将节省资金,并且您拥有完全定制的解决方案。
在这篇文章中,我将帮助您开发一个成熟的网络配置备份工具,通过使用 Netmiko Python 模块,使用 Python 脚本自动执行 Cisco 设备配置备份(路由器、交换机、无线控制器和防火墙)。
用于网络自动化的 Python
Python 是最流行的网络自动化语言之一,但只有 Python 并不能轻松完成自动化任务。幸运的是,有人通过创建使用 Python 管理网络自动化的许多细节的库或模块做得很好。所以如果你从自动化开始,首先应该对 Python 脚本有一个基本的了解。
网络自动化库/模块
Python 网络自动化库为您提供与大量网络设备的简化通信和管理。有几个Python库/模块可用于做网络自动化任务如的paramiko,Netmiko和NAPALM。但在本文中,我将 Netmiko Python 库用于网络自动化任务。
关于 Netmiko 模块
Netmiko 库是 Paramiko 库的增强版本。它是一个多供应商库,可简化与网络设备的 SSH 连接并执行特定操作,例如在设备上执行命令。
您可以在https://github.com/ktbyers/netmiko 上找到该库,并且可以在此处下载最新发布的软件版本。
该库的主要目标是:
- 使用单个脚本轻松建立与大量设备的 SSH 连接。
- 命令执行并将输出简单地发送到文本文件或终端。
- 简化配置命令的命令执行,包括可能的提交操作。
- 支持大量多厂商网络设备和平台。
在开始之前,你需要安排以下事情
- 所有网络设备都应该启用 SSH,您也可以使用 telnet 执行此操作,但这里我使用的是 SSH。
- 检查从 Linux 主机到所有网络设备的 SSH 连接。
- 为需要备份的每一类网络设备(路由器、交换机、无线控制器和防火墙)创建单独的文本文件,包括设备 IP 地址。
- 创建一个位置来存储所有网络设备备份。(在这里我使用 /root/Network_Device_Backups/<device_type>/<device_hostname>)
- 设置一个 TFTP 服务器来推送一些网络设备的配置(将在这篇文章中展示如何设置它)。
在本文中,我使用 Ubuntu/Debian 发行版作为操作系统,使用 Python 3 作为我的脚本语言。
安装和配置 Python 环境
安装 Python 3。
apt update
apt upgrade
apt install python3 python3-pip
安装并验证netmiko python 模块。
pip3 install "pip>=20"
pip3 install netmiko
#Verify the installed module
pip list | grep netmiko
创建网络设备配置备份位置。
mkdir -p /root/Network_Device_Backups/Router
mkdir -p /root/Network_Device_Backups/Switch
mkdir -p /root/Network_Device_Backups/WLC
mkdir -p /root/Network_Device_Backups/ASA
配置备份脚本任务
此 python 脚本使用来自 JSON 文件的设备 IP 地址列表。脚本导入 JSON 文件后,它会提取 IP 地址列表并使用 for 循环连接到每个设备,并复制运行配置命令“ show running-config
”、VLAN 输出命令“ show vlan
”的内容并将内容写入文件在运行脚本的服务器上。最后,脚本将日期时间戳附加到文件中,并将其放在运行脚本的服务器上每个设备的单独目录中。
您可以在任何地方创建一个目录,并将这 2 个文件放在同一目录中。就我而言,我将这 2 个文件保存在/root/Backup_Scripts
.
设备列表作为 JSON 文件
#router.json
{
"router_list": [
{
"hostname": "RTR_A",
"ip": "192.168.1.100"
},
{
"hostname": "RTR_B",
"ip": "192.168.2.100"
}
]
}
#switch.json
{
"switch_list": [
{
"hostname": "SW-A",
"ip": "172.16.0.1"
},
{
"hostname": "SW-B",
"ip": "172.16.0.2"
}
]
}
路由器/交换机配置备份脚本
以下脚本适用于 Cisco 路由器,但也适用于 Cisco 交换机。请务必将“路由器”关键字相应地更改为“交换机”。
#!/usr/bin/python3
from netmiko import ConnectHandler
import os
import time
import datetime
import json
device_list = '/root/Backup_Scripts/router.json'
backup_filename = 'RTR-Config-Backup-' + '{0:%Y-%m-%d-%H-%M-%S}'.format(datetime.datetime.now()) + '.cfg'
vlan_filename = 'RTR-Show-VLAN-' + '{0:%Y-%m-%d-%H-%M-%S}'.format(datetime.datetime.now()) + '.txt'
with open(device_list) as json_file:
data = json.load(json_file)
# Change data['router_list'] to data['switch_list'] if you are using switch.json
for router in data['router_list']:
cisco_2960 = {
'device_type': 'cisco_ios',
'host': router['ip'],
'username': 'sshusername', # Provide SSH username
'password': 'sshpassword', # Provide SSH password
'secret': 'enablesecret', # Optional, defaults to ''
}
try:
net_connect = ConnectHandler(**cisco_2960)
except:
continue
net_connect.enable()
output_run_config = net_connect.send_command("show running-config")
output_vlan = net_connect.send_command("show vlan-switch")
net_connect.exit_enable_mode()
net_connect.disconnect()
#Create a separate directory for each device if not exists.
backup_dir = '/root/Network_Device_Backups/Router/'+router['hostname']
if not os.path.exists(backup_dir):
os.makedirs(backup_dir)
#Write the device running-config to a file.
f0 = open(backup_dir+'/'+backup_filename, 'w')
f0.write(output_run_config)
f0.close()
#Write the device VLAN output to a file.
f1 = open(backup_dir+'/'+vlan_filename, 'w')
f1.write(output_vlan)
f1.close()
为 WLC 配置备份设置 TFTP 服务器
安装 TFTP
apt update
apt install xinetd tftpd tftp
配置 TFTP
创建一个文件 /etc/xinetd.d/tftp 并将以下块放入其中。
apt update
apt install xinetd tftpd tftp
创建 TFTP 位置
在根位置创建一个文件夹“tftpboot”,这应该与您提供的任何内容相匹配server_args
。大多数情况下,它将是存储网络设备配置备份的 tftpboot 位置。此外,授予访问 tftpboot 所需的权限。
重启xinetd服务
无线控制器配置备份脚本
完成上述 TFTP 服务器设置后,您可以继续执行以下脚本来备份您的 Cisco 无线控制器。该脚本的作用很简单,就是命令无线控制器将配置备份上传到 TFTP 服务器,上传后,将配置文件复制到给定的备份位置 (/root/Network_Device_Backups/WLC)。
2 | from netmiko import ConnectHandler |
8 | tftp_server = '192.168.100.100' |
9 | tftp_location = '/tftpboot' |
11 | backup_filename = 'WLC-Config-Backup-' + '{0:%Y-%m-%d-%H-%M-%S}' . format (datetime.datetime.now()) + '.cfg' |
12 | backup_location = '/root/Network_Device_Backups/WLC/' |
14 | net_connect = ConnectHandler(device_type = 'cisco_wlc' , host = '172.16.0.1' , username = 'sshusername' , password = 'sshpassword' ) |
16 | net_connect.find_prompt() |
18 | config_commands = [ 'transfer upload mode tftp' , |
19 | 'transfer upload datatype config' , |
20 | 'transfer upload filename ' + backup_filename, |
21 | 'transfer upload path .' , |
22 | 'transfer upload serverip ' + tftp_server, |
25 | # Sending backup configuration settings to device |
26 | net_connect.send_config_set(config_commands) |
29 | output1 = net_connect.send_command_timing( 'transfer upload start' ) |
31 | # Confirming start of transfer |
32 | output2 = net_connect.send_command_timing( 'y' ) |
36 | # Disconnect from device |
37 | net_connect.disconnect() |
39 | file_path = tftp_location + backup_filename |
41 | while not os.path.exists(file_path): |
44 | if os.path.isfile(file_path): |
45 | shutil.move(file_path, backup_location) |
为 ASA 配置备份设置 FTP 服务器
安装 vsftpd
vsftpd 服务会在安装过程完成后自动启动。通过执行服务状态来验证它:
配置 vsftpd
可以通过修改 目录中的vsftpd.conf
文件 来配置 vsftpd 服务器 /etc
。
1 | # Allow anonymous FTP? (Disabled by default). |
4 | # Allow local users to log in. |
7 | # Enable any form of FTP write command. |
10 | # Default umask for local users is 077. You may wish to change this to 022, |
11 | # if your users expect that (022 is used by most other ftpd's) |
14 | # Restrict local users to their home directories. |
16 | allow_writeable_chroot=YES |
保存文件并重新启动 vsftpd 服务以使更改生效:
1 | systemctl restart vsftpd |
**如果您正在运行 UFW 防火墙,则需要允许 FTP 流量。
创建 FTP 用户
Cisco ASA 防火墙配置备份脚本
这里也与上一个相同,您必须提供 TFTP 服务器的详细信息才能将备份发送到/tftpboot
. 然后,一旦备份在 中可用/tftpboot
,请将其移动到所需的备份位置。
3 | from netmiko import ConnectHandler |
10 | ftp_server = '192.168.100.100' |
11 | ftp_location = '/home/asaftpuser/' |
13 | backup_filename = 'FW-DC.backup.' + '{0:%Y-%m-%d-%H-%M-%S}' . format (datetime.datetime.now()) + '.tar.gz' |
15 | backup_location = '/root/Network_Device_Backups/ASA/' |
19 | 'device_type' : 'cisco_asa' , |
20 | 'host' : '192.168.1.1' , |
21 | 'username' : 'sshusername' , |
22 | 'password' : 'sshpassword' , |
23 | 'secret' : 'enablesecret' , |
27 | net_connect = ConnectHandler( * * cisco_asa) |
29 | print >> sys.stderr, "Unable to connec to ASA." |
34 | backup_command = "backup location ftp:" |
35 | result = net_connect.send_command_timing(backup_command) |
39 | if 'Press return to continue or enter a backup location' in result: |
40 | result + = net_connect.send_command_timing(ftp_url) |
43 | net_connect.exit_enable_mode() |
44 | net_connect.disconnect() |
46 | file_path = ftp_location + backup_filename |
48 | while not os.path.exists(file_path): |
51 | if os.path.isfile(file_path): |
52 | shutil.move(file_path, backup_location) |
让我们开始测试
现在,我们应该能够运行这个 Python 设备配置备份脚本,但需要使用以下命令使这个脚本可执行。
使用以下命令手动运行脚本。
1 | python3 Router_Backup_Script.py |
2 | python3 Switch_Backup_Script.py |
3 | python3 WLC_Backup_Script.py |
4 | python3 ASA_Backup_Script.py |
验证代码中给定的备份文件位置(在我的例子中为/root/Network_Device_Backups )。
计划运行脚本
最后,是时候添加一个 cronjob 来在一天中的特定时间运行这个脚本计划了。您需要做的就是将脚本复制到以下目录的 Daily/Weekly/Monthly 文件夹中。或者按以下方式添加它,每周在上午 01:00 运行此脚本。
1 | 30 1 * * 5 /usr/bin/python3 /root/Backup_Scripts/Router_Backup_Script.py |
2 | 20 1 * * 5 /usr/bin/python3 /root/Backup_Scripts/Switch_Backup_Script.py |
3 | 10 1 * * 5 /usr/bin/python3 /root/Backup_Scripts/WLC_Backup_Script.py |
4 | 0 1 * * 5 /usr/bin/python3 /root/Backup_Scripts/ASA_Backup_Script.py |
结论
这就是在运行 Debian/Ubuntu 的 Linux 服务器上使用netmiko python 模块使用 Python 脚本自动化Cisco设备的网络设备配置备份的全部内容。希望您可以在此处找到 Netmiko Python 模块的更多详细信息。如果您有任何问题或建议,您可以随时在下面留下您的评论。我会尽我所能来审查和回复他们。