使用 Python 自动化您的网络配置备份

如果您是网络或系统工程师,那么您就会知道对组织或公司中的大量网络设备进行网络配置备份的复杂性。让我们假设突然有一天你会看到你的一个路由器/交换机没有任何错误就死了。你猜怎么着,你没有从初始设置登录到该设备,你没有机会经常查看它,也不知道里面的很多配置。现在,你被困在这种情况下,想知道在配置中放什么??因此,如果没有任何配置备份,您就别无选择。

好的,现在我们知道我们遇到了问题,但是如何解决呢?作为一种解决方案,网络上有许多网络监控工具和配置备份工具,可用于完成所有这些任务,但可能需要付费。但是,如果您可以使用少量脚本行来获得自己的解决方案呢?这将节省资金,并且您拥有完全定制的解决方案。

在这篇文章中,我将帮助您开发一个成熟的网络配置备份工具,通过使用 Netmiko Python 模块,使用 Python 脚本自动执行 Cisco 设备配置备份(路由器、交换机、无线控制器和防火墙)。

用于网络自动化的 Python

Python 是最流行的网络自动化语言之一,但只有 Python 并不能轻松完成自动化任务。幸运的是,有人通过创建使用 Python 管理网络自动化的许多细节的库或模块做得很好。所以如果你从自动化开始,首先应该对 Python 脚本有一个基本的了解。

网络自动化库/模块

Python 网络自动化库为您提供与大量网络设备的简化通信和管理。有几个Python库/模块可用于做网络自动化任务如的paramikoNetmikoNAPALM。但在本文中,我将 Netmiko Python 库用于网络自动化任务。

关于 Netmiko 模块

Netmiko 库是 Paramiko 库的增强版本。它是一个多供应商库,可简化与网络设备的 SSH 连接并执行特定操作,例如在设备上执行命令。

您可以在https://github.com/ktbyers/netmiko 上找到该库,并且可以在此处下载最新发布的软件版本。

该库的主要目标是:

  • 使用单个脚本轻松建立与大量设备的 SSH 连接。
  • 命令执行并将输出简单地发送到文本文件或终端。
  • 简化配置命令的命令执行,包括可能的提交操作。
  • 支持大量多厂商网络设备和平台。

在开始之前,你需要安排以下事情

  1. 所有网络设备都应该启用 SSH,您也可以使用 telnet 执行此操作,但这里我使用的是 SSH。
  2. 检查从 Linux 主机到所有网络设备的 SSH 连接。
  3. 为需要备份的每一类网络设备(路由器、交换机、无线控制器和防火墙)创建单独的文本文件,包括设备 IP 地址。
  4. 创建一个位置来存储所有网络设备备份。(在这里我使用 /root/Network_Device_Backups/<device_type>/<device_hostname>)
  5. 设置一个 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)。

0#!/bin/python3
1 
2from netmiko import ConnectHandler
3import time
4import datetime
5import os
6import shutil
7 
8tftp_server = '192.168.100.100'
9tftp_location = '/tftpboot'
10 
11backup_filename = 'WLC-Config-Backup-' + '{0:%Y-%m-%d-%H-%M-%S}'.format(datetime.datetime.now()) + '.cfg'
12backup_location = '/root/Network_Device_Backups/WLC/'
13 
14net_connect = ConnectHandler(device_type='cisco_wlc', host='172.16.0.1', username='sshusername', password='sshpassword')
15 
16net_connect.find_prompt()
17 
18config_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,
23]
24 
25# Sending backup configuration settings to device
26net_connect.send_config_set(config_commands)
27 
28# Initiating transfer
29output1 = net_connect.send_command_timing('transfer upload start')
30 
31# Confirming start of transfer
32output2 = net_connect.send_command_timing('y')
33 
34#time.sleep(5)
35 
36# Disconnect from device
37net_connect.disconnect()
38 
39file_path = tftp_location+backup_filename
40 
41while not os.path.exists(file_path):
42    time.sleep(65)
43 
44if os.path.isfile(file_path):
45    shutil.move(file_path, backup_location)

为 ASA 配置备份设置 FTP 服务器

安装 vsftpd

1apt update
2apt install vsftpd

vsftpd 服务会在安装过程完成后自动启动。通过执行服务状态来验证它:

1systemctl status vsftpd

配置 vsftpd

可以通过修改 目录中的vsftpd.conf 文件 来配置 vsftpd 服务器 /etc

1# Allow anonymous FTP? (Disabled by default).
2anonymous_enable=NO
3 
4# Allow local users to log in.
5local_enable=YES
6 
7# Enable any form of FTP write command.
8write_enable=YES
9 
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)
12local_umask=022
13 
14# Restrict local users to their home directories.
15chroot_local_user=YES
16allow_writeable_chroot=YES

保存文件并重新启动 vsftpd 服务以使更改生效:

1systemctl restart vsftpd

**如果您正在运行 UFW 防火墙,则需要允许 FTP 流量。

创建 FTP 用户

1adduser asaftpuser

Cisco ASA 防火墙配置备份脚本

这里也与上一个相同,您必须提供 TFTP 服务器的详细信息才能将备份发送到/tftpboot. 然后,一旦备份在 中可用/tftpboot,请将其移动到所需的备份位置。

1#!/usr/bin/python3
2 
3from netmiko import ConnectHandler
4import sys
5import os
6import time
7import datetime
8import shutil
9 
10ftp_server = '192.168.100.100'
11ftp_location = '/home/asaftpuser/'
12 
13backup_filename = 'FW-DC.backup.' + '{0:%Y-%m-%d-%H-%M-%S}'.format(datetime.datetime.now()) + '.tar.gz'
14 
15backup_location = '/root/Network_Device_Backups/ASA/'
16 
17 
18cisco_asa = {
19    'device_type''cisco_asa',
20    'host''192.168.1.1',
21    'username''sshusername',
22    'password''sshpassword',
23    'secret''enablesecret',
24}
25 
26try:
27    net_connect = ConnectHandler(**cisco_asa)
28except:
29    print >> sys.stderr, "Unable to connec to ASA."
30    sys.exit(1)
31 
32net_connect.enable()
33 
34backup_command = "backup location ftp:"
35result = net_connect.send_command_timing(backup_command)
36 
37ftp_url = 'ftp://asaftpuser:password@192.168.100.100/'+backup_filename
38 
39if 'Press return to continue or enter a backup location' in result:
40    result += net_connect.send_command_timing(ftp_url)
41 
42 
43net_connect.exit_enable_mode()
44net_connect.disconnect()
45 
46file_path = ftp_location+backup_filename
47 
48while not os.path.exists(file_path):
49    time.sleep(10)
50 
51if os.path.isfile(file_path):
52    shutil.move(file_path, backup_location)

让我们开始测试

现在,我们应该能够运行这个 Python 设备配置备份脚本,但需要使用以下命令使这个脚本可执行。

1cd /root/Backup_Scripts
2chmod u+x *

使用以下命令手动运行脚本。

1python3 Router_Backup_Script.py
2python3 Switch_Backup_Script.py
3python3 WLC_Backup_Script.py
4python3 ASA_Backup_Script.py

验证代码中给定的备份文件位置(在我的例子中为/root/Network_Device_Backups )。

计划运行脚本

最后,是时候添加一个 cronjob 来在一天中的特定时间运行这个脚本计划了。您需要做的就是将脚本复制到以下目录的 Daily/Weekly/Monthly 文件夹中。或者按以下方式添加它,每周在上午 01:00 运行此脚本。

1crontab -e
130 1 * * 5      /usr/bin/python3 /root/Backup_Scripts/Router_Backup_Script.py
220 1 * * 5  /usr/bin/python3 /root/Backup_Scripts/Switch_Backup_Script.py
310 1 * * 5  /usr/bin/python3 /root/Backup_Scripts/WLC_Backup_Script.py
40 1 * * 5   /usr/bin/python3 /root/Backup_Scripts/ASA_Backup_Script.py

结论

这就是在运行 Debian/Ubuntu 的 Linux 服务器上使用netmiko python 模块使用 Python 脚本自动化Cisco设备的网络设备配置备份的全部内容。希望您可以在此处找到 Netmiko Python 模块的更多详细信息。如果您有任何问题或建议,您可以随时在下面留下您的评论。我会尽我所能来审查和回复他们。

  • 0
    点赞
  • 8
    收藏
    觉得还不错? 一键收藏
  • 3
    评论
评论 3
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值