net-backup/README.md

143 lines
7.0 KiB
Markdown
Raw Permalink Blame History

This file contains ambiguous Unicode characters

This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.

# 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<name>\S+) (?P<ip>\d+\.\d+\.\d+\.\d+) (?P<vendor>\S+) (?P<model>\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+
```