Создание зенпака (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.

Итак, наши действия:

  1. создаем новый зенпак ZenPacks.community.ArchLinux
  2. создаем новый класс устройств Server/SSH/Linux/Arch
  3. добавляем этот класс в новый зенпак
  4. создаем такую структуру каталогов $ZENHOME/ZenPacks/ZenPacks.community.ArchLinux/ZenPacks/community/ArchLinux/modeler/plugins/zenoss/cmd/linux/
  5. на каждом уровне создаем пустой __init__.py
  6. в каталоге linux создаем и пишем свой modeler plugin - скрипт pacman.py:
    берем rpm.py, копируем под новым именем, меняем запускаемую команду и переписываем фукцию разбора результата.

    В результате получается нечто подобное:

    [collapse collapsed Код:]
    __doc__ = """pacman
    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)
    [/collapse]
  7. после перезапуска zenoss новый modeler plugin появляется в списке -> теперь можно назначить его в качестве modeler plugin в классе ArchLinux
  8. после всего этого экспортируем зенпак и voilà!

P.S.: для тех, кто хочет более глубоко погрузиться в разработку зенпаков вообще и modeler plugin'ов в частности, рекомендую ознакомиться с Developer Guide. Также есть неплохая серия гайдов по написанию зенпака для SSH-мониторинга.

2269