Создание зенпака (Zenpack)
Начиная с версии 2.4, Zenoss поддерживает расширенные возможности по мониторингу и моделингу устройств, используя подключениe по SSH. Вы можете запускать произвольные команды на управляемом устройстве и писать на Python свои парсеры, которые будут выполняться на сервере Zenoss.
Далее рассматривается пример того, каким образом можно расширить список поддерживаемых Zenoss'ом устройств, смоделировать новое устройство, используя собственоручно написанный плагин, а также создать ZenPack, содержащий все произведенные изменения, чтобы перенести новую функциональность на другой сервер Zenoss или поделиться результатом своей работы с другими.
Итак, что мы имеем: устройство в сети с операционной системой ArchLinux. Отсутствие отдельного класса устройств для этого типа устройств, а также невозможность собирать информацию об установленных в системе пакетах ввиду отсутствия в ней менеджера пакетов rpm, который по умолчанию используется для класса устройств /Server/SSH/Linux. Что надо: отдельный класс устройств ArchLinux, в котором будет реализована возможность собирать информацию об установленных пакетах, используя менеджер пакетов pacman. Процесс: для воплощения задуманного нам понадобится написать новый (а точнее скопипастить и модифицировать имеющийся) modeler plugin. За основу был взят плагин cmd.linux.rpm из зенпака ZenPacks.zenoss.EnterpriseLinux.
Итак, наши действия:
- создаем новый зенпак ZenPacks.community.ArchLinux
- создаем новый класс устройств Server/SSH/Linux/Arch
- добавляем этот класс в новый зенпак
- создаем такую структуру каталогов $ZENHOME/ZenPacks/ZenPacks.community.ArchLinux/ZenPacks/community/ArchLinux/modeler/plugins/zenoss/cmd/linux/
- на каждом уровне создаем пустой __init__.py
- в каталоге linux создаем и пишем свой modeler plugin - скрипт pacman.py:
берем rpm.py, копируем под новым именем, меняем запускаемую команду и переписываем фукцию разбора результата.В результате получается нечто подобное:
[collapse collapsed Код:]__doc__ = """pacman[/collapse]
Modeler plugin
Commands:
"pacman -Qi"
Properties:
os.software: productKey, description, installDate
Example command output:
Name : pacman
Version : 3.4.1-1
Install Date : Thu 30 Sep 2010 06:46:20 PM MSD
Description : A library-based package manager with dependency support
"""
import logging
from time import strptime
import Products.DataCollector.CommandPluginUtils as utils
from Products.DataCollector.plugins.CollectorPlugin \
import SoftwareCommandPlugin
log = logging.getLogger("zen.pacman")
def parseResults(results):
"""
Parse the results of the pacman command to create a dictionary of installed
software.
"""
softwareDicts = []
for pack in results.split("\n\n")[:-1]:
fields= []
for field in pack.splitlines():
fields.append([el.strip() for el in field.split(":",1)])
fields=dict(fields)
softwareDicts.append(utils.createSoftwareDict(
"%(Name)s %(Version)s" % fields,
"(None)",
fields["Description"],
strptime(fields["Install Date"],"%a %b %d %H:%M:%S %Y")))
return softwareDicts
class pacman(SoftwareCommandPlugin):
"""
Parse pacman -Qi command output to get installed software.
"""
command = r'pacman -Qi|grep -e "Name" -e "Version" -e "Install Date" -e "Description" -e "^$"'
def __init__(self):
"""
Initialize this SoftwareCommandPlugin with the parseResults function
from this module.
"""
SoftwareCommandPlugin.__init__(self, parseResults) - после перезапуска zenoss новый modeler plugin появляется в списке -> теперь можно назначить его в качестве modeler plugin в классе ArchLinux
- после всего этого экспортируем зенпак и voilà!
P.S.: для тех, кто хочет более глубоко погрузиться в разработку зенпаков вообще и modeler plugin'ов в частности, рекомендую ознакомиться с Developer Guide. Также есть неплохая серия гайдов по написанию зенпака для SSH-мониторинга.