Если вы являетесь сетевым инженером или системным инженером, то вам знакома сложность создания резервных копий конфигурации сети большого количества сетевых устройств в вашей организации или компании. Предположим, что в один прекрасный день вы увидите, как один из ваших маршрутизаторов/коммутаторов выйдет из строя без каких-либо ошибок. И угадайте что, вы не входили в это устройство с момента первоначальной настройки, и у вас нет возможности часто заглядывать в него, и вы не знаете о многих конфигурациях внутри него. Теперь вы застряли в этой ситуации и задались вопросом, что добавить в конфигурации. Таким образом, без каких-либо резервных копий конфигурации у вас не остается вариантов.
Итак, теперь мы знаем, что у нас есть проблема, но как ее исправить? В качестве решения в Интернете доступно множество инструментов мониторинга сети и резервного копирования конфигурации, которые доступны для выполнения всех этих задач, но они могут стоить дорого. Но что, если вы можете придумать свое собственное решение, используя несколько строк скрипта? Это сэкономит деньги, и у вас будет полностью индивидуальное решение.
В этом посте я помогу вам разработать полноценный инструмент резервного копирования конфигурации сети для автоматизации резервного копирования конфигурации устройств Cisco (маршрутизаторы, коммутаторы, беспроводные контроллеры и межсетевые экраны) с помощью скрипта Python с помощью модуля Netmiko Python.
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.
- Проверьте подключение SSH от узла Linux ко всем сетевым устройствам.
- Создайте отдельные текстовые файлы, включая IP-адреса устройств, для каждой категории сетевых устройств (маршрутизаторов, коммутаторов, беспроводных контроллеров и межсетевых экранов), для которых необходимо создать резервную копию.
- Создайте место для хранения всех резервных копий сетевых устройств. (Здесь я использую /root/Network_Device_Backups/<device_type>/<device_hostname>)
- Настройте TFTP-сервер для отправки конфигураций некоторых сетевых устройств (мы покажем, как это настроить в этой статье).
В этой статье я использую дистрибутив Ubuntu/Debian в качестве ОС и Python 3 в качестве языка сценариев.
Установка и настройка среды Python
Установите Python 3.
1apt update
2apt upgrade
3apt install python3 python3-pip
Установите и проверьте модуль netmiko python.
1pip3 install "pip>=20"
2pip3 install netmiko
3
4#Verify the installed module
5pip list | grep netmiko
Создание резервных копий конфигураций сетевых устройств.
1mkdir -p /root/Network_Device_Backups/Router
2mkdir -p /root/Network_Device_Backups/Switch
3mkdir -p /root/Network_Device_Backups/WLC
4mkdir -p /root/Network_Device_Backups/ASA
Задача создания сценария резервного копирования конфигурации
Этот скрипт Python использует список IP-адресов устройств из файла JSON. После того как скрипт импортирует JSON-файл, он извлекает список IP-адресов и использует цикл for для подключения к каждому устройству, а также копирует содержимое команды running-configuration "show running-config", команды вывода VLAN "show vlan" и записывает содержимое в файл на сервере, на котором выполняется скрипт. Наконец, сценарий добавляет к файлу метку даты и времени и помещает его в отдельный каталог для каждого устройства на сервере, на котором выполняется сценарий.
Вы можете создать каталог в любом месте и хранить эти 2 файла вместе в одном каталоге. В моем случае, я храню эти 2 файла внутри /root/Backup_Scripts.
Список устройств в виде файла JSON
1#router.json
2{
3 "router_list": [
4 {
5 "hostname": "RTR_A",
6 "ip": "192.168.1.100"
7 },
8 {
9 "hostname": "RTR_B",
10 "ip": "192.168.2.100"
11 }
12 ]
13}
1#switch.json
2{
3 "switch_list": [
4 {
5 "hostname": "SW-A",
6 "ip": "172.16.0.1"
7 },
8 {
9 "hostname": "SW-B",
10 "ip": "172.16.0.2"
11 }
12 ]
13}
Сценарий резервного копирования конфигурации маршрутизатора/коммутатора
Приведенный ниже сценарий предназначен для маршрутизаторов Cisco, но он также будет работать и для коммутаторов Cisco. Пожалуйста, убедитесь, что ключевое слово "router" заменено на "switch" соответственно.
1#!/usr/bin/python3
2
3from netmiko import ConnectHandler
4import os
5time import
6import datetime
7import json
8
9device_list = '/root/Backup_Scripts/router.json'
10backup_filename = 'RTR-Config-Backup-' + '{0:%Y-%m-%d-%H-%M-%S}'.format(datetime.datetime.now()) + '.cfg'
11vlan_filename = 'RTR-Show-VLAN-' + '{0:%Y-%m-%d-%H-%M-%S}'.format(datetime.datetime.now()) + '.txt'
12
13with open(device_list) as json_file:
14 data = json.load(json_file)
15 # Change data['router_list'] to data['switch_list'] if you are using switch.json
16 for router in data['router_list']:
17 cisco_2960 = {
18 'device_type': 'cisco_ios',
19 'host': router['ip'],
20 'username': 'sshusername', # Provide SSH username
21 'password': 'sshpassword', # Provide SSH password
22 'secret': 'enablesecret', # Optional, defaults to ''
23 }
24
25 try:
26 net_connect = ConnectHandler(**cisco_2960)
27 except:
28 continue
29
30 net_connect.enable()
31
32 output_run_config = net_connect.send_command("show running-config")
33 output_vlan = net_connect.send_command("show vlan-switch")
34
35 net_connect.exit_enable_mode()
36 net_connect.disconnect()
37
38 #Create a separate directory for each device if not exists.
39 backup_dir = '/root/Network_Device_Backups/Router/'+router['hostname']
40 if not os.path.exists(backup_dir):
41 os.makedirs(backup_dir)
42
43 #Write the device running-config to a file.
44 f0 = open(backup_dir+'/'+backup_filename, 'w')
45 f0.write(output_run_config)
46 f0.close()
47
48 #Write the device VLAN output to a file.
49 f1 = open(backup_dir+'/'+vlan_filename, 'w')
50 f1.write(output_vlan)
51 f1.close()
Настройка TFTP-сервера для резервного копирования конфигурации WLC
Установка TFTP
1apt update
2apt install xinetd tftpd tftp
Настройка TFTP
Создайте файл /etc/xinetd.d/tftp и поместите в него следующий блок.
1service tftp
2{
3protocol = udp
4port = 69
5socket_type = dgram
6wait = yes
7user = nobody
8server = /usr/sbin/in.tftpd
9server_args = /tftpboot
10disable = no
11}
Создание местоположения TFTP
Создайте папку "tftpboot" внутри корневого местоположения, и она должна совпадать с тем, что вы указали в server_args. В основном это будет местоположение tftpboot, где хранятся резервные копии конфигурации вашего сетевого устройства. Кроме того, предоставьте необходимые разрешения для доступа к tftpboot.
1sudo mkdir /tftpboot
2sudo chmod -R 777 /tftpboot
3sudo chown -R nobody /tftpboot
Перезапустите службу xinetd
1/etc/init.d/xinetd stop
2/etc/init.d/xinetd start
Сценарий резервного копирования конфигурации беспроводного контроллера
После того, как вы закончите настройку описанного выше сервера TFTP, вы можете продолжить выполнение следующего сценария для резервного копирования вашего беспроводного контроллера Cisco. Этот скрипт просто дает команду беспроводному контроллеру загрузить резервную копию конфигурации на сервер TFTP, и как только она будет загружена, скопировать файл конфигурации в указанное место резервной копии (/root/Network_Device_Backups/WLC).
0#!/bin/python3
1
2from netmiko import ConnectHandler
3time import
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)
Настройка FTP-сервера для резервного копирования конфигурации ASA
Установка vsftpd
1apt update
2apt install vsftpd
Сервис VSFTPD автоматически запустится после завершения процесса установки. Проверьте это, выполнив статус сервиса:
1systemctl status vsftpd
Настройка vsftpd
Сервер vsftpd можно настроить, изменив файл vsftpd.conf, который находится в каталоге /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
6time import
7import datetime
8import shutil
9
10ftp_server = '192.168.100.100'
11ftp_location = '/home/asaftpuser/'
12
13backup_filename = 'FW-Config-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 AM.
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
Заключение
Вот и все об автоматизации резервного копирования конфигурации сетевых устройств Cisco с помощью скрипта Python с помощью модуля netmiko python на сервере Linux под управлением Debian/Ubuntu. Надеемся, вы можете найти более подробную информацию о модуле Netmiko Python здесь. Если у вас есть какие-либо вопросы или предложения, вы всегда можете оставить свои комментарии ниже. Я постараюсь сделать все возможное, чтобы просмотреть их и ответить на них.
Если у вас есть какие-либо мысли или вопросы по этой теме, пожалуйста, не стесняйтесь оставить комментарий или отправить мне сообщение. Я хотел бы продолжить дискуссию и услышать вашу точку зрения.
А также вы всегда можете поддержать меня зайдя на сайт и подписаться https://dzen.ru/kalyuzhnyy.ru и найти больше статей на моих ресурсах https://kalyuzhnyy.ru и https://dev.kalyuzhnyy.ru или на моем канале telegramm https://t.me/nbkalyuzhnyy на котором в будущем будут выкладываться самые актуальные новости и инструкции по навыкам и обучению. Подпишись!