мониторинг puppet agent


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

puppet agent -t
Info: Retrieving pluginfacts
Info: Retrieving plugin
Info: Loading facts
Error: Could not retrieve catalog from remote server: Error 400 on SERVER: Invalid parameter uers on Class[Users::Test] at /etc/puppet/environments/hadoop/manifests/init.pp:36 on node centos7.local
Warning: Not using cache on failed catalog
Error: Could not retrieve catalog; skipping run

Решено было написать скрипт для эффективного мониторинга puppet агента. Сказано — сделано. В скрипте проверяются время последнего запуска, ошибки при компиляции, ошибки ресурсов и событий. Скрипт принимает единственный аргумент: максимальное время с последнего запуска в секундах, по умолчанию 2 часа. Если puppet запускался раньше указанного кол-ва секунд назад, то скрипт сообщит об этом. Данный код работает для puppet >= 2.7 Он парсит файл отчета /var/lib/puppet/state/last_run_summary.yaml

#!/usr/bin/env python
# -*- coding: utf-8 -*-
import os
import sys
import yaml
import datetime

try:
    report = yaml.load(open('/var/lib/puppet/state/last_run_summary.yaml', 'r'))
except:
    print('ERROR: unable to open/parse /var/lib/puppet/state/last_run_summary.yaml')
    sys.exit(1)
try:
    failed_resources = report['resources']['failed']
    failed_events = report['events']['failure']
    run_time = report['time']['last_run']
except:
    print('ERROR: puppet compilation failed')
    sys.exit(1)
if len(sys.argv) > 1:
    threshold = int(sys.argv[1])
else:
    threshold = 7200
if os.path.isfile('/var/lib/puppet/state/agent_disabled.lock') or \
        os.path.isfile('/var/lib/puppet/state/puppetdlock'):
    print('WARN: puppet is disabled, not checking anything')
    sys.exit(0)
if (int(datetime.datetime.now().strftime('%s')) - int(run_time)) > threshold:
    print('ERROR: last puppet run was more than {0}s ago'.format(threshold))
    sys.exit(1)
elif int(failed_resources) > 0 or int(failed_events) > 0:
    print('ERROR: {0} failed resources, {1} failed events'.format(failed_resources,
        failed_events))
    sys.exit(1)
else:
    print('OK')
    sys.exit(0)

Пример работы:

python check_puppet.py
ERROR: puppet compilation failed
echo $?
1
python check_puppet.py 5
ERROR: last puppet run was more than 5s ago

Если все хорошо, то скрипт мониторинга завершится с сообщением OK.

comments powered by Disqus