Transcript Check_mk
Check_mk
[et quelques autres outils que j'utilise pour mon monitoring]
Check_mk
Livestatus
Nagios dashboard
Mod_gearman
Raphael Mazelier
1 / 28
Check_mk : c'est quoi ?
C'est une sorte de super check pour nagios (ou tout autre nagios like)
contient de base plus 400 checks
fait de l'autodecouverte des checks sur les hotes (inventory)
automatisate la generation de la configuration nagios associe
ecrit en python (et extensible en python)
code par Mathias Kettner (aussi auteur de livestatus, multisite, wato)
open source (licence GPL)
projet et communaute tres active
2 / 28
Rappel sur les types de check nagios
check actif : c'est nagios qui schedule le check et qui recoit le resultat,
synchrone, c'est le type de check le plus utilise
check passif : le check n'est jamais schedule, nagios se contente de
recevoir le resultat via une methode externe, c'est une sorte de
conteneur. Le cas typique est pour gerer un evenement, par exemple une
trap snmp.
3 / 28
Exemple de differents type de checks
Cas classique :
exemple : check_http (actif, lance depuis le serveur de supervision)
Cas particuliers :
check_nrpe (check actif qui interroge un agent sur la cible distante,
qui lui meme execute un check local)
nsca (check passif, la cible envoie au serveur nagios qui recoie selon
le protocole nsca)
snmp (check actif qui interroge le demon snmp)
check_mk (melange d'un check actif + multiples checks passifs)
4 / 28
Fonctionnalites de check_mk
facilite (ou meme genre entierement) la configuration de nagios
perment l'autodiscovery des checks pertinents pour chaque cible
(inventory)
monitore tout types d'equipements
soit via un agent (unix/windows)
soit via snmp (check_mk integre un framework pour qui facilite la vie
pour faire un check snmp)
facilement extensible
soit en ecrivants des checks en python dans check_mk
soit en utlisant des checks existants (on parle de checks legacy)
soit en utilisant des checks nrpe existants (via)
sous windows on peut aussi lancer des scripts powershell
5 / 28
Architecture generale
1. un check actif par host, nagios schedule le check_mk compile pour cet
host
2.
check_mk se connecte a l'agent en tcp (ou en snmp) et lit tout l'output
check_mk decoupe chaque section, et les process a chacun de ses sous
checks
chaque sous partie est teste par le check en question qui le soumet en
check passif correspondant
3. bonus : check_mk stock les perf-data directement en rrd (optionnel)
4. il reinjecte pour chaque sous checks le resultat dans nagios dans les
differents checks passifs
6 / 28
Exemple d'utilisation minimale
Configuration d'un /etc/check_mk/main.mk minimal
all_hosts = [
'srv-01|Tag1'
]
Inventorize
nagios-01:/etc/check_mk# cmk -I srv-01
cpu.loads
1 new checks
cpu.threads
1 new checks
df
2 new checks
df_inodes
2 new checks
diskstat
1 new checks
exim_mailq
1 new checks
kernel
3 new checks
kernel.util
1 new checks
lnx_if
3 new checks
mem.used
1 new checks
mem.vmalloc
1 new checks
mounts
2 new checks
nfsmounts
2 new checks
ntp.time
1 new checks
ps
2 new checks
systemtime
1 new checks
tcp_conn_stats
1 new checks
uptime
1 new checks
7 / 28
Exemple d'utilisation minimale suite
Compilation
nagios-01:/etc/check_mk# cmk -C
Contenu du fichier d'inventaire
nagios-01:/var/lib/check_mk/autochecks# cat srv-01.mk
[
("srv-01", "cpu.loads", None, cpuload_default_levels),
("srv-01", "cpu.threads", None, threads_default_levels),
("srv-01", "df", '/', {}),
("srv-01", "df", '/data', {}),
("srv-01", "df_inodes", '/', df_inodes_default_levels),
("srv-01", "df_inodes", '/data', df_inodes_default_levels),
("srv-01", "diskstat", 'SUMMARY', diskstat_default_levels),
("srv-01", "exim_mailq", None, exim_mailq_default_levels),
("srv-01", "kernel", 'Context Switches', kernel_default_levels),
("srv-01", "kernel", 'Major Page Faults', kernel_default_levels),
("srv-01", "kernel", 'Process Creations', kernel_default_levels),
("srv-01", "kernel.util", None, kernel_util_default_levels),
("srv-01", "lnx_if", '2', {'state': ['1'], 'speed': 1000000000}),
("srv-01", "lnx_if", '3', {'state': ['1'], 'speed': 1000000000}),
...
]
8 / 28
Exemple d'utilisation minimale suite
Lancement du check compile
nagios-01:/var/lib/check_mk/precompiled# python ./srv-01 -v
Check_mk version 1.2.3i6
CPU load
OK - 15min load 0.01 at 16 CPUs
CPU utilization
OK - user: 0.2%, system: 0.1%, wait: 0.0%
Disk IO SUMMARY
OK - 23.47kB/sec read, 27.39kB/sec write, IOs: 4.46/sec, Latency: 0.34ms
Exim Queue
OK - Mailqueue length is 0
Interface 2
OK - [eth0] (up) 1GBit/s, in: 16.02kB/s, out: 41.09kB/s
Interface 3
OK - [eth1] (up) 1GBit/s, in: 111.65B/s, out: 26.57B/s
Interface 4
OK - [tap0] (up) 10MBit/s, in: 1.95B/s, out: 1.95B/s
Kernel Context Switches OK - 2115/s in last 99 secs
Kernel Major Page Faults OK - 0/s in last 99 secs
Kernel Process Creations OK - 2/s in last 99 secs
Memory used
OK - 0.93 GB used (0.85 GB RAM + 0.07 GB SWAP + 0.01 GB Pagetables, this is 11.7% of 7.91 GB RAM)
Mount options of / OK - mount options exactly as expected
Mount options of /data OK - mount options exactly as expected
...
Création de la configuration nagios et restart
nagios-01:/etc/check_mk# cmk -R
9 / 28
Exemple d'utilisation avec snmp
Configuration d'un /etc/check_mk/main.mk avec snmp
all_hosts = [
'srv-01|Tag1'
'switch-01|Tag2|snmp|v2c'
]
Resultat après inventaire
nagios-01:/var/lib/check_mk/autochecks# cat sw-01.mk
[
("sw-01", "cisco_cpu", None, cisco_cpu_default_levels),
("sw-01", "cisco_fan", 'Switch#1, Fan#1', None),
("sw-01", "cisco_fan", 'Switch#1, Fan#2', None),
("sw-01", "cisco_mem", 'Driver text', cisco_mem_default_levels),
("sw-01", "cisco_mem", 'I/O', cisco_mem_default_levels),
("sw-01", "cisco_mem", 'Processor', cisco_mem_default_levels),
("sw-01", "if64", '10103', {'state': ['1'], 'speed': 1000000000}),
("sw-01", "if64", '10104', {'state': ['1'], 'speed': 100000000}),
("sw-01", "if64", '10105', {'state': ['1'], 'speed': 1000000000}),
...
]
10 / 28
Agent unix
simple script shell qui est lance via (x)inetd extensible (MPRE) ou shell
...
echo '<<<mounts>>>'
grep ^/dev < /proc/mounts
# processes including username, without kernel processes
echo '<<<ps>>>'
ps ax -o user,vsz,rss,pcpu,command --columns 10000 | sed -e 1d -e 's/ *\([^ ]*\) *\([^ ]*\) *\([^ ]*\) *\([^ ]*\
) */(\1,\2,\3,\4) /'
# Memory usage
echo '<<<mem>>>'
egrep -v '^Swap:|^Mem:|total:' < /proc/meminfo
# Load and number of processes
echo '<<<cpu>>>'
echo "$(cat /proc/loadavg) $(grep -E '^CPU|^processor' < /proc/cpuinfo | wc -l)"
# Uptime
echo '<<<uptime>>>'
cat /proc/uptime
...
11 / 28
Agent unix suite
configuration xinetd
# This file is being maintained by Puppet.
# DO NOT EDIT
service check_mk
{
disable
= no
socket_type
= stream
protocol
= tcp
wait
= no
user
= root
group
= root
server
= /usr/local/sbin/check_mk_agent
port
= 6556
type
= UNLISTED
}
12 / 28
Agent unix suite
output de l'agent
nagios-01:/ # telnet srv-01 6556
Trying 10.6.0.36...
Connected to srv-01.srvc.paritel.priv.
Escape character is '^]'.
<<<check_mk>>>
Version: 1.2.1i1
AgentOS: linux
PluginsDirectory: /usr/lib/check_mk_agent/plugins
LocalDirectory: /usr/lib/check_mk_agent/local
AgentDirectory: /etc/check_mk
OnlyFrom:
<<<df>>>
/dev/sda1
ext3
48062440 13619656 32001308
30% /
/dev/sda3
ext3 430205612 322276072 86076324
79% /data
<<<nfsmounts>>>
/data/olympe/files/aps/aps_fs ok 77408737 52992933 49060799 8192
/data/olympe/files/fax_ws ok 619269896 423943460 392486388 1024
<<<mounts>>>
/dev/disk/by-uuid/3387ca91-d8cb-484f-8144-90781ef5c7e2 / ext3 rw,relatime,errors=remount-ro,data=ordered 0 0
/dev/sda3 /data ext3 rw,relatime,errors=continue,acl,data=ordered 0 0
<<<ps>>>
(root,2036,88,0.0) init [2]
(root,0,0,0.0) [kthreadd]
(root,0,0,0.0) [migration/0]
(root,0,0,0.0) [ksoftirqd/0]
(root,0,0,0.0) [watchdog/0]
13 / 28
Agents (autre)
windows (installeur msi) meme output
extensible via powershell
pas d'agent (snmp)
agent spéciaux
pour le moment l'agent vmware vshpere
14 / 28
Liste des checks pris en charge par défaut
15 / 28
Exemple d'une configuration un peu
plus avancée
ignored_services = [
( ALL_HOSTS, [ "NIC ppp" ] )]
# ignored mem on core-router
ignored_checks = [
( [ "hr_mem" ], [ "Juniper_router_mk_snmp" ], ALL_HOSTS ),
]
inventory_services = [
'MSSQLSERVER', 'SQLSERVERAGENT',
]
bulkwalk_hosts = [
( ["v2c"], ALL_HOSTS )
]
filesystem_default_levels = {
"levels" : (90.0, 95.0)
}
mem_vmalloc_default_levels = (80.0, 90.0, 50.0, 30.0)
cisco_mem_default_levels = (87.0, 95.0)
postfix_mailq_default_levels = (100, 200)
ntp_default_levels = (10, 500.0, 700.0)
systemtime_default_values = (3, 20)
generate_hostconf = False
generate_dummy_commands = False
# yes we want this
always_cleanup_autochecks = True
16 / 28
Exemple d'une configuration un peu plus
avancée special esx
# woot
_esx_hostnames = [ _a.split("|")[0] for _a in all_hosts if _a.split("|")[1] == 'Esx_mk' ]
# memory are used
esx_host_mem_default_levels = ( 89.0, 95.0 )
# special vsphere agent
special_agents.setdefault('vsphere', [])
special_agents['vsphere'] = [
( {'direct': True, 'secret': 'xxxx', 'infos': [ 'hostsystem', 'virtualmachine', 'datastore', 'counters', 'required'
, 'user': 'root'}, [], _esx_hostnames ),
]
# piggyback translation
piggyback_translation = [
( {'case': 'lower'}, [], _esx_hostnames ),
]
17 / 28
Exemple d'extension : check de la
mailq exim
code du greffon coté client
nagios-01:/usr/lib/check_mk_agent/plugins# cat exim_mailq
#!/bin/sh
if which exim >/dev/null 2>&1 && getent passwd Debian-exim >/dev/null 2>&1;
then
echo '<<<exim_mailq>>>'
exim -bpc
fi
18 / 28
Exemple d'extension : check de la
mailq exim suite
code coté check_mk
#!/usr/bin/python
exim_mailq_default_levels = (10, 20)
def inventory_exim_mailq(checkname, info):
if len(info) > 0 and info[0] != '':
return [(None, 'exim_mailq_default_levels')]
else:
return []
def check_exim_mailq(item, params, info):
count = int((info.pop())[0])
if count > params[1]:
return (2, 'CRITICAL - Mailqueue length is %d '
'(More than threshold: %d)' % (count, params[1]))
elif count > params[0]:
return (1, 'WARNING - Mailqueue length is %d '
'(More than threshold: %d)' % (count, params[0]))
else:
return (0, 'OK - Mailqueue length is %d ' % count)
return (3, 'UNKNOWN - Could not find summarizing line in output')
check_info['exim_mailq'] =
(check_exim_mailq, "Exim Queue", 1, inventory_exim_mailq)
19 / 28
Exemple d'extension en snmp (cpu
redback)
#!/usr/bin/python
redback_cpu_default_levels = (70, 90)
def inventory_redback_cpu(checkname, info):
inventory = []
index = 0
for cpu in info:
inventory.append( (index, "", redback_cpu_default_levels) )
index += 1
return inventory
def check_redback_cpu(item, params, info):
if len(info) == 1:
cpu_load = int(info[0][2])
if cpu_load >= 0 <= 100:
status = 0
output = ''
if cpu_load >= params[1]:
status = 2
output = ' (Above %d%%)' % params[1]
elif cpu_load >= params[0]:
status = 1
output = ' (Above %d%%)' % params[0]
return (status, '%s - CPU load is %d%% %s' % (nagios_state_names[status], cpu_load, output),
[('load', '%d%%' % cpu_load, params[0], params[1], 0, 100)])
return (3, "UNKNOWN - Invalid information in snmp data")
check_info['redback_cpu'] = (check_redback_cpu, "CPU%s", 0, inventory_redback_cpu)
snmp_info['redback_cpu'] = ( ".1.3.6.1.4.1.2352.2.6.1", ["1","2","3"] )
snmp_scan_functions['redback_cpu'] = lambda oid: "redback" in oid(".1.3.6.1.2.1.1.1.0").lower()
20 / 28
Integration avec l'existant
Par defaut check_mk s'attend a gerer tout la configuration de nagios. Cela peut
etre ennuyeux si on avait deja un outil de generation de configuration
Integration avec centreon (pas taper)
J'ai cree un module/plugins centreon :
1. ce module commence par generer la liste des hosts qui font du
check_mk (selon leur host_template, avec ou sans snmp)
2. ensuite il lance un inventory complet (a changer car tres long)
3. on compile tout les checks et on cree seulement la configuration
nagios des services check_mk
4. je reinjecte la configuration ainsi generee dans centreon (gros tricks)
5. ensuite centreon cree sa configuration comme d'habitude
=> Laid mais fonctionnel :)
Integration via puppet
L'ensemble de la configuration etant textuelle cela ne pose aucun probleme.
Je deploie avec puppet les agenst, les checks, etc...
21 / 28
Etat du projet
Bien :
tres actif (une release tout les mois au moins)
communaute tres active
quatre cents de checks tout prets, et plus a chaque release
un exchange pour les checks non integre : http://exchange.check-mk.org/
auteur reactif sur la ML
Moins bien :
l'auteur a monte sa boite et les nouvelles features sont d'abord dans la
version "commerciale"
les nouvelles features meme open (check_esx par exemple sont mal
documente, ou seulement documente pour wato)
22 / 28
Ce que m'a apporte check_mk
ca a resolue mes problems des perfs car effectue en un check actif tout les
checks d un host (100 fois plus de checks chez moi, j'ai divisé par 5 la load)
cree les checks automatiquements pour tout les trucs courants (disk, if,
etc...)
cree aussi les checks courants pour les equipements reseaux (interfaces,
erreurs)
rationnalise l'ecriture des probes de monitoring (on peut voir ca comme
un framework de check)
23 / 28
Livestatus
Autre projet de Mathias, mais non lie a check_mk
Broker qui permet d'interroger l'etat des objets nagios (tout est en
memoire)
Interrogeable via une api (en fait un DSL, le LQL sorte de SQL plus simple)
Utilise par beaucoup d'interface : multisite (celle de mathias), thruk la plus
complete a l'heure actutelle, la mienne :) , etc...
permet de virer l'horrible NDO, et la BDD qui allait avec, qui tuait les perfs
24 / 28
NagiosDashbord
Exemple d'une tactical overview homemade utilisant livestatus
25 / 28
Mod_gearman
Solution de distribution de checks la plus evolué et simple selon moi
but : reduire la charge sur le central nagios et distribuer les checks sur
differents serveurs
permet a nagios de pouvoir faire jusqu'à une centaine de check/secondes
loadbalacing entre tout les workers
failover sur on a des workers differents
configuration reelement facile
ameliore meme les perfs avec un seul serveur
26 / 28
Mod_gearman : schema d'architecture
generale
27 / 28
Questions ?
28 / 28