# Network devices backup. Скрипт на python для автоматизации сбора backup с сетевых устройств. Используется: - Python 3.13 - "gitpython>=3.1.44" - для работы с гитом - "netmiko>=4.5.0" - для подключения к сетевым устройствам - "schedule>=1.2.2" - для периодического выполнения backup ## Описание работы: После запуска клонирует удалённый репозиторий. Проходит по списку устройств, подключается по ssh и получает backup. Если есть изменения в конфиге - делает комит в локальный репозиторий. Пушит все комиты в удалённый репозиторий. Повторяет раз в сутки в указанное время. ## Возможности - Сбор backup с mikrotik, snr, cisco(ios), ряд моделей cisco small business - Удаление локального гит репозитория полсе пуша в удалённый. - Разбивать бэкапы по папкам внутри репозитория (по регулярному выражению от имени хоста) - Отправлять оповещение на почту, если есть ошибки при снятии бэкапов. - Работать локально, без пуша в удалённый репозиторий ## Использование ### Docker Для запуска - Создать папку для проекта. - Внутри папки создать: - - Файл docker-compose.yaml - - Папку logs (в эту папку будут писаться логи) - - Папку config (в этой папке будет конфиг файл и список сетевых устройств) - - Папку backups (в этой папке будет git репозиторий с backup-ами ) Пример docker-compose файла: app/docker/docker-compose.yaml Закомментированные переменные нужны, только в случае, если используются соответствующие функции. ```yaml services: net-backup: image: git.sm8255082.ru/osnova/net-backup:1.2.0 restart: "no" volumes: - ./logs:/app/logs - ./config:/app/config - ./backups:/app/backups environment: - TZ=Europe/Moscow # Часовой пояс. - NET_DEV_USER=admin # Имя пользователя для подключаться к устройствам. #- NET_DEV_DOMAIN=local # Домен, если используется доменная учётная запись. - NET_DEV_PWD=password # Пароль от УЗ для подключения к устройствам. #- GIT_USERNAME=git_user # Название токена, используемого для пуша коммитов в gitlab. #- GIT_TOKEN=bla-bla-lba # Токен, используемый для пуша коммитов в gitlab. #- MAIL_USER=mail_user # Пользователь для авторизации на smtp сервере #- MAIL_PWD=bla-bla-lba # Пароль для авторизации на smtp сервере ``` ### Настройка В папке config: - Создать файл config.ini (пример содержимого app/config/config-template.ini) - Создать файл dev_list.txt (список устройств) Пример содержимого config.ini ```text # Конфиг для отправки оповещений через телеграм [tg] # False \ True - включение\отключение отправки оповещения в телеграм send: False # Конфиг для отправки оповещений на почту телеграм [mail] # False \ True - включение\отключение отправки оповещения на почту send: False # Адрес smtp сервера server: smtp.example.com # Порт smtp сервера port: 25 # Адрес с которого отправляются оповещения from_address: net-bcp@example.com # Адрес или список адресов, на которые отправляется оповещений to_address: engineer@example.com, network_manager@example.com # Тема письма subject: Warning in backup network device # Конфиг гит репозитория [git] # False \ True - включение\отключение отправки файлов в удалённый репозиторий push: False # Пользователь в локальном гите user: net-bcp mail: net-bcp@example.com # Настройки для удалённого репозитория # Пока только https protocol: https # url remote: gitlab.example.com.ru/secure/backup-network-device.git # ветка branch: main # Удаление локального репозитория после push remove_local: False [bcp] # Файл со списком устройств. Должен лежать в папке config file: dev_list.txt # Регулярное выражение по которому будет парситься список устройств pattern:(?P\S+) (?P\d+\.\d+\.\d+\.\d+) (?P\S+) (?P\S+) # Во сколько будет делаться бэкап start_at: 18:59 # True \ False - Создание папок внутри репозитория. Если False, то все файлы будут сохраняться в корень in_folder: True # Регулярное выражение по которому будет парситься имя папки из названия девайса folder_name_pattern: ^(.*?)- # Если количество строк в конфиге меньше указанного значения - ошибка, изменения не записываются. min_string_count: 50 [net_dev] # True \ False - создание лога подключения к устройству (для тестов на одном устройстве) debug: False # Порт на который подключаться по ssh ssh_port: 22 # Время, которое netmiko ждёт результата введённой команды read_timeout: 30 [log] # Уровень логов в консоль console_lvl: 20 # Уровень логов в файл file_lvl: 30 # Формат даты в логе date_format: %Y-%m-%d %H:%M:%S # Формат лога format: [%(asctime)s.%(msecs)03d] %(module)-25s:%(lineno)4d | %(funcName)-20s| %(levelname)-8s | %(message)s ``` Пример содержимого dev_list.txt, которое попадёт под регулярное выражение по умолчанию. ```text HOME-GW01 192.168.254.1 MikroTik RB5009UPr+S+ HOME-ASW02 192.168.250.202 MikroTik CRS310-8G+2S+ ```