Найти в Дзене
Николай Калюжный

Автоматизируйте резервное копирование конфигурации сети с помощью Python

Если вы являетесь сетевым инженером или системным инженером, то вам знакома сложность создания резервных копий конфигурации сети большого количества сетевых устройств в вашей организации или компании. Предположим, что в один прекрасный день вы увидите, как один из ваших маршрутизаторов/коммутаторов выйдет из строя без каких-либо ошибок. И угадайте что, вы не входили в это устройство с момента первоначальной настройки, и у вас нет возможности часто заглядывать в него, и вы не знаете о многих конфигурациях внутри него. Теперь вы застряли в этой ситуации и задались вопросом, что добавить в конфигурации. Таким образом, без каких-либо резервных копий конфигурации у вас не остается вариантов. Итак, теперь мы знаем, что у нас есть проблема, но как ее исправить? В качестве решения в Интернете доступно множество инструментов мониторинга сети и резервного копирования конфигурации, которые доступны для выполнения всех этих задач, но они могут стоить дорого. Но что, если вы можете придумать свое с
Оглавление

Если вы являетесь сетевым инженером или системным инженером, то вам знакома сложность создания резервных копий конфигурации сети большого количества сетевых устройств в вашей организации или компании. Предположим, что в один прекрасный день вы увидите, как один из ваших маршрутизаторов/коммутаторов выйдет из строя без каких-либо ошибок. И угадайте что, вы не входили в это устройство с момента первоначальной настройки, и у вас нет возможности часто заглядывать в него, и вы не знаете о многих конфигурациях внутри него. Теперь вы застряли в этой ситуации и задались вопросом, что добавить в конфигурации. Таким образом, без каких-либо резервных копий конфигурации у вас не остается вариантов.

Итак, теперь мы знаем, что у нас есть проблема, но как ее исправить? В качестве решения в Интернете доступно множество инструментов мониторинга сети и резервного копирования конфигурации, которые доступны для выполнения всех этих задач, но они могут стоить дорого. Но что, если вы можете придумать свое собственное решение, используя несколько строк скрипта? Это сэкономит деньги, и у вас будет полностью индивидуальное решение.

В этом посте я помогу вам разработать полноценный инструмент резервного копирования конфигурации сети для автоматизации резервного копирования конфигурации устройств 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-соединение с большим количеством устройств с помощью одного скрипта.
  • Выполните команду и получите вывод просто в текстовый файл или терминал.
  • Упростите выполнение конфигурационных команд, включая, возможно, действия фиксации.
  • Поддерживает большое количество сетевых устройств и платформ разных вендоров.

Прежде чем начать, нужно договориться о следующих вещах

  1. На всех сетевых устройствах должен быть включен SSH, вы также можете сделать это с помощью telnet, но здесь я использую SSH.
  2. Проверьте подключение SSH от узла Linux ко всем сетевым устройствам.
  3. Создайте отдельные текстовые файлы, включая IP-адреса устройств, для каждой категории сетевых устройств (маршрутизаторов, коммутаторов, беспроводных контроллеров и межсетевых экранов), для которых необходимо создать резервную копию.
  4. Создайте место для хранения всех резервных копий сетевых устройств. (Здесь я использую /root/Network_Device_Backups/<device_type>/<device_hostname>)
  5. Настройте 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 на котором в будущем будут выкладываться самые актуальные новости и инструкции по навыкам и обучению. Подпишись!