Привет! Я попытался написать плагин для проверки Nagios, который сообщает, есть ли на текущий день задачи Proxmox Backup Server со статусом предупреждение или ошибка.
Python:
#!/usr/bin/python3
# Импорт библиотек
import sys, getopt, requests, urllib3, json
urllib3.disable_warnings()
from datetime import datetime, time, timezone
# Переменные конфигурации
fqdn_pbs = ''
api_token_pbs = ''
debug = False
# Обработка аргументов командной строки
options, remainder = getopt.gnu_getopt(sys.argv[1:], 'hdf:t:')
for opt, arg in options:
if opt == '-h':
print('check_pbs.py -d (debug) -f <PBS server fqdn> -t <API token: <username>@pbs!<api id>:<api secret>>')
sys.exit()
if opt == '-d':
debug = True
if opt == '-f':
fqdn_pbs = arg
elif opt == '-t':
api_token_pbs = 'PBSAPIToken=' + arg
if fqdn_pbs == '' or api_token_pbs == '':
print('check_pbs.py -d (debug) -f <PBS server fqdn> -t <API token: <username>@pbs!<api id>:<api secret>>')
sys.exit(1)
# Задаём глобальные переменные
taskoutput = []
processfailure = 0
# Функция для запроса к API PBS
def get_pbs_tasks(fqdn, status, apitoken):
totaltasks = 0
midnight = datetime.combine(datetime.today(), time.min)
resp = requests.get("https://" + fqdn + ":8007/api2/json/nodes/localhost/tasks?limit=0&statusfilter=" + status + "&since=" + midnight.strftime('%s'), verify=False, timeout=5, headers={'Authorization': apitoken})
if resp.status_code == 401:
taskoutput.append("Ошибка аутентификации для https://" + fqdn + ":8007")
taskoutput.append('')
return [False, 0]
if resp.status_code == 200:
jsondata = resp.json() # Смотрите документацию по JSON-ответу ниже
if debug:
print(json.dumps(jsondata, indent=2)) # Печатаем полный json для отладки
print('')
for i in jsondata['data']:
taskoutput.append('worker_id: ' + i['worker_id'])
taskoutput.append('worker_type: ' + i['worker_type'])
taskoutput.append('user: ' + i['user'])
taskoutput.append('type: error')
taskoutput.append('status: ' + i['status'])
taskoutput.append('starttime: ' + str(datetime.fromtimestamp(i['starttime'])))
taskoutput.append('endtime: ' + str(datetime.fromtimestamp(i['endtime'])))
taskoutput.append('')
totaltasks += 1
return [True, totaltasks]
if resp.status_code != 200:
taskoutput.append("Не удалось получить или обработать данные с https://" + fqdn + ":8007")
taskoutput.append('')
return [False, 0]
### Обработка задач PBS сервера
taskoutput.append('')
taskoutput.append('Неудачные задачи за сегодня на ' + fqdn_pbs + ':')
taskoutput.append('')
pbs_errors = 0
pbs_warnings = 0
result = get_pbs_tasks(fqdn_pbs, "error", api_token_pbs)
if result[0] == True:
pbs_errors += result[1]
else:
processfailure += 1
result = get_pbs_tasks(fqdn_pbs, "warning", api_token_pbs)
if result[0] == True:
pbs_warnings += result[1]
else:
processfailure += 1
taskoutput.append('errors: ' + str(pbs_errors) + ' warnings: ' + str(pbs_warnings))
taskoutput.append('')
### Вывод и возврат статуса и производительных данных для Nagios
# Если ошибка обработки — статус UNKNOWN
if processfailure > 0:
print('SERVICE STATUS: UNKNOWN | errors=' + str(pbs_errors) + ' warnings=' + str(pbs_warnings))
for outputline in taskoutput:
print(outputline)
sys.exit(3)
# OK, если нет ошибок и предупреждений
if pbs_errors == 0 and pbs_warnings == 0:
print('SERVICE STATUS: OK | errors=' + str(pbs_errors) + ' warnings=' + str(pbs_warnings))
for outputline in taskoutput:
print(outputline)
sys.exit(0)
# Предупреждение, если ошибок нет, но есть предупреждения
if pbs_errors == 0 and pbs_warnings > 0:
print('SERVICE STATUS: WARNING | errors=' + str(pbs_errors) + ' warnings=' + str(pbs_warnings))
for outputline in taskoutput:
print(outputline)
sys.exit(1)
# Ошибка, если есть одна или более ошибок
if pbs_errors > 0:
print('SERVICE STATUS: ERROR | errors=' + str(pbs_errors) + ' warnings=' + str(pbs_warnings))
for outputline in taskoutput:
print(outputline)
sys.exit(2)
Используйте на здоровье.