icinga2でのPowerShellスクリプトの使用

私たちは引き続きマイクロモニタリングを高めています 。 主にマシンのウィンドウで構成される公園があり、それらは互いに接続されていないがインターネットにアクセスできるローカルネットワークに配置されているという事実から進めます。 ネイティブウィンドウ-PowerShellを使用し、Icinga2ウィンドウエージェントに直接アクセスせずに必要な情報を送信するように指示します。



Windows用Icinga2エージェントの最新バージョンでは、構成ファイルの場所が変更されましたが、現在はC:\ ProgramData \ icinga2 \ etc \ icinga2ディレクトリに配置されています。 クライアントで、zones.confファイルにグローバルゾーンを追加します(エージェントの新しいバージョンでは、そのようなゾーンはすでに登録されていますがコメントアウトされています)。



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





サーバー上で、ディレクトリ/etc/icinga2/zones.d/global-templatesを作成し、powershellスクリプトを実行するコマンドを定義する次のコンテンツを含むcommands.confファイルを作成します。



 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 = 60m   retry_interval = 30m //       Windows   assign where host.vars.os == "Windows" && host.name == NodeName //    Linux   ignore where host.vars.os == "Linux"   check_command = "powershell"   vars.ps_command = "C:\\Scripts\\Icinga2\\update_icinga2_scripts.ps1" }
      
      





Windowsエージェントをインストールすると、変数vars.os =“ Windows”がデフォルトでetc / conf.d / hosts.confファイルに書き込まれ、Linuxエージェントではこのサービスが使用され無視されます。



クライアントのディレクトリc:\ Scripts \ Icinga2に、スクリプトを更新するPowerShellスクリプトを配置する必要があります。



リモートサーバーからPowerShellスクリプトを読み込むスクリプト
 <# icinga2scripts Version 0.2 Description: Update powershell from remote host. Pavel Satin (c) 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.ItemName Write-Host $ErrorMessage [System.Environment]::Exit($returnStateCritical) }
      
      







しばらくすると、エージェントは新しいバージョンの大域ゾーンをダウンロードします。

サーバー上のノード構成の更新を開始し、サービスをオーバーロードします。



 icinga2 node update-config service icinga2 reload
      
      





私たちのサービスはエージェントに追加され、機能します。







たとえば、再起動機能を追加します。 リクエストに応じてOSを再起動するサービスをservices.confファイルにもう1つ追加します。 そのようなサービスのアクティブなチェックを必ず無効にしてください(私たちが制御するサーバーがn分ごとに再起動するのは望ましくありません)。



 apply Service "reboot-system" { //   enable_active_checks = false   max_check_attempts = 2 //       Windows   assign where host.vars.os == "Windows" && host.name == NodeName //    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 Version 0.2 Description: Reboot system. Pavel Satin (c) 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 - Command send." [System.Environment]::Exit($returnStateOK) } #End if test-connection result else { Write-Host " $ComputerName  ." [System.Environment]::Exit($returnStateUnknown) }
      
      







このスクリプトをWebサーバー(ダウンロードスクリプトに登録されている)に配置し、エージェントが一定時間後にダウンロードします。 サーバーで次のコマンドを実行すると、サービスの保守性を確認できます。



 /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では、次のようになります。







キリル文字で表示されるメッセージを含むスクリプトがある場合、ファイルはBOMエンコードを使用してUTF-8で保存する必要があります。そうしないと、Webインターフェースまたはicingaweb2でこれらのメッセージを表示するときに問題が発生する可能性があります



icinga / nagios用の膨大な数のプラグインがすでに作成されていますが、ほとんどの場合、Linuxシステムで動作するように設計されています。 もちろん、Windowsの場合、標準のicinga2コマンドを補完する既製のソリューションがあります。たとえば、 nsclient ++ですが、これらは追加のエンティティ、追加の構成です。 このソリューションでは、すべてが標準のWindowsツールを使用して行われ、同時にIcinga2構成に追加のサービスとWebサーバーに追加のPowerShellスクリプトを追加するだけで、追加情報をその場で取得できます。



参照資料



最小限の費用でicinga2のマイクロモニタリングを引き上げます

スクリプトを含むリポジトリ

プラグインを監視するためのガイドライン



All Articles