Шаблон Приложения libvirt

Kernel-based Virtual Machine KVM — программное решение, обеспечивающее виртуализацию
Аватара пользователя
Артём Мамзиков
Admin
Сообщения: 808
Стаж: 5 лет 2 месяца
Откуда: Вологодская область
Поблагодарили: 34 раза
Контактная информация:

Шаблон Приложения libvirt

Сообщение Артём Мамзиков »

Шаблон Приложения libvirt
libvirt — свободная реализация API, демон и набор инструментов для управления виртуализацией. Позволяет управлять гипервизорами

СКАЧАТЬ
zabbix-kvm-res-App libvirt.zip
zabbix-kvm-res-App libvirt.zip
(15.92 КБ) 8 скачиваний
zabbix-kvm-res
==============
Мониторинг KVM через Zabbix
Контролируйте свои ресурсы KVM с помощью Zabbix
** Предупреждение: ** это было протестировано только на Zabbix 1.8 и 2.0

Зависимости
=============
python2, libvirt-python (tested with 0.9.12.3, 0.10.2 and 1.1.3.x)

Установка
============
1. copy zabbix-kvm-res.py to /usr/local/bin/
2. append zabbix_agentd.conf/UserParameters to /etc/zabbix_agentd.conf (или в любом другом месте, где находится ваш файл zabbix_agentd.conf)
3. restart zabbix-agent daemon
4. импорт zabbix_kvm.xml в ваши шаблоны
5. примените шаблон к системе kvm
6. пейте кофе и наслаждайтесь

Признание
================
- [Патрик Уиттерхувен](https://github.com/Trikke76 ) за то, что выложил это там
- [жаждущий кот](https://github.com/thirstycat ) за помощь с флагами некоторых методов libvirt
- Стефано Бласко за предоставление обратной связи и кода, чтобы заставить его работать с libvirt-python 0.9.12.3)

Пользовательские параметры для конфигурации заббикс агента
UserParameter=custom.kvm.pool.discover,/usr/local/bin/zabbix-kvm-res.py --resource pool --action list
UserParameter=custom.kvm.pool.size[*],/usr/local/bin/zabbix-kvm-res.py --resource pool --action $1 --pool $2
UserParameter=custom.kvm.pool.active[*],/usr/local/bin/zabbix-kvm-res.py --resource pool --action active --pool $1
UserParameter=custom.kvm.pool.uuid[*],/usr/local/bin/zabbix-kvm-res.py --resource pool --action UUID --pool $1
UserParameter=custom.kvm.net.discover,/usr/local/bin/zabbix-kvm-res.py --resource net --action list
UserParameter=custom.kvm.net.active[*],/usr/local/bin/zabbix-kvm-res.py --resource net --action active --net $1
UserParameter=custom.kvm.net.uuid[*],/usr/local/bin/zabbix-kvm-res.py --resource net --action UUID --net $1
UserParameter=custom.kvm.domain.discover,/usr/local/bin/zabbix-kvm-res.py --resource domain --action list
UserParameter=custom.kvm.domain.active[*],/usr/local/bin/zabbix-kvm-res.py --resource domain --action active --domain $1
UserParameter=custom.kvm.domain.uuid[*],/usr/local/bin/zabbix-kvm-res.py --resource domain --action UUID --domain $1

Скрипт zabbix-kvm-res.py

Код: Выделить всё

#!/usr/bin/python -tt
# -*- coding: utf-8 -*-

# zabbix-kvm-res.py
# this tool returns information for zabbix monitoring (and possibly other monitoring solutions)
import libvirt
import sys
import json

from optparse import OptionParser

def main():
  options = parse_args()
  if options.resource == "pool":
    if options.action == "list":
      r = pool_list(options)
    elif options.action == "total":
      r = pool_total(options)
    elif options.action == "used":
      r = pool_used(options)
    elif options.action == "free":
      r = pool_free(options)
    elif options.action == "active":
      r = pool_isActive(options)
    elif options.action == "UUID":
      r = pool_uuid(options)
  elif options.resource == "net":
    if options.action == "list":
      r = net_list(options)
    elif options.action == "active":
      r = net_isActive(options)
    elif options.action == "UUID":
      r = net_uuid(options)
  elif options.resource == "domain":
    if options.action == "list":
      r = domain_list(options)
    elif options.action == "active":
      r = domain_isActive(options)
    elif options.action == "UUID":
      r = domain_uuid(options)
  
  print r

def domain_list(options):
  conn = kvm_connect()
  r = { "data": [] }
  try:
    conn.listAllDomains(0)
  except:
    domains = []
    for dom_id in conn.listDomainsID():
      r['data'].append( {"{#DOMAINNAME}": conn.lookupByID(dom_id).name()} )
  else:
    for domain in conn.listAllDomains(0):
      r["data"].append( {"{#DOMAINNAME}": domain.name()} )

  return json.dumps(r, indent=2, sort_keys=True, encoding="utf-8")

def domain_isActive(options):
  conn = kvm_connect()
  return conn.lookupByName(options.domain).isActive()

def domain_uuid(options):
  conn = kvm_connect()
  return conn.lookupByName(options.domain).UUIDString()


def net_list(options):
  conn = kvm_connect()
  r = { "data": [] }
  try:
    conn.listAllNetworks(0)
  except:
    for net in conn.listNetworks():
      r["data"].append( {"{#NETNAME}": net} )
  else:
    for net in conn.listAllNetworks(0):
      r["data"].append( {"{#NETNAME}": net.name()} )

  return json.dumps(r, indent=2, sort_keys=True, encoding="utf-8")

def net_isActive(options):
  conn = kvm_connect()
  return conn.networkLookupByName(options.net).isActive()

def net_uuid(options):
  conn = kvm_connect()
  return conn.networkLookupByName(options.net).UUIDString()


def pool_list(options):
  conn = kvm_connect()
  r = { "data": [] }
  try:
    conn.listAllStoragePools(0)
  except:
    for pool in conn.listStoragePools():
      r["data"].append( {"{#POOLNAME}": pool} )
  else:
    for pool in conn.listAllStoragePools(0):
      r["data"].append( {"{#POOLNAME}": pool.name()} )

  return json.dumps(r, indent=2, sort_keys=True, encoding="utf-8")

def pool_total(options):
  return pool_info(options)[1]

def pool_used(options):
  return pool_info(options)[2]

def pool_free(options):
  return pool_info(options)[3]

def pool_isActive(options):
  conn = kvm_connect()
  return conn.storagePoolLookupByName(options.pool).isActive()

def pool_uuid(options):
  conn = kvm_connect()
  return conn.storagePoolLookupByName(options.pool).UUIDString()

def pool_info(options):
  if options.pool == None:
    sys.stderr.write("There was an error connecting to pool.\n")
    exit(1)
  conn = kvm_connect()
  try:
    info = conn.storagePoolLookupByName(options.pool).info()
  except:
    sys.stderr.write("There was an error connecting to pool '"+options.pool+"'.")
    exit(1)
  return info


def kvm_connect():
  try:
    conn = libvirt.openReadOnly('qemu:///system')
  except:
    sys.stderr.write("There was an error connecting to the local libvirt daemon using '"+uri+"'.")
    exit(1)
  return conn

def parse_args():
  parser = OptionParser()
  valid_resource_types = [ "pool", "net", "domain" ]
  valid_actions = [ "discover", "capacity", "allocation", "available" ]


  parser.add_option("", "--resource", dest="resource", help="Resource type to be queried", action="store", type="string", default=None)
  parser.add_option("", "--action", dest="action", help="The name of the action to be performed", action="store", type="string", default=None)

  parser.add_option("", "--pool", dest="pool", help="The name of the pool to be queried", action="store", type="string", default=None)
  parser.add_option("", "--net", dest="net", help="The name of the net to be queried", action="store", type="string", default=None)
  parser.add_option("", "--domain", dest="domain", help="The name of the domain to be queried", action="store", type="string", default=None)

  (options, args) = parser.parse_args()
  if options.resource not in valid_resource_types:
    parser.error("Resource has to be one of: "+", ".join(valid_resource_types))
 
  if options.resource == "pool":
    pool_valid_actions = [ 'list', 'total', 'used', 'free', 'active', 'UUID' ]
    if options.action not in pool_valid_actions:
      parser.error("Action hass to be one of: "+", ".join(pool_valid_actions))
  elif options.resource == "net":
    net_valid_actions = [ 'list', 'active', 'UUID' ]
    if options.action not in net_valid_actions:
      parser.error("Action hass to be one of: "+", ".join(net_valid_actions))
  elif options.resource == "domain":
    domain_valid_actions = [ 'list', 'active', 'UUID' ]
    if options.action not in domain_valid_actions:
      parser.error("Action hass to be one of: "+", ".join(domain_valid_actions))
    
 

  return options

if __name__ == "__main__":
  main()
Шаблон App libvirt
Шаблон App libvirt
Группы элементов данных
KVMТома
KVM Сеть
KVM Пул
KVM Домен

Правила обнаружения
KVM Обнаружение домена Прототипы элементов данных 2 Прототипы триггеров Прототипы графиков Прототипы узлов сети custom.kvm.domain.discover 3600 Zabbix агент Активировано

KVM Обнаружение сети Прототипы элементов данных 2 Прототипы триггеров Прототипы графиков Прототипы узлов сети custom.kvm.net.discover 3600 Zabbix агент Активировано

KVM обнаружение пула Прототипы элементов данных 5 Прототипы триггеров Прототипы графиков 1 Прототипы узлов сети custom.kvm.pool.discover 3600 Zabbix агент Активировано
количество слов: 1033

Вернуться в «KVM - Виртуальная машина»