Управление Zenoss через XML-RPC

Управление zenoss через web-интерфейс довольно быстро становится утомительным, когда речь заходит о регулярном выполнении одних и тех же действий, либо если необходимо выполнить ряд схожих действий со множеством объектов. К счастью, zenoss основан на Zope, а все объекты Zope доступны через XML-RPC.

Начнем с простого примера: следующий скрипт выводит список всех устройств в /Devices/Server/SSH/Linux:

from xmlrpclib import ServerProxy
deviceTree = ServerProxy('http://<user>:<pass>@<zenoss_server>:8080/zport/dmd/Devices/Server/SSH/Linux/devices/')
for device in deviceTree.objectIds(): print device

Достаточно просто, не правда ли?
Теперь посмотрим, как можно отправить event. Чтобы продемонстрировать такую возможность, мы модифицируем созданный ранее modeler plugin таким образом, чтобы он не только собирал информацию о пакетах, но и проверял наличие доступных обновлений для них и для каждого из обновлений создавал событие в Zenoss.

  1. итак, для того, чтобы иметь возможность посылать события, необходимо импортировать из бибиотеки xmlrpclib класс ServerProxy, а затем создать объект этого класса, ссылающийся на EventManager нашего сервера Zenoss:
    from xmlrpclib import ServerProxy
    serv = ServerProxy('http://<user>:<pass>@<zenoss_server>:8080/zport/dmd/ZenEventManager')
  2. теперь, для того, чтобы отправить на сервер событие, необходимо создать словарь с необходимыми полями и вызвать метод sendEvent:
    evt = {'device':"Arch",'component':"Software",'summary':"Update available for package '"+ pack + "'",'severity':3,'eventClass':"/App/Info"}
    serv.sendEvent(evt)  
  3. наконец, модифицируем команду, чтобы она выводила также список пакетов, для которых доступны обновления, и в итоге наш modeler plugin теперь выглядит следующим образом: [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

    from xmlrpclib import ServerProxy
    serv = ServerProxy('http://admin:qwe123#@192.168.42.100:8080/zport/dmd/ZenEventManager')
           
    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")))

        for pack in results.split("\n\n")[-1].splitlines():
            evt = {'device':"Arch",'component':"Software",'summary':"Update available for package \'"+ pack + "\'",'severity':3,'eventClass':"/App/Info"}
            serv.sendEvent(evt)

        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 "^$";pacman -Qu'
       
        def __init__(self):
            """
            Initialize this SoftwareCommandPlugin with the parseResults function
            from this module.
            "
    ""
            SoftwareCommandPlugin.__init__(self, parseResults)
    [/collapse]
  4. теперь можно идти в Zenoss и ремоделить устройство с арчом.

 

P.S.: поля события говорят сами за себя - достаточно взглянуть на страницу Events в Zenoss. Единственное, что требует пояснения, это список значений поля severity:

  • 5: Critical
  • 4: Error
  • 3: Warning
  • 2: Info
  • 1: Debug
  • 0: Clear

P.S.S.: другие объекты для управления через XML-RPC можно найти на собственном сервере Zenoss, перейдя по адресу http://<zenoss_server>:8080/zport/dmd/manage

450