18 Август 2019, 20:39

Цитата дня:

Если захламленный стол означает беспорядок в голове, то что же означает пустой стол? Альберт Эйнштейн


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

Автор STALKER_SLX, 08 Ноябрь 2018, 21:50

« предыдущая тема - следующая тема »

0 Пользователей и 1 Гость просматривают эту тему.

Вниз

STALKER_SLX

08 Ноябрь 2018, 21:50 Последнее редактирование: 08 Ноябрь 2018, 21:53 от 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 не используется.

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

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


Но ради интереса попробую посмотреть как-нибудь на досуге
Буду Вам весьма благодарен за помощь!

ival

#4
13 Ноябрь 2018, 19:03 Последнее редактирование: 13 Ноябрь 2018, 19:05 от 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=10
4. Сегодня изменил учетку запуска службы 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» ?!


Уваров А.С.

4. Сегодня изменил учетку запуска службы Zabbix на клиенте с локальной системы на свою учетку, т.к. -ExecutionPolicy Bypass -File почему-то не сработало. Надо лезть в technet смотреть по выполнению скриптов для системной УЗ, возможно там есть какие-то нюансы.
В документе https://docs.microsoft.com/en-us/powershell/module/microsoft.powershell.security/set-executionpolicy?view=powershell-6

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


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

ival

#9
16 Ноябрь 2018, 10:12 Последнее редактирование: 16 Ноябрь 2018, 10:23 от ival
Внёс коррективы с помощью программы «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


При выполнении в терминале на сервере команды «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

В самом веб-интерфейсе всё-также высвечивается та же ошибка «Value should be a JSON object»
Ну это следствие того что выводятся крокозябры скорее всего или  из-за того, что Вы не до конца поменяли шаблон или все-таки он поломался при пересохранении.


Уваров А.С.

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

STALKER_SLX

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

2.
Учетка от которой 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.
И что выдает Get-ExecutionPolicy -List | Format-Table -AutoSize
Все ограничения на выполнение PowerShell-скриптов в текущей системе пока сняты (скрин прилагаю - «powershell_format-table-autosize.JPG»). Тестовый компьютер работает под локальной учётной записью и НЕ входит в домен!
4.
Тяжело сказать, там что-то на русском скорее всего, можно попробовать перенаправить вывод в файл а потом поиграть с кодировками в 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» «Системных переменных» (см. выше).



Вверх