Використовуємо powershell скрипти в icinga2

Продовжуємо піднімати микромониторинг. Будемо виходити з того, що у нас є парк, в основному, складається з windows машин, і вони знаходяться у локальних мережах, ніяк не пов'язаних між собою, але з доступом в інтернет. Скористаємося рідним для windows powershell і навчимо наші Icinga2 windows агенти відправляти потрібні нам відомості без прямого доступу до них.

В останніх версіях Icinga2 агента для windows змінилося розташування конфігураційних файлів, тепер вони знаходяться в каталозі: C:\ProgramData\icinga2\etc\icinga2. На клієнті в файлі zones.conf додамо глобальну зону (у нових версіях агента така зона вже прописана, але закоментований):

object Zone "global-templates" {
global = true
}

На сервері створимо директорію /etc/icinga2/zones.d/global-templates, а в ній файл commands.conf з наступним вмістом де визначимо команду для виконання скриптів powershell:

object CheckCommand "powershell" {
import "plugin-check-command"
timeout = 5m
command = [ "powershell.exe" ]
arguments = {
"-command" = { skip_key = true
value = "$ps_command$"
order = 0
}
"-args" = { skip_key = true
value = "$ps_args$"
order = 1
}
}
}

Додаткові необов'язкові команди
//Запуск 64 розрядної версії powershell
object CheckCommand "powershell64" {
import "plugin-check-command"
timeout = 3m
command = [ "C:\\Windows\\SysWOW64\\WindowsPowerShell\\v1.0\\powershell.exe" ]
arguments = {
"-command" = {
value = "$ps_command$"
order = 0
}
"-args" = { skip_key = true
value = "$ps_args$"
order = 1
}
}
}

//Запуск powershell без перевірки підпису.
object CheckCommand "powershell-bypass" {
import "plugin-check-command"
timeout = 3m

command = [ "powershell.exe" ]
arguments = {
"-ExecutionPolicy" = {
value = "ByPass"
order = 0
}
"-File" = {
value = "$ps_command$"
order = 1
}
"-args" = { skip_key = true
value = "$ps_args$"
order = 2
}
}

}


На сервері в цьому ж каталозі створимо файл services.conf в якому будуть описуватися сервіси наших агентів. Для початку додамо сервіс оновлення скриптів з сервера.

apply Service "upd-powershell-scripts" {
max_check_attempts = 2
//Сервіс буде виконуватися кожні 60 хвилин
check_interval = 60м
retry_interval = 30m
//Сервіс буде застосовуватися тільки на агента з Windows
assign where host.vars.os == "Windows" && host.name == Вузла
//Сервіс буде ігноруватися на Linux
ignore where host.vars.os == "Linux"

check_command = "powershell"
vars.ps_command = "C:\\Scripts\\Icinga2\\update_icinga2_scripts.ps1"
}

При установці Windows агента у файлі etc/conf.d/hosts.conf за замовчуванням прописується мінлива vars.os = «Windows» на основі цього і буде застосовуватися даний сервіс та ігноруватися на Linux агентів.

Тепер на клієнті в директорії c:\Scripts\Icinga2 потрібно розмістити powershell скрипт який буде виконувати оновлення скриптів.

Скрипт завантаження скриптів powershell з віддаленого сервера
<#
icinga2scripts
Версія 0.2
Description: Update powershell from remote host.
Pavel Satin © 2016
pslater.ru@gmail.com
#>

$returnStateOK = 0
$returnStateWarning = 1
$returnStateCritical = 2
$returnStateUnknown = 3

$localDir = "c:\Scripts\icinga2\"

$ScriptHost = "http://наш-веб-сервер"
$ScriptHostPath = $ScriptHost + "/icinga2scripts/"

Try
{
$HttpContent = Invoke-WebRequest -URI $ScriptHostPath -UseBasicParsing

$ArrLinks = $HttpContent.Links | Foreach {$_.href }

Foreach ($ArrStr in $ArrLinks)
{
if ( $ArrStr.endsWith(".ps1") )
{
##Для Apache2
$NewScriptHostPath = $ScriptHostPath + $ArrStr
##Для IIS, він віддає посилання разом з електронними каталогами
#$NewScriptHostPath = $ScriptHost + $ArrStr

$localFile = $localDir + $ArrStr
Invoke-WebRequest -URI $NewScriptHostPath -UseBasicParsing -OutFile $localFile

$script_count = $script_count + 1

}
}

$icinga2_status = "Update OK: Downloads " + $script_count + " scripts."

Write-Host $icinga2_status
[System.Environment]::Exit($returnStateOK)

}
Catch
{
$ErrorMessage = $_.Exception.Message
$FailedItem = $_.Exception.Ім'я елемента

Write-Host $ErrorMessage
[System.Environment]::Exit($returnStateCritical)

}


Через невеликий проміжок часу агенти скачають нову версію глобальної зони.
Запускаємо на сервері оновлення конфігурації нод і перевантажуємо сервіс:

icinga2 node update-config
service icinga2 reload

Наш сервіс додано на агента і працює.



Для прикладу додамо функціонал перезавантаження. Додамо в файл services.conf ще один сервіс, який буде виконувати перезавантаження ОС на нашу вимогу. Обов'язково відключимо активну перевірку такого сервісу (адже ми не хочемо що б контрольований нами сервер перезавантажувався кожен n хвилин).

apply Service "reboot-system" {
//Відключаємо активну перевірку
enable_active_checks = false
max_check_attempts = 2

//Сервіс буде застосовуватися тільки на агента з Windows
assign where host.vars.os == "Windows" && host.name == Вузла
//Сервіс буде ігноруватися на Linux
ignore where host.vars.os == "Linux"

check_command = "powershell"
vars.ps_command = "C:\\Scripts\\Icinga2\\Reboot_System.ps1"
}

Знову на сервері запускаємо оновлення конфігурації нод і перевантажуємо сервіс, що б зміни конфігурації вступили в силу:

icinga2 node update-config
service icinga2 reload

Скрипт перезавантаження
<#
icinga2scripts
Версія 0.2
Description: Reboot system.
Pavel Satin © 2016
pslater.ru@gmail.com
#>

$returnStateOK = 0
$returnStateWarning = 1
$returnStateCritical = 2
$returnStateUnknown = 3

#Перевірка аргументів
if ( $args[0] -ne $Null) {
$ComputerName = $args[0]
} else {
$ComputerName = "localhost"
}

$result = Test-Connection -ComputerName $ComputerName -Count 2 -Quiet

if ($result)
{

Restart-Computer -computername $ComputerName -force
Write-Host "OK - send Command."
[System.Environment]::Exit($returnStateOK)

} #End if test connection result
else {
Write-Host "Хост $ComputerName не доступний."
[System.Environment]::Exit($returnStateUnknown)
}


Цей скрипт ми розмістимо на нашому веб-сервері (який прописаний в скрипті завантаження) і агент сам його скачає через певний проміжок часу. Перевірити працездатність сервісу можна такою командою на сервері:

/bin/echo "[`date +%s`] SCHEDULE_FORCED_SVC_CHECK;ИмяНоды;reboot-system;`date +%s`" >> /var/run/icinga2/cmd/icinga2.cmd

Після чого машина з windows агентом повинна перезавантажитися.

Що б powershell скрипти відпрацьовували на агента, їх потрібно підписувати (Як підписати або правильно налаштувати політику виконання (Set-ExecutionPolicy). Для того що б Icinga2 правильно визначив стан сервісу після перевірки (норма/попередження/критично), скрипт обов'язково повинен повернути правильний код повернення.

Основні коди повернення в скриптах ми визначили так:

$returnStateOK = 0
$returnStateWarning = 1
$returnStateCritical = 2
$returnStateUnknown = 3

Наприклад при критичному стані сервісу ми повертаємо:

Write-Host "Хост $ComputerName не доступний."
[System.Environment]::Exit($returnStateCritical)


Додаткові дані про продуктивність з скрипта можна повернути приблизно так:

Write-Host "OK - Дані принтера:"
"<table><thead><tr><th>_</th><th>Value</th></tr></thead><tbody>"
"<tr><td>що Залишився відсоток тонера:</td><td>" + $catridge_usage_prc + " %</td></tr>"
"<tr><td>Віддруковано сторінок:</td><td>" + $page_count + "</td></tr></tbody></table>"
"|catridge_usage_prc=$catridge_usage_prc;10;3;100;0"
"|page_count=$page_count;;;;"
[System.Environment]::Exit($returnStateOK) 

Тут після пайпа ми відправляємо дані продуктивності в наступному форматі:

'label'=value[UOM];[warn];[crit];[min];[max]

У icingaweb2 це буде виглядати приблизно так:



Якщо у вас скрипти з висновком повідомлень на кирилиці, файли обов'язково повинні бути збережені в кодуванні UTF-8 with BOM, інакше можуть виникнути проблеми з відображенням цих повідомлень в нашому веб інтерфейсі або в icingaweb2.

Плагінів для icinga/nagios вже написано безліч, але в більшості випадків вони розраховані на роботу в linux системах. Для windows звичайно ж є готові рішення доповнюють стандартні команди icinga2, наприклад: nsclient++, але це додаткові суті, додаткові конфігурації. У нашому ж рішення все зроблено стандартними засобами windows і при цьому є можливість отримувати додаткову інформацію «на льоту», просто додавши додатковий сервіс у конфігурацію Icinga2 і додатковий powershell скрипт на веб-сервер.

Посилання

Піднімаємо микромониторинг на icinga2 з мінімальними витратами
Репозиторій зі скриптами
Гайдлайны плагінів моніторингу
Джерело: Хабрахабр

0 коментарів

Тільки зареєстровані та авторизовані користувачі можуть залишати коментарі.