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