Когда инфраструктура описана и управляется системой конфигурации, то эту систему было бы неплохо замониторить во все места. С удивлением обнаружил, что на работе не проверяется ошибка при компиляции каталога 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.