Ideas of CMDB, cfengine and nagios integration

For a while we’ve been discussing how we can become as lazy as possible when it comes to systemadministration, and this time we’ve made a quite neat integration between our homemade CMDB, cfengine and nagios.

Here’s the idea:

First of all, nobody likes to manually update a CMDB. Also its never really possible to maintain it in a way that makes its info become obsolete after some time. This is why we made a script, cfcmdb, that is triggered from cfengine on every host. This script fills the CMDB database with all sort of info from tools like dmidecode and also from standard commandline tools. (Memory, networkingcards, os version, cpu, vendor etc etc). So now our CMDB pretty much keeps itself up to date.

Lately we came up with the idea to fill our CMDB with cfengine classes information. So adding to the cfcmdb script mentioned above :

cfagent –no-splay -p -v | grep Defined

..and a little perl split and join, we now have all the classes in our CMDB bount to hostid’s.

Cool. On our nagios-server, we made another script, cmdb2nagios, which takes the parameters “hosts”, “hostgroups” or “services”.

cmdb2nagios hosts : creates the nagios host-config file

cmdb2nagios hostgroups : creates the nagios hostgroup-config file

cmdb2nagios services : creates the servicefile

The services parsing is quite nice now, cause we can automatically monitor any services set up with cfengine. Lets say we have a bunch of hosts installed with cfengine and cfengine tells them to have apache2 running. That means that this will be part of a cfengine class, that will be available in our CMDB.

Example of cmdb2nagios service parsing :

[snip]

$sql = “select hosts.name from hosts,classes where classes.name = ‘class_apache’ and hosts.hostid = classes.hostid”;
$execute = $connect->query($sql) or die “wtf? it didnt work …check syntax.”;
my @servicehosts;
while (@results = $execute->fetchrow()) {
push(@servicehosts, $results[0]);
}

$hosts = join(”,”,@servicehosts);
print “define service{\n”;
print “\tuse\t\t\tgeneric-service\n”;
print “\thost_name\t\t” . $hosts . “\n”;
print “\tservice_description\tcfg_CHECK_APACHE\n”;
print “\tis_volatile\t\t0\n”;
print “\tmax_check_attempts\t1\n”;
print “\tnormal_check_interval\t5\n”;
print “\tretry_check_interval\t1\n”;
print “\tcontact_groups\t\tlinux-admins\n”;
print “\tnotification_period\t24×7\n”;
print “\tnotification_options\tc,w,r\n”;
print “\tprocess_perf_data\t1\n”;
print “\tcheck_command\t\tcheck_apache\n”;
print “\t}\n\n”;
[snip]

As you can see, monitoring apache will be applied to all hosts running apache.

This leaves us to really only having to maintain our cfengine configuration, while the CMDB is auto-updated and the nagios-config is auto-parsed.

Also our eventhandlers in nagios tells cfengine to do this and that, so now we can sit back, enjoy a coffee and watch this show.

(see previous post about eventhandlers and cfengine : http://www.sladder.org/?p=261)

Be Sociable, Share!

Tags: , ,

Leave a Reply