Ad Widget

Collapse

Каким образом можно закрыть все триггеры с комментарием у хоста?

Collapse
X
 
  • Time
  • Show
Clear All
new posts
  • Sognatore
    Junior Member
    • Mar 2018
    • 23

    #1

    Каким образом можно закрыть все триггеры с комментарием у хоста?

    Здравствуйте, подскажите кто может. Пишу скрипт, который при отключении хоста автоматически закроет все его триггеры с комментарием, что хост отключился (не спрашивайте зачем, я сам этого не понимаю, но надо). Как я понял, необходимо в базе Zabbix'a вносить изменения в таблицы - triggers (выставить value=0 у данного триггера), events (выставить acknowledged=1), acknowledges (вставить строку с eventid, комментарием и т.д.), problem (вставить строку с eventid, triggerid, r_eventid).
    Возникло несколько вопросов.
    1. В таблице acknowledges есть столбец acknowledgeid - если через скрипт вставить запись, то после этого, при попытке закрыть триггер через интерфейс, появляется ошибка, что запись с таким acknowledgeid уже существует, но где хранится этот счетчик я найти не смог.
    2. Возможно есть более простой способ закрывать все триггеры с комментарием у хоста, чем манипулировать с базой данных? Если есть, то подскажите, куда копать?
    3. {HOST.NAME} - можно ли передать во внешний скрипт, который запускается с сервера? Т.к. скрипт получается объемный с дополнительными параметрами и массивами, и в поле "Command" вряд ли он будет правильно все это обрабатывать.
  • Grinders2007
    Junior Member
    • Jul 2018
    • 16

    #2
    Можно все таки узнать для чего это требуется? Способ который вы описываете это конечно костыли и так делать нельзя. Почему не хотите использовать "Настройка"->"Правила корреляции событий"?
    Лучше не лазить прямиком в БД запросам т.к. можно легко ее положить и потерять все данные. Уж лучше сделать это через Zabbix API если сильно хочется.
    Можно использовать библиотеку py-zabbix для удобства написания на питоне, но можно и на любом другом языке.
    Особую нагрузку использование API на сервер скорее всего не окажет, но может сделать поведение Zabbix server не предсказуемым, и будете потом сидеть часами гадая в чем проблема.
    В документации Zabbix все вполне понятно описано про Zabbix API.
    Я так и не понял что значит "отключении хоста". Вот пример скрипта как это бы выглядело(скрипт не проверял):

    Code:
    [I]#!/usr/bin/python
    # -*- coding: UTF-8 -*-
    
    import requests
    import json
    import sys
    from pyzabbix import ZabbixAPI
    
    z = ZabbixAPI('http://172.222.222.222', user='Admin', password='Admin')
    
    hosts = z.event.get(groupids=8, filter={'acknowledged':"false"}, time_till=1532543274, output=['extend'])
    for host in hosts:
            event.acknowledge("eventids"="host['[/I]eventids[I]']", "message"="Хост отключился.", "action"=1")[/I]
    По поводу передачи макросов все зависит от версии заббикс. Именно {HOST.NAME} можно использовать везде кроме как в выражении триггеров.

    Comment

    • Sognatore
      Junior Member
      • Mar 2018
      • 23

      #3
      Для "показухи" у техподдержки необходимо, что не висели в активных триггеры на хостах, которые выключены (обычное выключение, как компьютера), и поэтому им надо, чтобы когда хост вот так выключается, то закрывались все его активные триггеры с подписью, что хост выключился, но с особо критичными проблемами будет другая обработка проходить, но некритичные (обычно перезагрузка их решает) надо вот так закрывать.

      Comment

      • Sognatore
        Junior Member
        • Mar 2018
        • 23

        #4
        Если кому будет интересно и понадобится что-то подобное, то вот такое решение получилось:
        Code:
        URL='http://localhost/zabbix/api_jsonrpc.php'
        HEADER='Content-Type:application/json'
        
        USER='"zabbix"'
        PASS='"zabbix"'
        
        autenticacao()
        {
            JSON='
            {
                "jsonrpc": "2.0",
                "method": "user.login",
                "params": {
                    "user": '$USER',
                    "password": '$PASS'
                },
                "id": 0
            }
            '
            curl -s -X POST -H "$HEADER" -d "$JSON" "$URL" | cut -d '"' -f8
        }
        TOKEN=$(autenticacao)
        
        TRIGGER=$(psql -U zabbix -w -d zabbix -c "SELECT distinct triggers.triggerid FROM triggers
               INNER JOIN functions ON triggers.triggerid=functions.triggerid
               INNER JOIN items ON items.itemid=functions.itemid
               INNER JOIN hosts ON hosts.hostid=items.hostid
               WHERE items.status = 0 AND triggers.status = 0 AND triggers.value=1 AND triggers.priority IN (2,3,4) AND hosts.host='{HOST.NAME}';" | grep -E '[0-9]{5,7}' | sed ':a;N;$!ba;s/\n/,/g' | sed 's/ //g')
        
        EVENT=( $(psql -U zabbix -w -d zabbix -c "SELECT t1.eventid FROM events t1
              INNER JOIN (SELECT objectid,max(clock) AS clock FROM events
              WHERE value=1 AND source=0 AND acknowledged=0 GROUP BY objectid) t2 ON t1.objectid=t2.objectid AND t1.clock=t2.clock
              WHERE t1.objectid IN ($TRIGGER);" | grep -E '[0-9]{2,9}' | sed ':a;N;$!ba;s/\n/,/g' | sed 's/ //g') )
        
        event_ack()
        {
            JSON='
            {
                "jsonrpc": "2.0",
                "method": "event.acknowledge",
                "params": {
                    "eventids": ['$EVENT'],
                    "message": "Host has shutdown",
                    "action": "1"
                },
                "auth": "'$TOKEN'",
                "id": 1
            }
            '
            curl -s -X POST -H "$HEADER" -d "$JSON" "$URL" > /dev/null
        }
        
        event_ack
        Last edited by Sognatore; 30-07-2018, 14:06.

        Comment

        Working...