2012-07-25

Zabbix 2.*: Low-Level Discovery для Windows Services

В данной объемной статье я хочу пошагово описать процесс создания Low-Level Discovery Rule в Zabbix 2 для обнаружения сервисов Windows и мониторинга их состояния.

Процесс создания LLDR для сервисов сводится ко двум шагам:

  1. Написанию скрипта, срабатывающего по запросу на конечном сервере, и выдающего список сервисов и ряда полезных нам параметров
  2. Созданию темплейта с описанием Item Prototype и Trigger Prototype
После этих двух шагов мы сможем получать список сервисов с конкретного сервера и отслеживать его состояние - запущен ли он, или упал.

Инструкция максимально подробная, картинок будет много, все они кликабельны.

Поехали!

Настраиваем агенты

Для настройки агентов нам потребуется вышеупомянутый скрипт (ServicesList.vbs), который не нужно писать, а который можно взять вот тут:  http://pastebin.com/ix5wiErb

Также, в zabbix_agentd.conf следует добавить строку вида:
UserParameter=windows.service,cscript C:\ServicesList.vbs //NoLogo

Таким образом, при помощи скрипта заббикс-серверу для каждого обнаруженного сервиса передадутся макросы:
  • {#SCSTARTMODE} - опция старта сервиса (Auto|Manual|Disabled)
  • {#SCNAME} - короткое имя сервиса, используемое в командах sc или net start
  • {#SCCAPTION} - полное имя, которое можно видеть в оснастке менеджмента сервера
  • {#SCDISCOVERYFILTER} - специальный макрос для фильтрации, о нем в конце статьи
Собственно, на этом подготовка серверов оканчивается, переходим к созданию Low-Level Discovery Rule.

Создаем темплейт

Создаем новый темплейт, назовем его "Template LLD - Windows Services"

Создаем Low-Level Discovery Rule 

Нажимаем на Discovery созданного темплейта и на открывшейся странице нажимаем Create discovery rule
Указываем:
  • Name - Windows Service LLD
  • Key - windows.service (его мы позже пропишем в настройках агента)
  • Update interval (in sec) - 3600

Нажимаем Save.

Создаем Item Prototype

Нажимаем Item prototypes, на открывшейся  странице нажимаем кнопку Create item prototype.
В окне создания прототипа объекта указываем:
  • Name - Service: {#SCCAPTION} ({#SCNAME}) 
  • Key - service_state[{#SCNAME}]
  • Update interval (in sec) - 60
  • Show value - Windows service state
  • New application - win_services


Нажимаем Save.


Нажимаем ссылку Discovery list (находится над списком) и возвращаемся к нашему правилу, которое теперь содержит один Item Prototype


Создаем Trigger Prototype

Нажмем на Trigger prototypes и, аналогично случаю с Item, на новом экране нажмем Create trigger prototype.

Укажем:
  • Name - Service is DOWN: "[{#SCNAME}] {#SCCAPTION}"
  • Severity - High

Нажмем кнопку Add напротив поля Expression.



В появившемся окне укажем:
  • N - 1
затем нажмем Select prototype, чтобы связать прототип триггера с прототипом объекта. Во вновь открывшемся окне нажмем на Service: {#SCCAPTION} ({#SCNAME}).


Нажмем Insert.

Отредактируем поле Expression, добавив еще одно правило через знак логического или - |

Было: {Template LLD - Windows Services:service_state[{#SCNAME}].last(0)}=1

Стало: {Template LLD - Windows Services:service_state[{#SCNAME}].last(0)}=1 | {Template LLD - Windows Services:service_state[{#SCNAME}].last(0)}=6

Теперь триггер будет срабатывать на два состояния службы - Stopped и Paused.


Нажимаем Save.


Нажимаем Discovery list, чтобы вернуться к странице конфигурации правил Low-Level Discovery.

По сути, на данном этапе конфигурация правила обнаружения сервисов закончена и готовый темплейт можно применять к Windows-серверам. Однако, как можно заметить, в данном виде по правилу будут создаваться объекты для исключительно всех сервисов системы. Среди них могут быть специально остановленные, или просто нам не интересные. Так или иначе стоит подумать о фильтрации сервисов.

Создаем правила фильтрации

Зайдем снова в конфигурацию нашего Low-Level Discovery Rule.
Укажем: 
  • Macro - {#SCDISCOVERYFILTER}
  • Regexp - @Services discovery - exclusions

Нажимаем Save.

Теперь данное правило будет порождать объекты только тех служб, которые совпадают с регулярным выражением "Services discovery - exclusions", которое мы сейчас и создадим.

Переходим в Administration -> General, справа из выпадающего списка выбираем Regular expressions. Нажимаем кнопку New regular expression и указываем имя: Services discovery - exclusions

Тут стоит напомнить, что под именем {#SCDISCOVERYFILTER} у нас возвращается строка вида:

вид_запуска_сервиса-имя_сервера-имя_службы,
где:
  • вид_запуска - Auto|Manual|Disabled
  • имя_сервера - NetBIOS-имя сервера
  • имя_службы - короткое имя службы, которое используется с командами sc или net start

Реальная строка выглядит при этом примерно так: Auto-aepmssql-1C:Enterprise 8.2 Server Agent

Так как меня интересуют запущенные службы, которые  должны запускаться при старте системы и не должны падать, нажатием кнопки New первым фильтром я добавлю выражение, допускающее создание объекта: 
  • Expression - ^Auto
  • Expression type - Result is TRUE
Таким образом любой сервис, вернувший  {#SCDISCOVERYFILTER} вида Auto-*, будет создан в виде объекта и триггера, и мы адекватно отреагируем на его падение так как знаем что он должен быть запущен. 

Если же нам известны сервисы, которые штатно останавливаются, или падают, но нам не интересны, мы имеем возможность добавить их в исключения следующим образом.

Если нужно добавить в исключения сервис, который присутствует на многих серверах и нигде не представляет для нас интереса, мы можем добавить фильтр по имени. В моем случае я хочу прекратить мониторинг сервиса  SysmonLog. Добавляю новое выражение:
  • Expression - SysmonLog
  • Expression type - Character string not included
Таким образом все сервисы  SysmonLog, встреченные на всех серверах, будут проигнорированы. 

Однако у меня есть сервис 1C:Enterprise 8.2 Server Agent, и он мне не интересен только на одном сервере - aepmssql. В таком случае я добавляю выражение, содержащее и имя сервиса, и имя сервера:
  • Expression - aepmssql-1C:Enterprise 8.2 Server Agent
  • Expression type - Character string not included



Таким образом я получаю списки, содержащие все сервисы сервера, и могу выбрать какие из них я буду мониторить, а какие нет.

В конце оставляю ссылку на готовый темплейт: http://pastebin.com/nzLQLSkp, замечу что он не включает в себя готовый фильтр "Services discovery - exclusions".

4 комментария:

  1. Объясните, пожалуйста, что обозначает в заббиксе prototype ?

    ОтветитьУдалить
    Ответы
    1. Ну по сути это некий шаблон, из которого вследствие работы LLD создается итем или триггер. Создаются они аналогично созданию самих объектов, но с использованием макросов. Работу можно описать примерно так - заббикс получает от клиента список пар "имя-значение" (например имена сетевых интерфейсов и текущая скорость на каждом из них) и на основе прототипа создает для каждой пары соответствующий объект. Это позволяет описывать одним темплейтом различные варианты устройств, допустим 24-х и 48-портовые свичи, без прототипов пришлось бы вручную заводить каждый интерфейс, учитывая их общее количество в конкретном девайсе.

      Удалить
  2. Добрый день. При импорте шаблона, получаю ошибку.
    64:XML declaration allowed only at the start of the document [ Line: 3 | Column: 6 ]
    Строку убрал, импорт прошел.

    Спасибо.

    ОтветитьУдалить
    Ответы
    1. Спасибо за комментарий, рад что пригодилось =) Вернусь из отпуска - проверю шаблон =)

      Удалить