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