ICINGA2 + Check WMI Plus でWindowsホストの監視(3)

今回は、ひととおり監視の設定が出来るようになったIcingaでメール通知の設定をします。

メール送信には mailx パッケージが必要なので、あらかじめインストールしておきます。

sudo yum -y install mailx


  1. ユーザーの作成
    メールの送信先となるユーザーを作成します。

    1. ユーザーテンプレートの作成
      まず、ユーザーテンプレートを作成する必要があります。
      Icinga Directorから、Users / Contacts を選択します。

    2. User templates を選択して、下記のようにユーザーテンプレートを作成します。

    3. ユーザーの作成

      再度 Users / Contacts を選択して、ユーザーを作成します。この中で、先ほど作成したユーザーテンプレートを指定します。


  2. Notification templateの作成

    次に、Notification templateを作成します。
    Icinga Directorから、Notification - Notification templates を選択して、Host template, Service template をそれぞれ作成します。

    必要に応じ、State and transition state filterを設定することで、通知する内容をフィルタすることが出来ます。

  3. Notificationの作成

    最後に、Notificationを作成します。
    Icinga Directorから、Notification - Notification templates を選択して、下記のように作成します。
    ここで、先ほど作成したNotification Templateを指定します。


以上をDeployすることで、通知が有効になります。

デフォルトでは、サーバがMXレコードを引きメールを送信しようとします。
SMTPサーバを指定したい場合は、スクリプトを修正する必要があります。

  • /etc/icinga2/scripts/mail-service-notification.sh
  • /etc/icinga2/scripts/mail-host-notification.sh

#!/usr/bin/env bash
#
# Copyright (C) 2012-2018 Icinga Development Team (https://icinga.com/)
# Except of function urlencode which is Copyright (C) by Brian White (brian@aljex.com) used under MIT license

PROG="`basename $0`"
ICINGA2HOST="`hostname`"
MAILBIN="mail"

このMAILBINの内容に、SMTPサーバの指定を追加してしまいます。
MAILBIN="mail -S smtp=[smtpserver] "

ICINGA2 + Check WMI Plus でWindowsホストの監視(2)

(1)で、Icinga Web 2, Check WMI Plus のセットアップが完了しましたので、実際にWindowsのホストを監視する設定を行っていきます。

Icinga Directorでの設定は、DeployをすることでIcingaのコンフィグに反映します。エラーがある場合はその際に分かりますので、Deploymentsメニューから、途中途中でDeployしておくと良いと思います。


  1. Command Templateの作成

    Plugin Check Command用のCommand Templateを作成します。

    コマンドとなるスクリプトのファイルは check_wmi_plus.pl ですので、Commandタブはこちらのようになります。

    Argumentsタブで、引数を設定します。
    この中で、固定の値になる --inidir, --inifile は直接記述してしまいます。それ以外はすべて1.で作成したData Field変数です。


  2. Commandの作成

    2.で作成したテンプレートを使用して、Commandを作成します。

  3. Service Templateの作成

    3.で作成したCommandを使用して、Service Templateを作成します。

    Fieldsタブで、check_wmi_plus.pl の引数を追加していくと、上のように引数が表示されます。サービスによって引数の有無が違うので、Mandatoryかどうかは、必要に応じて設定します。

  4. Service Ruleの作成
    監視したい項目ごとに、Service Ruleを作成していきます。

    それぞれしたの画面のような設定になっています。
    このService Ruleの場合、

    host.vars.OS_Type = Windows
    host.vars.AD = True

    のときに自動的に監視項目となるようにしています。この変数は後述するHostの中で設定します。

    Custom Propertiesは、こちらの情報が参考になると思います。

    Check WMI Plus - Can you show me some example command lines?


  5. Host Templateの作成
    Host Templateを作成します。

    Fieldsタブで、こちらのように3つの変数を追加しています。
    それぞれ、下記のような目的で使用しています。

    • host_address
    • OS_Type
      • Windowsホストかどうか識別してService Ruleを適用するため。上の画面で、Windows という値を設定しています。
    • wmi_authfile_path
      • ホストの認証情報を書いたファイルを指定するため

  6. Hostの作成

    最後に、監視したいホストを作成します。
    ホストテンプレートで作成したhost_address, wmi_authfile_pathを指定しています。

    わざわざhost_addressを指定している理由は、Icingaサーバが監視したいホストのアドレスを解決できない場合、WMIクエリが失敗してしまうためです。

    wmi_authfile_pathは、ホストにより認証情報が異なることがあるため、あらかじめファイルを必要に応じ用意しておき、ホストごとに指定しています。同じ認証情報しか使用しない場合は不要です。

これでひととおりWindowsホストを監視するための設定が出来ました。

ICINGA2 + Check WMI Plus でWindowsホストの監視(1)

Check WMI Plus プラグインを使用して、Windowsホストの監視をします
参考にしたのは主に下記のサイトです。

  1. How to Install Icinga 2 and Icinga Web 2 on CentOS 7
  2. Install Icinga2, Icinga Web 2 and Icinga Director under EL7
  3. Check WMI Plus - edcint.co.nz
  4. Icinga2 and Windows monitoring (WMI)

いまのところ、情報がひとつのサイトにまとまっていないので苦労しますが、順番に見ていきます。

  1. Icinga, Icinga Web 2のセットアップ

     1.のサイトを参考に、Apatch, MariaDB, PHP, Icinga2をセットアップしていきます。

     途中、PHPのインストールで注意が必要です。
     CentOS7系の場合、デフォルトで古いPHP5.4がインストールされますが、Icingaweb2はPHP5.6を要求します。
    また、サイトの情報だと不足している、php-fpmも必要です。

    ここまで正常に進められれば、Icinga Webが利用できるようになりますので、サイトに従いWebからセットアップを行います。

    The directory /etc/icingaweb2 is not writable. というエラーが出ます。これは、SELinux status を permissive モードに変更することで回避します。


  2. Icinga Directorのセットアップ

     Icinga Directorモジュールをインストールすることで、GUIから各種設定ができるようになります。
     2.のサイトの後半 Icinga Director セクションからの手順を進めます。一通りインストールができたら、Kickstart Wizard を実行します。

  3. Check WMI Plusのセットアップ

     4.のサイトを参考に、Check WMI Plusプラグインをインストールします。Check WMI Plusはperlで書かれていますが、perlのモジュールが不足している場合があります。必要に応じ、モジュールをインストールします。

    yum install perl-Number-Format -y
    yum install perl-Config-IniFiles -y
    yum install perl-DateTime -y

     Step 4. Configuration for Icinga2 以降は、Check WMI Plusプラグインを使用するためのIcingaの設定になります。設定をIcinga Directorを使用して行う場合は、この手順はスキップして構いませんが、Icingaの設定の概念を理解しておかないとIcinga Directorの設定も難しいので、一度ここで試しておくのが良いかもしれません。

    ※ /etc/icinga2/conf.d/commands.conf の部分はソースが間違っていますので注意して下さい。

(2)で、実際にIcinga DirectorでCheck WMI Plusを使用するための設定方法を解説します。

vSphere 4.1 にWindows Server 2012 R2の仮想サーバを構築

vSphere 4.1 はWindows Server 2008までしか対応していないため、そのままではWindows Server 2012 R2の仮想サーバは構築できません。インストールの途中で、ブルースクリーンになってしまいます。
仮想サーバのBIOSEFIでないことと、CPUIDのマスクが必要だそうです。

こちらのページを参考に設定したところ、無事起動できるようになりました。

[参考] ソフトウェア開発者の日常 - Windows Server 2012 R2をvSphere ESXi環境にインストールする場合の注意点

【追記】

情報が不足していましたので、追記します。

  1. BIOSEFIに変更

このスレッドを参考に、BIOS ROMをアップロードし、これを使用するようにコンフィグに追記します。
[参考] How to install windows 8 on esxi 4.1 ?

bios440.filename = ""

  1. CPUIDマスクを変更

このページを参考に、CPU IDを修正します。

  1. Power off the virtual machine.
  2. Right-click the virtual machine and click Edit Settings.
  3. Click the Options tab.
  4. Select CPUID Mask under Advanced.
  5. Click Advanced.

For Intel:

Under the Register column, locate the edx register under Level 80000001.
Paste this into the value field:

        • :0---:----:----:----:----:----:----

For example:

cpuid.80000001.edx = ----:0---:----:----:----:----:----:----

For AMD:

Select the AMD Override tab.
Change cpuid.80000001.edx.amd = -----------H-------------------- to
cpuid.80000001.edx.amd = ----0---------------------------

レジストリのキーが存在するかどうかチェック

レジストリのキーが存在するかどうかチェックするPowershell

$tmp1 = test-path HKLM:"SOFTWARE\Wow6432Node\Microsoft\Windows\CurrentVersion\Uninstall\{4A0E73BB-0D67-4DB7-87BE-751068774920}"
$tmp2 = test-path HKLM:"SOFTWARE\Microsoft\Windows\CurrentVersion\Uninstall\{4A0E73BB-0D67-4DB7-87BE-751068774920}"
If (($tmp1 -eq $false) -and ($tmp2 -eq $false)){ Write-Output "Not Found." }

WMIでインストールされているソフト一覧を取得

WMIでインストールされているソフト一覧を取得し、結果を返すPowershell.

$tmp = Get-WmiObject Win32_Product | Select-String "Java"
If ([String]::IsNullOrEmpty($tmp)){ Write-Output "Not Found." }

SCCMでディスクを自動クリーンアップ

SCCMを使っていると、いろいろなことをやってみたくなります。
今回は、SCCMを使ってディスクを自動クリーンアップすることにします。

ただし、普通にパッケージを展開しても芸がありません。
ミソは、C:ドライブの空き容量を定期的にチェックし、一定の容量を下回った場合に自動クリーンアップされるようにする、というものです。

アプリケーションの作成

  1. まず、自動クリーンアップするためのアプリケーションを作成します。ここでパッケージではなくアプリケーションを使用する理由は後述します。

    1. 今回は、2つのスクリプトを用意しました。
      1つにまとめても良いのですが、もともと、こちらの情報を参考にcleanmgr.exe を自動実行するPowershellスクリプトを作成し、これに加えてテンポラリディレクトリ、SCCMのキャッシュフォルダのクリアもしたかったため、このような構成になりました。単に手抜きです。

      [参考] Greg's Systems Management Blog - Automating the Disk Cleanup Utility
      https://gregramsey.net/2014/05/14/automating-the-disk-cleanup-utility/

      こちらのバッチファイルで、テンポラリディレクトリのクリア、別のPowershellスクリプトの呼び出しを行います。

      auto_cleanmgr.bat

      powershell.exe -command Set-ExecutionPolicy Unrestricted
      del /Q c:\windows\temp\*.*
      powershell.exe -command \\m-mgmt-sccm01\smspkgg$\scripts\auto_cleanmgr.ps1
      exit 0
      こちらPowershellスクリプトで、SCCMキャッシュのクリア、cleanmgr.exeの自動実行を行います。

      auto_cleanmgr.ps1

      ######################################################### Capture current free disk space on Drive C

      $FreespaceBefore = (Get-WmiObject win32_logicaldisk -filter "DeviceID='C:'" | select Freespace).FreeSpace/1GB

      ######################################################### Clear ccmcache of SCCM client

      $resman = New-Object -ComObject "UIResource.UIResourceMgr"
      $cacheInfo = $resman.GetCacheInfo()
      "clearing ccmcache. . ."
      $cacheInfo.GetCacheElements() | ForEach{ $cacheInfo.DeleteCacheElement($_.CacheElementID) }

      ######################################################### CleanMgr.exe Automation
      #
      #http://gregramsey.net
      #more info here:
      #http://support.microsoft.com/kb/253597

      #ensure we're running on windows 8.1 first
      #if ((Get-CimInstance win32_operatingsystem).version -eq '6.3.9600') {

      #Set StateFlags0012 setting for each item in Windows 8.1 disk cleanup utility
      if (-not (get-itemproperty -path 'HKLM:\Software\Microsoft\Windows\CurrentVersion\Explorer\VolumeCaches\Active Setup Temp Folders' -name StateFlags0012 -ErrorAction SilentlyContinue)) {
      set-itemproperty -path 'HKLM:\Software\Microsoft\Windows\CurrentVersion\Explorer\VolumeCaches\Active Setup Temp Folders' -name StateFlags0012 -type DWORD -Value 2
      set-itemproperty -path 'HKLM:\SOFTWARE\Microsoft\Windows\CurrentVersion\Explorer\VolumeCaches\BranchCache' -name StateFlags0012 -type DWORD -Value 2
      set-itemproperty -path 'HKLM:\SOFTWARE\Microsoft\Windows\CurrentVersion\Explorer\VolumeCaches\Downloaded Program Files' -name StateFlags0012 -type DWORD -Value 2
      set-itemproperty -path 'HKLM:\SOFTWARE\Microsoft\Windows\CurrentVersion\Explorer\VolumeCaches\Internet Cache Files' -name StateFlags0012 -type DWORD -Value 2
      set-itemproperty -path 'HKLM:\SOFTWARE\Microsoft\Windows\CurrentVersion\Explorer\VolumeCaches\Memory Dump Files' -name StateFlags0012 -type DWORD -Value 2
      set-itemproperty -path 'HKLM:\SOFTWARE\Microsoft\Windows\CurrentVersion\Explorer\VolumeCaches\Old ChkDsk Files' -name StateFlags0012 -type DWORD -Value 2
      set-itemproperty -path 'HKLM:\SOFTWARE\Microsoft\Windows\CurrentVersion\Explorer\VolumeCaches\Previous Installations' -name StateFlags0012 -type DWORD -Value 2
      # set-itemproperty -path 'HKLM:\SOFTWARE\Microsoft\Windows\CurrentVersion\Explorer\VolumeCaches\Recycle Bin' -name StateFlags0012 -type DWORD -Value 2
      set-itemproperty -path 'HKLM:\SOFTWARE\Microsoft\Windows\CurrentVersion\Explorer\VolumeCaches\Service Pack Cleanup' -name StateFlags0012 -type DWORD -Value 2
      set-itemproperty -path 'HKLM:\SOFTWARE\Microsoft\Windows\CurrentVersion\Explorer\VolumeCaches\Setup Log Files' -name StateFlags0012 -type DWORD -Value 2
      set-itemproperty -path 'HKLM:\SOFTWARE\Microsoft\Windows\CurrentVersion\Explorer\VolumeCaches\System error memory dump files' -name StateFlags0012 -type DWORD -Value 2
      set-itemproperty -path 'HKLM:\SOFTWARE\Microsoft\Windows\CurrentVersion\Explorer\VolumeCaches\System error minidump files' -name StateFlags0012 -type DWORD -Value 2
      set-itemproperty -path 'HKLM:\SOFTWARE\Microsoft\Windows\CurrentVersion\Explorer\VolumeCaches\Temporary Files' -name StateFlags0012 -type DWORD -Value 2
      set-itemproperty -path 'HKLM:\SOFTWARE\Microsoft\Windows\CurrentVersion\Explorer\VolumeCaches\Temporary Setup Files' -name StateFlags0012 -type DWORD -Value 2
      set-itemproperty -path 'HKLM:\SOFTWARE\Microsoft\Windows\CurrentVersion\Explorer\VolumeCaches\Thumbnail Cache' -name StateFlags0012 -type DWORD -Value 2
      set-itemproperty -path 'HKLM:\SOFTWARE\Microsoft\Windows\CurrentVersion\Explorer\VolumeCaches\Update Cleanup' -name StateFlags0012 -type DWORD -Value 2
      set-itemproperty -path 'HKLM:\SOFTWARE\Microsoft\Windows\CurrentVersion\Explorer\VolumeCaches\Upgrade Discarded Files' -name StateFlags0012 -type DWORD -Value 2
      set-itemproperty -path 'HKLM:\SOFTWARE\Microsoft\Windows\CurrentVersion\Explorer\VolumeCaches\User file versions' -name StateFlags0012 -type DWORD -Value 2
      set-itemproperty -path 'HKLM:\SOFTWARE\Microsoft\Windows\CurrentVersion\Explorer\VolumeCaches\Windows Defender' -name StateFlags0012 -type DWORD -Value 2
      set-itemproperty -path 'HKLM:\SOFTWARE\Microsoft\Windows\CurrentVersion\Explorer\VolumeCaches\Windows Error Reporting Archive Files' -name StateFlags0012 -type DWORD -Value 2
      set-itemproperty -path 'HKLM:\SOFTWARE\Microsoft\Windows\CurrentVersion\Explorer\VolumeCaches\Windows Error Reporting Queue Files' -name StateFlags0012 -type DWORD -Value 2
      set-itemproperty -path 'HKLM:\SOFTWARE\Microsoft\Windows\CurrentVersion\Explorer\VolumeCaches\Windows Error Reporting System Archive Files' -name StateFlags0012 -type DWORD -Value 2
      set-itemproperty -path 'HKLM:\SOFTWARE\Microsoft\Windows\CurrentVersion\Explorer\VolumeCaches\Windows Error Reporting System Queue Files' -name StateFlags0012 -type DWORD -Value 2
      set-itemproperty -path 'HKLM:\SOFTWARE\Microsoft\Windows\CurrentVersion\Explorer\VolumeCaches\Windows ESD installation files' -name StateFlags0012 -type DWORD -Value 2
      set-itemproperty -path 'HKLM:\SOFTWARE\Microsoft\Windows\CurrentVersion\Explorer\VolumeCaches\Windows Upgrade Log Files' -name StateFlags0012 -type DWORD -Value 2
      }

      cleanmgr /sagerun:12

      do {
      "waiting for cleanmgr to complete. . ."
      start-sleep 15
      } while ((get-wmiobject win32_process | where-object {$_.processname -eq 'cleanmgr.exe'} | measure).count)

      $FreespaceAfter = (Get-WmiObject win32_logicaldisk -filter "DeviceID='C:'" | select Freespace).FreeSpace/1GB

      "Free Space Before: {0}" -f $FreespaceBefore
      "Free Space After: {0}" -f $FreespaceAfter

      #}

    2. 通常通り、auto_cleanmgr.batを実行するアプリケーションを作成します。

      ここで1つ仕掛けをします。
      アプリケーションの展開の種類で、下記のような検出方法を設定します。

      • 「カスタムスクリプトを使用してこの展開の種類のプレゼンスを検出する」を選択
      • スクリプトの種類」はVBScriptを選択して、下記のようなスクリプトを設定
        set fsobj = CreateObject("Scripting.FileSystemObject")
        set d1 = fsobj.GetDrive("C")
        If d1.FreeSpace/1024/1024>10024 Then
        WScript.StdOut.WriteLine d1.FreeSpace/1024/1024
        End If
        WScript.Quit(0)
      検出方法のスクリプトでは、スクリプトの出力がなにかあった場合、正常に検出されたことになります。逆に、何も出力が無いと、アプリケーションは未検出となり、インストールを実行しようとします。これを利用して、スクリプトでディスクの空き容量をチェックし、一定容量(このスクリプトでは約1GB)を上回った場合だけメッセージを出力するようにしておきます。このことで、検出の結果、アプリケーションが未検出と認識されて、スクリプトが実行されます。
      これが、パッケージではなくアプリケーションを使用した理由です。

    3. あとは、通常通りこのアプリケーションを展開するだけです。
以上の方法で実際に動作させることができますが、これとは別にディスクの空き容量が少ないPCだけを選択するデバイスコレクションを作成しました。このコレクションに展開設定をしておけば、実行が不要なデバイスにも展開する必要がなくなります。

コレクションの作成

方法は下記のとおりです。
  1. あらかじめ、ハードウェアインベントリのなかでディスクの空き容量を取得するよう、クライアント設定を変更します。これは、デフォルトではハードウェアインベントリでディスクの空き容量は取得する設定になっていないためです。

    1. 適用されているクライアント設定のダイアログで、ハードウェアインベントリ - ハードウェアインベントリクラスの「クラスの設定」ボタンをクリックします
    2. ツリーの中にある、論理ディスク - 空き容量(MB)のチェックを入れます

  2. バイスコレクションの作成の際、メンバシップ規則に、下記のようなクエリを設定します。
    select * from SMS_R_System full join SMS_G_System_LOGICAL_DISK as LDISK on LDISK.ResourceID = SMS_R_System.ResourceId where LDISK.FreeSpace <= 1024 and LDISK.DeviceID = "C:"
    この例では、C:ドライブの空き容量が1GBを下回ったデバイスのみがデバイスコレクションのメンバーになります。