News:

Измеряй микрометром. Отмечай мелом. Отрубай топором. Правило точности Рэя

Main Menu

Мониторинг SMART в дисках SSD/HDD под ОС «Windows 7 x64» в Zabbix

Started by STALKER_SLX, 08 November 2018, 21:50

Previous topic - Next topic

0 Members and 4 Guests are viewing this topic.

STALKER_SLX

Доброго времени суток, уважаемые форумчане!
Уже несколько недель стараюсь решить данный вопрос, но постоянно сталкиваюсь с ошибкой «Value should be a JSON object», которую пока никак не могу решить.


Имею.
1. Свежеустановленный Zabbix-сервер версии 4.0 на Debian 9.5 (чистая установка).
2. Клиентский компьютер под ОС «Windows x64» с установленным Zabbix-агентом 4.х в качестве системной службы. Два внутренних физических диска OCZ (SSD) и Seagate (HDD), которые необходимо мониторить с помощью Zabbix-сервера.
3. Для реализации поставленной задачи была взята за основу статья: https://serveradmin.ru/monitoring-smart-v-zabbix/
4. Скрипт «windows.hdd.ps1» и шаблон «zabbix-smart-win-template.xml» для мониторинга дисков также взяты с указной статьи (для простоты прикрепляю их сюда во вложении - см. архив).


В результате реализации изложенного в статье подхода получаю следующее.
5.1. Установленная на клиентской машине программа «Smartmontools» успешно распознает оба физических диска как sda и sdb соответственно (команда smartctl --scan-open). Также данная утилита показывает и дополнительную информацию о дисках (smartctl -A /dev/sda, smartctl -i /dev/sda, smartctl -A /dev/sdb и smartctl -i /dev/sdb).
5.2. При запуске PowerShell от имени администратора на клиентском компьютере, скрипт «windows.hdd.ps1» отрабатывает без ошибок, то есть успешно выводится результат следующих команд:
.\windows.hdd.ps1 discovery
.\windows.hdd.ps1 sda status
.\windows.hdd.ps1 sdb status
.\windows.hdd.ps1 sda capacity
.\windows.hdd.ps1 sdb capacity


5.3. В журнале работы Zabbix-агента даже при максимальном логировании (уровень 5) – отсутствуют какие-либо видимые ошибки.

5.4. Но при всем этом, как и многие другие пользователи (которые отписались в комментариях к статье), получаю ошибку: «Value should be a JSON object» (для этого заходим на сервер Zabbix через веб-интерфейс по пути: Configuration – Hosts – Windows7-baseOS – Discovery rules, см. скриншот во вложении – «hosts-Windows7-baseOS-discovery-rules.JPG»).

5.5. Сам же автор указанной выше статьи «говорит», что у него все отрабатывает нормально в точности как описано в самой статье и советует искать причины у «себя».


6. В связи с вышеизложенным, прошу посильной помощи разобраться в этом вопросе и по возможности поделиться своими рабочими шаблонами и скриптами для мониторинга дисков под ОС «Windows x64» в Zabbix.
Думаю, что может проблема заключается в «кривом» шаблоне, но знаний пока не хватает разобраться в чем дело...


P.S.: Также мной был успешно опробован универсальный прием для Windows- и Linux-машин с использованием удаленных команд, описанный тут https://habr.com/post/344548/
Но он мне кажется не совсем безопасным. Если я в этом не прав, тогда прошу форумчан помочь и в этом вопросе!
Кроме того, в процессе тестирования данного метода у меня возникли некоторые трудности. О них отпишусь позже отдельно.

STALKER_SLX

Добавляю сюда отдельно архив "script_&_template.zip" со вложенными скриптом и шаблоном для мониторинга, т.к. настройками форума запрещено выкладывать их в оригинальном формате.

ival

Тема интересная, только в качестве опыта. Если честно не совсем понятно зачем это делать. Я утилиту не использовал эту, но насколько я понял из статьи диски физические в RAID Вы не увидите. Для того чтобы их увидеть Вам придется обращаться через драйвер контроллера, а одинокие диски можно использовать только на рабочих станциях или как SSD кеш на чтение. Опять же, если пробовать обращаться к дискам в RAID группе через драйвер контроллера и запрашивать SMART, то как по мне это тоже бесполезно. Во первых состояние дисков можно забирать по SNMP с системы удаленного управления сервером (iDRAC, iLO) А второе, какая разница какой SMART? Диск вылетит и RAID группа перестроится на HOT SPARE. Но ради интереса попробую посмотреть как-нибудь на досуге

STALKER_SLX

Уважаемый ival, Вы совершенно правильно заметили, что указанная утилита не увидит физические диски, установленные в «железный» RAID, но ведь вопрос данной темы касается клиентских машин с ОС «Windows»! А там зачастую (на практике) RAID не используется.

Quote from: ival on 09 November 2018, 10:06Во первых состояние дисков можно забирать по SNMP с системы удаленного управления сервером (iDRAC, iLO) А второе, какая разница какой SMART? Диск вылетит и RAID группа перестроится на HOT SPARE.
Совершенно справедливо для «брендовых серверов» (с наличием на борту iDRAC, iLO и т.п.) и дисковых станций как SAN и NAS.

Quote from: ival on 09 November 2018, 10:06Если честно не совсем понятно зачем это делать.
Но как же быть с физическими дисками на клиентских станциях под управлением семейства ОС «Windows»? Или их нужно оставить за бортом? Конечно, можно сделать перенаправляемые профили в Active Directory (если такова используется) и хранить все важные данные на файловом сервере с определенной глубиной версий файлов, если ресурсы компании позволяют. Но если таковых ресурсов нет?! Ведь пока нужно работать с тем, что есть, а уж со временем организовать все как «книжка пишет».


Quote from: ival on 09 November 2018, 10:06Но ради интереса попробую посмотреть как-нибудь на досуге
Буду Вам весьма благодарен за помощь!

ival

Времени свободного не было особо, поэтому сьерзно вникать в разбор скрипта не стал. Сделал все по инструкции ссылку на которую Вы дали. Что в итоге:
1. В скрипте smartctl-nc лично у меня не возвращает значения, пришлось менять везде на smartctl
2. У меня не заработало автообноружение. Статус not supported. Но это не критично, скорее всего есть синтаксическая ошибка где-то либо в шаблоне не корректно описан тип элемента. Шаблон я не открывал.
Меня больше заинтересовал вопрос, что вернёт мне zabbix_get. И в итоге я получил стандартную схему powershell, «не может быть выполнен из за ограничений на запуск скриптов». Проверил политики, unrestricted только для current user. Собственно для меня это сейчас контрольная точка из которой у меня вопрос к Вам. Можете показать, что вам выдаст команда:
zabbix_get -s "ip-машины" -k ZScript[sda,capacity]
Может у Вас всего лишь тоже проблема с выполнением скрипта и надо воспользоваться флагом ExecutionPolicy Bypass при запуске скрипта Zabbix агентом. Если у Вас все пройдёт и zabbix_get вернёт значения, то я как-нибудь поковыряюсь дальше более вдумчиво.

ival

Немного полазил ещё сегодня. Теперь уже по шаблону и как раз возникли вопросы по синтаксису. Полез проверить в статью которую Вы скинули. Очень интересные расхождения автора. Если Вы обратите внимание, то в статье есть скриншот окна powershell, где автор показывает результат выполнения скрипта:

\windows.hdd.ps1 discovery
и ему возвращается как раз конструкция JSON

{"data":[{"{#DISKID}":"sda"},{"{#DISKID}":"sdb"}]}
А теперь открываем XML и видим:

ZScript[{#DISKID},5]
Лезем на https://jsonlint.com/ и проверяем конструкцию [{#DISKID},5]. И оказывается, что конструкция в шаблоне не правильная. О чем нам сообщает валидатор:

Error: Parse error on line 1:
[{# DISKID}, 191]
--^
Expecting 'STRING', '}', got 'undefined


Меняем на
["{#DISKID}", 5]И валидатор нас поддерживает текстом:

Valid JSON

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






ival

В итоге сегодня все запустилось, что я сделал за эти дни:

1. Поправил в скрипте  smartctl-nc на smartctl
2. Поправил в шаблоне JSON конструкцию с
[{#DISKID}, параметр ] на
["{#DISKID}", параметр]3. Изменил в конфиге на клиенте время ожидания
Timeout=104. Сегодня изменил учетку запуска службы Zabbix на клиенте с локальной системы на свою учетку, т.к. -ExecutionPolicy Bypass -File почему-то не сработало. Надо лезть в technet смотреть по выполнению скриптов для системной УЗ, возможно там есть какие-то нюансы.


STALKER_SLX

ival, огромное Вам СПАСИБО за помощь!
Следуя чётко Вашим рекомендациям получил следующее.

1. Внёс коррективы с помощью программы «AkelPad» только в шаблон, изменил конструкцию на

["{#DISKID}", 5]

Т.к. в скрипте у меня изначально было smartctl без «-nc», а таймаут у меня 15 сек, то тут ничего не менял.

После внесения изменений, сохранил этот файл в кодировке «UTF-8 без BOM» Изменённый шаблон прикладываю во вложении к данному сообщению (zabbix-smart-win-template.zip)

2. При выполнении в терминале на сервере команды «zabbix_get -s "192.168.170.1" -k ZScript[sda,status]» - получаю крякозябры (скриншот прилагаю).

3. В самом веб-интерфейсе всё-также высвечивается та же ошибка «Value should be a JSON object»


Еще один вопрос: в какой программе нужно редактировать шаблон?
Может «AkelPad» неправильно сохраняет данные в формате «*.xml» ?!


Уваров А.С.

Quote from: ival on 15 November 2018, 10:584. Сегодня изменил учетку запуска службы Zabbix на клиенте с локальной системы на свою учетку, т.к. -ExecutionPolicy Bypass -File почему-то не сработало. Надо лезть в technet смотреть по выполнению скриптов для системной УЗ, возможно там есть какие-то нюансы.

В документе https://docs.microsoft.com/en-us/powershell/module/microsoft.powershell.security/set-executionpolicy?view=powershell-6

Указано, что параметр -Scope может принимать значения:


QuoteParameter Sets:   Process, CurrentUser, LocalMachine, UserPolicy, MachinePolicy

По умолчанию - LocalMachine, два последних не расшифровано, логично предположить, что они должны менять соответствующие политики GPO, которые перекрывают остальные настройки. По умолчанию они не заданы, но кто его знает, как на это реагирует системная запись и как она воспринимает LocalMachine.

ival

Quote from: STALKER_SLX on 15 November 2018, 22:03Внёс коррективы с помощью программы «AkelPad» только в шаблон, изменил конструкцию на

["{#DISKID}", 5]

Вы меня не поняли, это я привел как пример=)) Вам нужно поменять не только ["{#DISKID}", 5] но и все аналогичные значения. То есть все конструкции должны иметь вид
["{#DISKID}", параметр]
https://dropmefiles.com/2MXJk

Я шаблон меняю в самом Zabbix Configuration - Templates далее ищем нужный шаблон (если ничего не меняли то он называется HDD Smart Windows) и нажимаем Discovery (Скрин ниже)

https://dropmefiles.com/RJsv2

Далее выбираем Item Protoypes (Скрин ниже)

https://dropmefiles.com/vjgOV

А дальше надо зайти в каждый Item и поменять параметр Key как на скриншоте ниже

https://dropmefiles.com/2MXJk


Quote from: STALKER_SLX on 15 November 2018, 22:03При выполнении в терминале на сервере команды «zabbix_get -s "192.168.170.1" -k ZScript[sda,status]» - получаю крякозябры

Тяжело сказать, там что-то на русском скорее всего, можно попробовать перенаправить вывод в файл а потом поиграть с кодировками в notepad++ (например), чтобы получить все-таки что там написано. Хотя может Уваров подскажет более адекватный способ как заставить консоль linux отдать нам правильную кодировку. В Linux я не советчик=)) А если powershell запускаете
.\ZScript sda status все нормально отрабатывает??? Учетка от которой Zabbix работает какая?? И что выдает Get-ExecutionPolicy -List | Format-Table –AutoSize

Подробнее: https://www.securitylab.ru/analytics/461333.php

Quote from: STALKER_SLX on 15 November 2018, 22:03В самом веб-интерфейсе всё-также высвечивается та же ошибка «Value should be a JSON object»

Ну это следствие того что выводятся крокозябры скорее всего или  из-за того, что Вы не до конца поменяли шаблон или все-таки он поломался при пересохранении.


Уваров А.С.

Quote from: ival on 16 November 2018, 10:12Хотя может Уваров подскажет более адекватный способ как заставить консоль linux отдать нам правильную кодировку. В Linux я не советчик=))

Для начала надо выполнить необходимый минимум для настройки языка и региональных стандартов: https://interface31.ru/tech_it/2014/12/nastroyka-yazyka-i-regionalnyh-standartov-v-ubuntu-server-debian.html

STALKER_SLX

1.
Quote from: Уваров А.С. on 16 November 2018, 10:21Для начала надо выполнить необходимый минимум для настройки языка и региональных стандартов: https://interface31.ru/tech_it/2014/12/nastroyka-yazyka-i-regionalnyh-standartov-v-ubuntu-server-debian.html
Именно так у меня и настроена система, т.к. начинал свой админский путь по замечательным статьям уважаемого Уварова А.С.. За эти труды ему ОГРОМНАЯ благодарность!

2.
Quote from: ival on 16 November 2018, 10:12Учетка от которой Zabbix работает какая??
Установку и базовую настройку Zabbix произвёл по вот этой статье:
https://serveradmin.ru/ustanovka-i-nastroyka-zabbix-4-0/

Как из нее следует – Zabbix-агент установил как системную службу. Для этого скопировал архив с офф.сайта и распаковал его в папку «C:\zabbix», а после открыл командную строку с правами администратора и выполнил команду:
c:/zabbix/zabbix_agentd.exe --config c:/zabbix/zabbix_agentd.win.conf --install

3.
Quote from: ival on 16 November 2018, 10:12И что выдает Get-ExecutionPolicy -List | Format-Table -AutoSize
Все ограничения на выполнение PowerShell-скриптов в текущей системе пока сняты (скрин прилагаю – «powershell_format-table-autosize.JPG»). Тестовый компьютер работает под локальной учётной записью и НЕ входит в домен!
4.
Quote from: ival on 16 November 2018, 10:12Тяжело сказать, там что-то на русском скорее всего, можно попробовать перенаправить вывод в файл а потом поиграть с кодировками в notepad++ (например), чтобы получить все-таки что там написано.
Как-то я подзабыл по это :) Спасибо Вам за рефреш! Именно так сейчас поступил и в результате этих действий (оказалась кодировка ASCII/DOS) получил такой текст «"powershell" не является внутренней или внешней командой, исполняемой программой или пакетным файлом.»

И тут я вспомнил, что где-то на просторах Инета светлые умы писали о том, что нужно внести коррективы в строку «path» системных переменных. Для этого открываем «Панель управления – Система и безопасность – Система – Дополнительные параметры – Переменные среды» и переходим в «Системные переменные» (нижняя часть). Далее ищем там строку под названием «PATH» и добавляем (двойной щелчок или нажимаем кнопку «Изменить») в конец следующие параметры «%systemroot%\System32\WindowsPowerShell\v1.0\;» и «C:\Program Files\smartmontools\bin» разделяя их точкой с запятой!

В итоге у нас ВСЯ строка будет выглядеть так:
%SystemRoot%\system32;%SystemRoot%;%SystemRoot%\System32\Wbem;%systemroot%\System32\WindowsPowerShell\v1.0\;C:\Program Files\smartmontools\bin

После указанных действий в терминале на сервере Zabbix команда «zabbix_get -s "192.168.170.1" -k ZScript[sda,status]» начала успешно отрабатывать и выдавать нужные результаты (см.скрины «hdd_passed.JPG» и «zabbix_get_s_-k ZScript_hdd.JPG»)

После такого успеха сразу зашёл в веб-интерфейс Zabbix и подключил «оригинальный шаблон» такой же, как и автора статьи (https://serveradmin.ru/files/zabbix/zabbix-smart-win-template.xml), по которой и пытался реализовать задачу мониторинга SMART-а дисков.

В результате ошибка «Value should be a JSON object» исчезла и данные по дискам начали поступать в систему мониторинга!

То есть, никаких изменений в шаблон и PowerShell-скрипт я не вносил, а добавил только два параметра в строку «PATH» «Системных переменных» (см. выше).



KiraD

Коллеги, данная тема осталось актуальной и в 2020.
Не удается побороть «Value should be a JSON object» в Zabbix 4.0.2.

Предпринял все вышеуказанные действия:
1. Изменил Get-ExecutionPolicy на bypass для компьютера и пользователя

2. Изменил в шаблоне все параметры [{#DISKID}, параметр]  на  ["{#DISKID}", параметр]

3. Прописал переменные среды PATH:
%SystemRoot%\system32;%SystemRoot%;%SystemRoot%\System32\Wbem;%systemroot%\System32\WindowsPowerShell\v1.0\;C:\Program Files\smartmontools\bin

4. Файл скрипта windows.hdd.ps1 протестировал на локальной машине,данные по SMART отдаются через
.\windows.hdd.ps1 sba параметр То есть локально скрипт работает нормально.

5. Пробовал Zabbix клиенты для Windows разных версий (4.0.0 и выше)

Как итог:
1. Zabbix с переделанным шаблоном продолжает ругаться на JSON

2. Невозможно выполнить zabbix_get -s  192.168.*.* -k ZScript[sda,status] с сервера. Получаю ошибку
zabbix_get [8957]: Check access restrictions in Zabbix agent configuration    (В конфиге клиента IP адрес сервера прописан, разрешающие правила брандмауэра на соответствующий адрес сервера и порты 10050 и 10051 установлены). В лог файлах клиента появляются сообщения: 5804:20200204:160249.211 Message from 192.168.10.159 is missing header. Message ignored.


Не совсем понимаю, это две отдельные проблемы или они связаны? И стоит сначала разобраться с получением данных на стороне сервера через zabbix_get или проблема только в JSON?
Заранее спасибо за ответ!

ival

Затрудняюсь ответить, т.к. не могу вспомнить на какой версии я тогда смотрел это шаблон и проверки. Если актуально, то смогу проверить на 4 только в середине следующей недели. Возможно в 4 есть какие-то нюансы.

STALKER_SLX

Quote from: KiraD on 04 February 2020, 16:172. Невозможно выполнить zabbix_get -s  192.168.*.* -k ZScript[sda,status] с сервера. Получаю ошибку
zabbix_get [8957]: Check access restrictions in Zabbix agent configuration    (В конфиге клиента IP адрес сервера прописан, разрешающие правила брандмауэра на соответствующий адрес сервера и порты 10050 и 10051 установлены). В лог файлах клиента появляются сообщения: 5804:20200204:160249.211 Message from 192.168.10.159 is missing header. Message ignored.

Для начала приложите сюда свой конфиг Zabbix-агента с Windows-машины, т.к. именно на него ругается Ваш Zabbix-сервер судя по приведённой Вами ошибке:
Check access restrictions in Zabbix agent configuration