Ganglia 和 Nagios,第 1 部分: 用 Ganglia 监视企业集群(5)

基本 Ganglia 安装已经给我们提供了大量有用信息。使用 Ganglia 的插件将给我们提供两种添加更多功能的方法:

通过添加带内(in-band)插件。 通过添加一些其他来源的带外(out-of-band)欺骗。

第一种方法一直是 Ganglia 的常见实践。第二种方法是最新开发的实践,并且与 Nagios 在功能上有所交叠。让我们通过一个实际示例来简要探究两种方法。

带内插件

带内插件可以通过两种方式发生。

第一种方法是过去常采用的方法,并且我将在下一节中讨论更多关于带外插件的内容。它的问题是无法干净地完成。Ganglia 3.1.x 添加了 Python 和 C 模块插件以使其看上去可以更加自然地扩展 Ganglia。此刻,我将向您展示第二种方法。

首先,用 Ganglia 启用 Python 插件。执行以下操作:

编辑 /etc/ganglia/gmond.conf 文件。

如果打开该文件,您会注意到:其中四分之一的内容都是类似如下所示的名为 modules 的部分:

modules { module { name = "core_metrics" } ... }  

我们将向模块部分添加另一个模块。这个必须添加的模块就是:

module { name = "python_module" path = "modpython.so" params = "/usr/lib64/ganglia/python_modules/" }  

在 gmond.conf 中,我在第 90 行添加了上一个代码段。这将允许 Ganglia 使用 Python 模块。此外,还在 include ('/etc/ganglia/conf.d/*.conf') 语句后添加一些行,添加 include ('/etc/ganglia/conf.d/*.pyconf') 行。这些包括了要添加的内容的定义。

创建一些目录。

如下所示:

mkdir /etc/ganglia/conf.d mkdir /usr/lib64/ganglia/python_modules  

在所有节点上重复执行步骤 1 和 2。

为此,执行下面的操作:

把新的 gmond.conf 复制到要监视的各个节点上。 在要监视的各个节点中创建步骤 2 中所示的两个目录,以便它们也可以使用 Python 扩展。

现在已经设置好节点可以准备运行 Python 模块了,让我们创建一个新模块。在本例中,我们将添加一个使用 Linux IPMI 驱动程序的插件。如果不熟悉 IPMI 并且使用的是现代的 Intel 和 AMD 计算机,则请了解一下这方面的内容(请参阅 )。

我们将使用开源 IPMItool 与本地计算机中的 IPMI 设备进行通信。还有若干其他选项,如 OpenIPMI 或 freeipmi。这只是一个示例,因此如果您想要使用其他选项,那么完全没有问题。

在开始使用 Ganglia 之前,确保 IPMItool 可以在您的计算机中工作。运行 ipmitool -c sdr type temperature | sed 's/ /_/g' 命令;如果该命令不工作,请尝试装入 IPMI 设备驱动程序并再次运行:

modprobe ipmi_msghandler modprobe ipmi_si modprobe ipmi_devintf  

在运行 ipmitool 命令后,我的输出显示:

Ambient_Temp,20,degrees_C,ok CPU_1_Temp,20,degrees_C,ok CPU_2_Temp,21,degrees_C,ok  

因此在我的 Ganglia 插件中,我将只监视周围环境温度。我已经创建了一个编写得不是很好的名为 ambientTemp.py 的插件,该插件将根据在 Ganglia 维基中找到的插件使用 IPMI:


清单 1. 编写得不是很好的 Python 插件 ambientTemp.py
import os def temp_handler(name): # our commands we're going to execute sdrfile = "/tmp/sdr.dump" ipmitool = "/usr/bin/ipmitool" # Before you run this Load the IPMI drivers: # modprobe ipmi_msghandler # modprobe ipmi_si # modprobe ipmi_devintf # you'll also need to change permissions of /dev/ipmi0 for nobody # chown nobody:nobody /dev/ipmi0 # put the above in /etc/rc.d/rc.local foo = os.path.exists(sdrfile) if os.path.exists(sdrfile) != True: os.system(ipmitool + ' sdr dump ' + sdrfile) if os.path.exists(sdrfile): ipmicmd = ipmitool + " -S " + sdrfile + " -c sdr" else: print "file does not exist... oops!" ipmicmd = ipmitool + " -c sdr" cmd = ipmicmd + " type temperature | sed 's/ /_/g' " cmd = cmd + " | awk -F, '/Ambient/ {print $2}' " #print cmd entries = os.popen(cmd) for l in entries: line = l.split() # print line return int(line[0]) def metric_init(params): global descriptors temp = {'name': 'Ambient Temp', 'call_back': temp_handler, 'time_max': 90, 'value_type': 'uint', 'units': 'C', 'slope': 'both', 'format': '%u', 'description': 'Ambient Temperature of host through IPMI', 'groups': 'IPMI In Band'} descriptors = [temp] return descriptors def metric_cleanup(): '''Clean up the metric module.''' pass #This code is for debugging and unit testing if __name__ == '__main__': metric_init(None) for d in descriptors: v = d['call_back'](d['name']) print 'value for %s is %u' % (d['name'], v)  

复制清单 1 并将其放到 /usr/lib64/ganglia/python_modules/ambientTemp.py 中。对集群中的所有节点都这样做。

现在我们已经把脚本添加到了集群的所有节点中,告诉 Ganglia 如何执行脚本。创建名为 /etc/ganglia/conf.d/ambientTemp.pyconf 的新文件,内容如下:


清单 2. Ambient.Temp.pyconf
modules { module { name = "Ambient Temp" language = "python" } } collection_group { collect_every = 10 time_threshold = 50 metric { name = "Ambient Temp" title = "Ambient Temperature" value_threshold = 70 } }  

将清单 2 保存到所有节点上。

重新启动 gmond 之前必须完成的最后一件事是更改 IPMI 设备的权限,这样没有人 可以对它执行操作。这将使您的 IPMI 接口极易受到恶意攻击!

这只是一个示例:chown nobody:nobody /dev/ipmi0。

现在在所有位置重新启动 gmond。如果运行正常,则应当可以刷新 Web 浏览器并看到类似如下所示的内容:


图 5. IPMI 带内度量数据

IPMI 带内度量数据


带内度量数据的好处是允许您在主机中运行程序,并通过其他度量数据使用的同一种收集机制将信息提供给链路。这种方法的缺点(尤其是对于 IPMI)是需要在主机上执行相当多的配置才能工作。

注意,必须确保脚本是用 Python 编写的,配置文件已经存在,并且 gmond.conf 已正确设置。我们只执行一种度量!考虑一下编写其他度量所需执行的所有操作!针对每种度量在每台主机上执行此操作会变得非常烦人。IPMI 是带外工具,因此有一种更好的方法,不是吗?确实是。

linux

内容版权声明:除非注明,否则皆为本站原创文章。

转载注明出处:http://www.heiqu.com/231f9246ba1f450b7ad64a2ac567e750.html