Всем привет!
Думаю, многие сталкивались с проблемой, когда в одну папку делается много копий бэкапов. При этом имя бэкапа не постоянное, в котором например, есть дата и время или порядковый номер.
Встает вопрос как мониторить актуальное состояние?
Предлагаю свое решение по реализации данной задачи с использованием Zabbix и небольшого скрипта на Python.
Опишу полный цикл своих бэкапов.
1. MSSQL ежедневно делает бэкап базы с перезаписью в одно и тоже место с одним и тем же именем:
Данный файл мониторится просто.
в Zabbix создаем Элемент данных
И на основе него создается тригер который проверяет не прошли ли сутки(86400сек.) с момента последнего бэкапа.
2. Далее Cobian сжимает и переносит данный бэкап в несколько мест. В хранилище на том же сервере, плюс кладет в сетевое хранилище, где циклично обновляет 14 копий.
Например:
В которых лежат файлы:
Соответственно имена файлов в каждой из директорий получаются однотипные, но динамические.
Казалось бы можно мониторить дату изменения директории с помощью того же элемента данных что и выше. Но не все так просто. У меня это не заработало. точнее заработало, но не правильно и плохо, дата изменения папки не обновлялась пока в нее не войдешь в ручную, хотя файл бэкапа был с правильной датой. Возможно были где то глюки винды. К тому же это совсем не захотело работать с сетевым путем (\\NAS\backup\ )
По этому собственно и родился данный скрипт:
Передавая путь к директории с бэкапами данному скрипту он ищет самый новый файл в папке, оценивает размер его и как он давно был создан.
В данной примере бэкап должен быть больше 2MB и он не должен быть старше суток.
Если все ок скрипт передаст в заббикс 0 если что то не так то вернется 1.
В качестве аргумента скрипту передать можно как локальный путь так и сетевой. все прекрасно работает. Главное что бы был доступ.
Как это выглядит в заббиксе.
В первую очередь создаем юзер параметр.
Идем в zabbix_agent.conf и добавляем строку:
Собственно здесь указывается путь к компилятору Python, далее путь до скрипта и параметр который будет взят из ключа check_backup[*]
В заббиксе Создаем элемент данных

на основании данного элемента создаем тригер который проверяет что именно передал нам скрипт. если это не 0 значит это проблема.
UPD: Добавил в качестве параметров уникальный размер для каждого бэкапа
В конфиге заббикса соответственно вызывается вот так
в элементах данных соответственно через запятую указывается размер в байтах.
Вот собственно и все. Спасибо за внимание.
Думаю, многие сталкивались с проблемой, когда в одну папку делается много копий бэкапов. При этом имя бэкапа не постоянное, в котором например, есть дата и время или порядковый номер.
Встает вопрос как мониторить актуальное состояние?
Предлагаю свое решение по реализации данной задачи с использованием Zabbix и небольшого скрипта на Python.
Опишу полный цикл своих бэкапов.
1. MSSQL ежедневно делает бэкап базы с перезаписью в одно и тоже место с одним и тем же именем:
D:\backup\mssql\my_data_base.bak
Данный файл мониторится просто.
в Zabbix создаем Элемент данных
vfs.file.time[D:\backup\mssql\my_data_base.bak,modify]
И на основе него создается тригер который проверяет не прошли ли сутки(86400сек.) с момента последнего бэкапа.
{host:vfs.file.time[D:\backup\mssql\my_data_base.bak,modify].now()}-{host:vfs.file.time[D:\backup\mssql\my_data_base.bak,modify].last()}>86400
2. Далее Cobian сжимает и переносит данный бэкап в несколько мест. В хранилище на том же сервере, плюс кладет в сетевое хранилище, где циклично обновляет 14 копий.
Например:
E:\backup\cobian\my_data_base
\\NAS\backup\cobian\my_data_base
В которых лежат файлы:
my_data_base 2018-12-12 05;30;55.7z
my_data_base 2018-12-11 05;30;54.7z
my_data_base 2018-12-10 05;30;55.7z
my_data_base 2018-12-09 05;30;56.7z
Соответственно имена файлов в каждой из директорий получаются однотипные, но динамические.
Казалось бы можно мониторить дату изменения директории с помощью того же элемента данных что и выше. Но не все так просто. У меня это не заработало. точнее заработало, но не правильно и плохо, дата изменения папки не обновлялась пока в нее не войдешь в ручную, хотя файл бэкапа был с правильной датой. Возможно были где то глюки винды. К тому же это совсем не захотело работать с сетевым путем (\\NAS\backup\ )
По этому собственно и родился данный скрипт:
import os, datetime, sys
def check_backup(path):
old = round(datetime.datetime.now().timestamp() - os.path.getmtime(max([os.path.join(path, file) for file in os.listdir(path)], key=os.path.getmtime)))
size = os.path.getsize(max([os.path.join(path, file) for file in os.listdir(path)], key=os.path.getmtime))
err = "1"
if size > 2097152:
if old < 86400:
err = "0"
print(err)
check_backup(sys.argv[1])
Передавая путь к директории с бэкапами данному скрипту он ищет самый новый файл в папке, оценивает размер его и как он давно был создан.
В данной примере бэкап должен быть больше 2MB и он не должен быть старше суток.
Если все ок скрипт передаст в заббикс 0 если что то не так то вернется 1.
В качестве аргумента скрипту передать можно как локальный путь так и сетевой. все прекрасно работает. Главное что бы был доступ.
Как это выглядит в заббиксе.
В первую очередь создаем юзер параметр.
Идем в zabbix_agent.conf и добавляем строку:
UserParameter=check_backup[*], "C:\Program Files (x86)\Python37-32\python.exe" C:\bin\scripts\find.py $1
Собственно здесь указывается путь к компилятору Python, далее путь до скрипта и параметр который будет взят из ключа check_backup[*]
В заббиксе Создаем элемент данных

на основании данного элемента создаем тригер который проверяет что именно передал нам скрипт. если это не 0 значит это проблема.
{host:check_backup[E:\backup\cobian\my_data_base\].last()}<>0
UPD: Добавил в качестве параметров уникальный размер для каждого бэкапа
import os, datetime, sys
def check_backup(path,ves):
ves = int(ves)
old = round(datetime.datetime.now().timestamp() - os.path.getmtime(max([os.path.join(path, file) for file in os.listdir(path)], key=os.path.getmtime)))
size = os.path.getsize(max([os.path.join(path, file) for file in os.listdir(path)], key=os.path.getmtime))
err = "1"
if size > ves:
if old < 86400:
err = "0"
print(err)
check_backup(sys.argv[1],sys.argv[2])
В конфиге заббикса соответственно вызывается вот так
UserParameter=check_backup[*],"C:\Program Files (x86)\Python37-32\python.exe" C:\bin\scripts\find.py $1 $2
в элементах данных соответственно через запятую указывается размер в байтах.
{host:check_backup[E:\backup\cobian\my_data_base\,2097152].last()}<>0
Вот собственно и все. Спасибо за внимание.