Centreon是一款功能强大的分布式IT监控系统,它通过第三方组件可以实现对网络、操作系统和应用程序的监控:首先,它是开源的,我们可以免费使用它;其次,它的底层采用nagios作为监控软件,同时nagios通过ndoutil模块将监控到的数据定时写入数据库中,而Centreon实时从数据库读取该数据并通过Web界面展现监控数据;,最后,我们可以通过Centreon管理和配置nagios,或者说Centreon就是nagios的一个管理配置工具,通过Centreon提供的Web配置界面,可以轻松完成nagios的各种繁琐配置。
此外,Centreon还支持NRPE、SNMP、NSClient等插件,可以通过这些插件构建分布式的监控报警系统。
一个典型的Centreon监控系统一般有六大部分组成,分别是Centreon Web、centengine、Centreon Broker SQ、Centreon Broker RRD、centcore和cbmod,下面重点看看每个组成部分是如何协调工作的,如下图所示。
对上图的结构介绍如下:
Centreon Web界面是基于Apache Web服务器,用来配置和展示。
centengine是Centreon的底层监控引擎,主要完成监控报警系统所需的各项功能,是Centreon监控系统的核心。另外,Centreon还支持Nagios、Icinga等监控引擎。这里介绍官方的centengine监控引擎。
Centreon Broker SQL将信息存储到MariaDB数据库,并将其转发给Centreon Broker RRD。
Centreon Broker RRD使用数据生成和更新RRD文件,以显示状态、性能图。
centcore主要用于centreon的分布式监控系统中,在系统中centcore是一个基于perl的守护进程,主要负责中心服务器(central server)和扩展节点(pollers)间的通信和数据同步等操作,例如centcore可以在中心服务器上执行对远程扩展节点上centengine服务的启动、关闭和重启操作,还可以运行、更新扩展节点上的配置文件。
cbmod是将centengine与数据库进行连接的工具,它可以将centengine的实时状态写入数据库,以供其他程序去调用,最终可以实现在一个控制台上完成所有扩展节点的数据入库操作。
Centreon的安装有一定的复杂性,在安装上有ISO镜像安装、VM虚拟机安装、源码编译安装和yum源安装四种方式,源码编译安装较复杂,出错几率也较高,因此这里推荐采用ISO镜像安装方式进行安装。
从https://download.centreon.com/
下载需要的版本即可,这里下载iso镜像,使用最新的centreon-18.10-5.el7.x86_64版本。将下载下来的镜像克隆成光盘,或者直接在虚拟机下以iso模式进行引导,即可开始安装系统,其实这个iso镜像就是一个centos操作系统镜像,只不过系统中集成了centreon的安装环境和安装包,只要将操作系统安装完成,那么centreon也就安装好了,可以直接使用,这是最简单的一种安装方式。
下面简单说下centreon的iso镜像安装过程。
将iso刻录为光盘或者U盘,然后引导,进行安装,首先进入第一步,如下图所示:
接着,选择一种语言,如下图所示:
语言选择默认英文即可,然后点击“Continue”进入下一步,如下图所示:
在这个主界面下,可以对安装系统进行各种设置,这里对安装类型要进行选择,点击“Installation type”,进入如下界面:
这里有四个选项供选择,分别是:
Central with database:表示安装Centreon(Web界面和数据库),监控引擎和代理。也就是完全安装。
Central without database:安装Centreon(仅限Web界面),监控引擎和代理。
poller:仅安装轮询器(仅限监视引擎和代理)。
database only:仅仅安装数据库服务器。
这里选择第一个即可,然后点击左上角的“Done”即可返回主界面,接着开始对磁盘进行分区设置,如下图所示:
点击“INSTALLATION DESTINATION”进行磁盘分区设置,如下图所示:
这里选择“ I will configure partitioning”,也就是自定义分区,然后点击左上角的“Done”进入下一步,如下图所示:
在这个自定义分区界面中,建议按照上图的设置进行分区。分区完成点击左上角的“Done”进入下一步,
根据提示,选择“Accept Changes”返回主界面,接着,在主界面选择“NETWORK &HOST NAME”进行主机名和网络配置,网络配置选择手动配置静态IP,如下图所示:
网络配置完成,保存退出,返回网络和主机名配置界面,如下图所示:
网络配置完成后,点击左上角的“Done”返回主界面,最后选择主界面下的“DATE & TIME”进入时间和时区配置,如下图所示:
时区选择亚洲/上海即可,然后点击左上角的“Done”返回主界面,至此,系统安装配置全部完成,如下图所示:
点击“Begin Installation”开始安装系统。
系统安装完成后,系统里面集成的centreon服务会自动启动,接着就可以初始化centreon配置了,打开浏览器访问centreon服务地址:
通过URL登录Centreon Web界面:http:// [SERVER_IP] /centreon。将显示Centreon设置向导。如下图所示:
这是centreon欢迎界面,单击“ next”,如下图所示:
继续单击“ next”,如下图所示:
这些默认的配置都无需修改,直接单击“ next”,如下图所示:
继续单击“ next”,如下图所示:
这里是设置centreon管理员用户admin的密码和用户信息,手动输入后,单击“next”,如下图所示:
这里只需要输入数据库用户centreon的密码即可,centreon用户会自动创建。手动输入后,单击“next”,如下图所示:
单击“ next”,如下图所示:
单击“install”,安装模块和插件,如下图所示:
单击“ next”,如下图所示:
安装完成。单击Finish。
配置Centreon并不复杂,所有操作都能在web管理界面完成,如果对nagios的配置过程比较了解,那么配置Centreon就变得非常简单。下面先来熟悉一下Nagios中配置文件之间的关系。
在Nagios的配置过程中涉及几个定义:主机、主机组、主机模板,服务、服务组、服务模板,联系人、联系人组、监控时间和监控命令等,从这些定义可以看出,Nagios的各个配置文件之间是互为关联,彼此引用的。成功配置一台Nagios监控系统,必须要弄清楚每个配置文件之间依赖与被依赖的关系,其中,最重要的有四点:第一要定义监控哪些主机、主机组、服务和服务组;第二要定义这个监控要通过什么命令实现;第三要定义监控的时间段;最后要定义主机或服务出现问题时要通知的联系人和联系人组。
Centreon的配置逻辑和过程与Nagios完全相同,因此,清楚了Nagios的配置重点和各个配置文件之间的依赖关系,Centreon的配置将变得比Nagios更加简单。
在Centreon早期版本中,安装完成后,会有一些初始的主机或服务的监控项,但是在centreon最新版本中,去掉了默认的主机,服务和模板,而是通过插件的形式提供模板、通知等基础功能,但这并不影响我们的学习和使用。
1、创建一个check_host_alive命令
监控命令(Commands)是Centreon分布式监控系统运行的基础,无论是主机还是服务,都是通过监控命令完成状态检查和报警的。经常使用的监控命令分为两种,分别是检测(Check)命令和通知告警(Notification)命令。
在Centreon系统中,选择Configuration—>Commands—>Checks,即可看创建监控检测命令,选择Configuration—>Commands—>Notifications,即可看到自带的通知告警命令,例如常用的host-notify-by-email、service-notify-by-email等。
选择Configuration—>Commands—>Checks,点击add创建一个命令,如下图所示:
其中,“Command Name”为check_host_alive;“Command Type”为“Check”;“Command Line”是命令的具体执行方式,命令中“$USER1$”是一个变量,其实就是nagios插件或centreon插件的存放路径,“$HOSTADDRESS$”是个主机宏,用于取主机定义里的IP地址或者主机名,这些内容的含义与在Nagios下表示的含义完全相同,这里不再过多介绍。
2、配置主机模板generic-host
登录centreon web,在左侧导航中,选择Configuration > Hosts >
Templates,然后点击“add”按钮,先创建一个模板文件,如下图所示:
主机模板,顾名思义,是对主机默认属性或通用属性的设置。只有主机引用了这个模板,那么此模板的设置值就继承到主机里面了。一些基础的主机监控,比如主机检查属性、报警通知属性、自定义宏属性等都可以在主机模板中进行设置,当然也可以在定义主机监控的时候设置这些属性。
主机模板的一个最大特点是继承性,如果一个主机引用了这个模板,那么此主机模板下的所有监控属性都被自动继承过来了,例如要对1000台主机做ping连通性检查,首先可以创建一个check_ping命令,然后将这个命令引用到generic-host模板中,最后在创建主机的时候,所有1000台主机都引用generic-host这个主机模板即可,引用主机模板的好处是,如果监控属性发生了变化,只需修改generic-host配置即可,而无需一个主机一个主机的修改,方便快捷。
有时候可能会发现一个监控属性既在generic-host模板中设置了,也在主机定义中设置了,此时就有一个优先级的问题,在这种情况下,监控属性的生效值以主机中的设置为准。例如,已经在generic-host中设置了Check
Period为“24x7”,而在某主机的定义中也引用了generic-host模板,同时将Check Period设置改为“workhours”,那么此主机监控周期最终生效的设置是“workhours”。
在上图可以看到一些主机检查属性值,例如,“Max Check Attempts” 表示最大检查尝试次数,“Normal Check Interval”表示正常检查间隔,单位是分钟,“Retry Check Interval”表示重试检查间隔,单位是分钟。这些主机检查属性值都需要根据实际情况进行修改或添加。
点击上图中的“Notification”标签,用来设置告警通知属性模板,如下图所示:
告警通知属性主要是对是否启用告警、告警联系人、告警周期、告警类型等进行设置,上图已经很清楚的描述了每个选项的含义,这里不再多说。
3、添加主机监控
选择Configuration—>Hosts—>Hosts,点击Add添加一个主机,如下图所示。首先添加一个172.16.213.188主机,此主机无需设置更多的属性,只需要引用模板即可,模板就选择之前我们创建的“generic-host”,这样,此主机的所有属性就配置完成了,因为更多的主机属性都通过指定的主机模板继承进去了。
当然,我们也可以在主机属性中重新指定配置项,例如可以在“Check
Command”项中添加一个新的用于检测主机状态的命令,这个命令定义以后,主机模板中定义的主机检测命令就被覆盖了。
要添加更多的主机,方法与上面完全相同。下面依次添加多台主机,如下图所示:
在这个界面上,有很多操作属性,可以用于对主机进行复制、删除、修改、启用和禁用等,由此可见,通过Centreon管理主机非常方便和简单。
4、添加主机组监控
选择Configuration—>Hosts—>Host Groups,点击Add添加一个主机组,如下图所示,依次输入“Host Group Name”和“Alias”的值,然后在“Linked Hosts”中选择此主机组需要加入的主机即可,添加完毕,点击“Save”即可完成主机组的添加。
当一批主机有某些相同的服务需要监控的时候,将这些主机添加到一个主机组中,然后创建一个需要监控的服务,将这个主机组加到此服务中,这样就完成了对批量主机的某些相同服务的监控,省去了一个主机添加一个服务的麻烦,非常方便。
从上图可以看到,添加了一个名为hostgroup1的主机组,然后将8台主机添加到了这个组中。一个主机可以属于多个主机组。
添加一台主机非常简单,但是如果有成千上万台主机需要添加呢,一个个添加显然是不行的,此时就需要通过批量添加主机的方法实现。这其实是借助于Centreon的模板功能完成的,其基本原理是:先把批量主机的共同属性添加到主机模板中,然后在批量添加主机时,引用这个主机模板即可。这样在添加每个主机时不同的属性只有IP地址和主机名,只要把这两个值写入数据库即可完成主机的添加。
下面是一个写好的批量添加主机的perl脚本:
#!/usr/bin/perl
use strict;
use warnings;
use DBI;
use DBD::mysql;
# ----------------------------------------------------
my $DB_HOST = "127.0.0.1"; #监控服务器的IP地址,建议修改为127.0.0.1
my $DB_USER = "centreon"; # Centreon web安装时设置的数据库访问用户,默认为centreon
my $DB_PASSWD = "centreon"; # Centreon web安装时设置的数据库密码,这里为centreon
my $DB_NAME = "centreon"; # Centreon web 对应的数据库名,默认是centreon
my $dbh = DBI->connect("DBI:mysql:database=$DB_NAME;host=$DB_HOST",
"$DB_USER", "$DB_PASSWD", { RaiseError => 1 });
# ----------------------------------------------------
my $file_path = "/var/tmp/hosts"; #hosts模板文件,需要自己创建
my $tpl_name = "generic-host"; #主机模板,填写批量添加的主机需要继承的模板
my $nagios_name = "Central"; #poller,默认为Central
foreach my $arg (@ARGV) {
# == file of hostname and ipaddress ==
if ($arg eq ‘-f‘) {
$file_path = shift;
}
# == name of template ==
elsif ($arg eq ‘-t‘) {
$tpl_name = shift;
}
# == name of nagios name ==
elsif ($arg eq ‘-n‘) {
$nagios_name = shift;
}
else {
&print_help();
exit 1;
}
}
# -----------------------------------------------------
open (HOST, "$file_path") || die "Cannot open $file_path for read";
my $sql;
my $sth;
my $line;
my ($host, $ipaddr);
my ($host_id, $tpl_id, $nagios_id) = (0, 0, 0);
while (defined($line = <HOST>)) {
# == skip blank lines =================
next if ($line =~ /^\s*$/);
# == skip if # ========================
next if ($line =~ /^\s*#/);
# == get host and ipaddress ===========
($ipaddr, $host) = split(/\s+/, $line);
next if ($ipaddr eq ‘‘ || $host eq ‘‘);
# == insert the host to table host ====
$sql = "insert host set
host_template_model_htm_id=‘2‘,host_name=‘$host‘,host_alias=‘$host‘,host_address=‘$ipaddr‘,host_active_checks_enabled=‘2‘,host_passive_checks_enabled=‘2‘,host_checks_enabled=‘1‘,host_event_handler_enabled=‘2‘,host_flap_detection_enabled=‘2‘,host_process_perf_data=‘2‘,host_retain_status_information=‘2‘,host_retain_nonstatus_information=‘2‘,host_notifications_enabled=‘2‘,host_register=‘1‘,host_activate=‘1‘";
$sth = $dbh->do($sql);
sleep(1);
# == get host_id ======================
$sql = "select host_id from host where host_name=‘$host‘";
$sth = $dbh->prepare($sql);
$sth->execute();
while (my $ref = $sth->fetchrow_hashref()) {
$host_id = $ref->{‘host_id‘};
print "host_id is $host_id\n";
}
next if ($host_id == 0);
# == insert extended_host_information ==
$sql = "insert extended_host_information set host_host_id=‘$host_id‘";
$sth = $dbh->do($sql);
# == insert host_template_relation =====
$sql = "select host_id from host where host_name=‘$tpl_name‘";
$sth = $dbh->prepare($sql);
$sth->execute();
while (my $ref = $sth->fetchrow_hashref()) {
$tpl_id = $ref->{‘host_id‘};
print "template id is $tpl_id\n";
}
next if ($tpl_id == 0);
$sql = "insert host_template_relation set host_host_id=‘$host_id‘,host_tpl_id=‘$tpl_id‘,`order`=‘1‘";
$sth = $dbh->prepare($sql);
$sth->execute();
# == insert ns_host_relation ===========
$sql = "select id from nagios_server where name=‘$nagios_name‘";
$sth = $dbh->prepare($sql);
$sth->execute();
while (my $ref = $sth->fetchrow_hashref()) {
$nagios_id = $ref->{‘id‘};
print "Poller id is $nagios_id\n";
}
next if ($nagios_id == 0);
$sql = "insert ns_host_relation set host_host_id=‘$host_id‘,nagios_server_id=‘$nagios_id‘";
$sth = $dbh->prepare($sql);
$sth->execute();
# == insert complete ==
print