Скрипт проверки свободного места на яндекс диске для zabbix

У нас бекапы с корпоративного сервера сохраняются, в том числе, на яндекс диск. Мы там прикупили терабайт облака, и вот совсем недавно он уже начал забиваться.

Пока написать автоматический «удалятор» старых дампов руки не доходят, набросал простой скрипт для проверки свободного места и уведомления заббиксом меня об этом.

Подготавливаем токен для доступа к яндекс.диску по api:

  1. Заходим на https://tech.yandex.ru/disk/rest/, там есть ссылка на документацию и полигон
  2. В документации находим инструкцию, как получить токен ручками (https://tech.yandex.ru/oauth/doc/dg/tasks/get-oauth-token-docpage/). Там же находим страницу для создания приложения: https://oauth.yandex.ru/client/new
  3. Указываем произвольное название, выбираем Права: «Яндекс.Диск REST API» и справа галочку «Доступ к информации о Диске»
  4. В самом низу тыкаем пвсевдоссылку «Подставить URL для разработки» и жмем Сохранить.
  5. Копируем ID
  6. Открываем страницу https://oauth.yandex.ru/authorize?response_type=token&client_id=<идентификатор приложения> , подставляя скопированный ID в урле, нажимаем Разрешит, и перед нами наш токен. Сохраняем его, чтобы не потерять

Теперь с этим токеном можно поиграться на полигоне:

  1. Открываем https://tech.yandex.ru/disk/poligon/
  2. Вводим свой токен в поле
  3. Нас интересует раздел /v1/disk : Диск пользователя. Разворачиваем аккордеон, выбираем метод Get. Видим в описании список доступных полей, нам нужны total_space и used_space. Вписываем их через запятую в поле возвращаемых параметров.
  4. Жмем попробовать. Видим результат в виде json объекта с двумя записями. Если в ответе пишет Не авторизован — значит проблема с токеном, получаем еще раз и внимательно проверяем что ничего не перепутали.
  5. В поле URL запроса копируем адрес api, к которому будем обращаться из нашего скрипта

Теперь у нас есть нужный урл api яндекса и токен, можем писать скрипт

</p>
<p>#!/usr/bin/env python<br />
import pycurl<br />
import pprint<br />
import json<br />
from io import BytesIO</p>
<p>c = pycurl.Curl()<br />
data = BytesIO()</p>
<p>c.setopt(c.URL, 'https://cloud-api.yandex.net:443/v1/disk?fields=total_space%2C%20used_space')<br />
c.setopt(pycurl.HTTPHEADER, ['Authorization: OAuth &lt;токен&gt;'])<br />
c.setopt(c.WRITEFUNCTION, data.write)<br />
c.perform()</p>
<p>d = json.loads(data.getvalue())<br />
pprint.pprint((d['total_space']-d[&quot;used_space&quot;])/1024/1024/1024)</p>
<p>

Скрипт, в принципе, в комментариях не нуждается, отмечу только, что в последней строке мы вычитаем из общего размера нашего яндекс диска занятое пространство и приводим цифру к гигабайтам.

Теперь настроим заббикс:

  1. Кладем этот скрипт в папку /usr/lib/zabbix/externalscripts, я назвал его pyandex.py
  2. В заббиксе в Настройках для нужного Узла сети (в моем случае это Zabbix server, по дефолту) создаем новый элемент данных. В качестве имени указываем произвольное название, у меня это «Проверка места на яндекс диске», Тип: Внешняя проверка, Ключ — имя файла, который мы положили в папку в п.1. У меня это pyandex.py. Пишем без полного пути, просто имя скрипта
  3. Ставим нужный интервал обновления, здесь по потребностям. У меня стоит два раза в сутки. Сохраняем.
  4. Переходим в Мониторинг — Последние данные, смотрим на значение нашего новосозданного элемента данных.

Дальше по вкусу. Я настроил график, триггер (срабатывает при значении свободного места меньше 100 гигов), и уведомление смской. Соответственно, можно прогнозировать заполнение диска, работы по удалению старых и ненужных бекапов (или докупанию лишнего терабайта 😉