Pull to refresh

Использование Zabbix API

Reading time3 min
Views30K

Зачем это надо


В ходе внедрения zabbix для мониторинга инфраструктуры, возникла необходимость массового добавления датчиков и триггеров.
Использование для этой цели веб интерфейса удовольствия не принесло, уж больно большой объем монотонной работы и маленькая скорость на пути к счастью. За сим обратил внимание на наличие zabbix api. Для целей массового добавления датчиков и прочих прелестей жизни показалось самое оно.

Краткий анализ инструментария


Краткое исследование показало, имеются библиотеки на ruby, python и php.
PHP было отброшено сразу, из за незнания оного, из оставшихся языков выбор пал на ruby. Можно считать это личным пристрастием, но по ходу работы плотно использую puppet написанный на ruby, посему немного знаком с этим языком.
Zabbix API использует JSON и JSON-RPC для интегрирования со сторонними утилитами и сервисами.
Как оказалось сей зверь не страшен, и при ближайшем рассмотрении оказался достаточно прост для понимания.
Чтобы не сильно ломать голову отыскалась готовая библиотека zabcon
Что она из себя представляет можно посмотреть по ссылке.
Перейдем не посредственно к рецепту.

Исходная задача



Имеется энное количество серверов. На всех сервера присутствует zabbix-agent. Требуется завести датчики для мониторинга дискового пространства, для этих датчиков также требуется добавить тригеры. Можно использовать шаблоны, но по мне этот вариант кажется не достаточно гибким, опять же делается через веб интерфейс, к которому после пары дней плотной работы возникает устойчивое отвращение.

Лучше целый день потерять, потом за 5 минут долететь.



Для решения задачи воспользуемся библиотекой предоставляемой утилитой zabcon.
Скачать, установить зависимости, распаковать.

Далее рисуем скрипт на ruby следующего содержания.

#!/usr/bin/ruby
#
require './zabbixapi.rb'
 
zbx=ZbxAPI.new('http://zabbix.server.com')
zbx.login('login','password')

# trigger
HIGH=4
AVERAGE=3
WARNING=2
INFORMATION=1

ENABLE=0
DISABLE=1

# return hostid
def hostid_from_hostname(hostname,zabbix)
 for host in zabbix.host.get({"extendoutput"=>true,'pattern'=>"#{hostname}"})
     return host['hostid']
 end
end

def add_disk_check(hostname,zabbix)
 # получаем диски с сервера, ssh настроен по ключам
 ssh=`ssh -o "StrictHostKeyChecking no" -q #{hostname} 'df -l -P -h | tail -n +2' `

 hostid=hostid_from_hostname(hostname,zabbix)
 for l in ssh
    disk=l.split[5].gsub("/","\/")
    name="API Free diskspace on #{disk}"

    item_p = {
     'description'=>name,
     'key_'=>"vfs.fs.size[#{disk},pfree]",
     'hostid'=>hostid,
     'type'=>'0',
     'data_type'=>0,
     'value_type'=>0,
     'units'=>"%"
    }

    begin
     uid = zabbix.item.create(item_p)
     p "cant create item on #{hostname} disk #{disk}" if uid.nil?
    end

    expression="{#{hostname}:vfs.fs.size[#{disk},pfree].last(0)}<10"
    description="API Free diskspace on {HOSTNAME} volume #{disk}"

    item_t={
         'hostid' => hostid,
         'expression'=>expression,
         'description'=>description,
         'priority'=>HIGH,
         'status'=>ENABLE,
    }

    begin
     uid = zabbix.trigger.create(item_t)
     p "cant create trigger on #{hostname} disk #{disk}" if uid.nil?
    end

 end
end

# Дальше пройдемся по всем серверам имеющимся в zabbix и добавим требуемые датчики с тригерами
for host in zbx.host.get({"extendoutput"=>true})
 id=host['hostid']
 hostname=host['host']
 puts "#{id} -- #{hostname}"
 add_disk_check(hostname,zbx)
end

# the end

* This source code was highlighted with Source Code Highlighter.



По ходу деятельности пришлось подправить zabbixapi.rb, в исходном варианте скрипт вываливался если требуемый датчик или тригер уже присутствовал.
В функции do_request ищем следующий кусок кода:
    if !resp["error"].nil?
      raise ZbxAPI_GeneralError, resp["error"] # закоментировать
    end
    
                return resp
             rescue Redirect                  # закоментировать
                redirects+=1
                     retry if redirects<=5
                     raise ZbxAPI_GeneralError, "Too many redirects"
             end


* This source code was highlighted with Source Code Highlighter.

коментируем указанные строки.

Резюме


Работа по серфингу веб интерфейса zabbix сервера была заменена на исследовательскую деятельность, попутно был нарисован инструментарий позволяющий в краткие сроки обеспечить доводку мониторинга под собственные нужды.
Данный пример показывает гибкость и изворотливость человека в попытке избавиться от рутинной работы.
Tags:
Hubs:
+8
Comments2

Articles