介绍

如果有人不想在 Windows 机器上安装 Icinga 代理并想采用无代理方式,则使用 WMI 层可以提供解决方案。Windows Management Instrumentation (aka WMI) 是基于 Web 的企业管理 (WBEM) 的 Microsoft 实现。无需代理即可监控 Windows 机器的其他解决方案包括 Powershell、SSH(适用于 2019 及更高版本)和 SNMP。在这里,我们将重点介绍 WMI,并让其他人描述他们针对各自工具的解决方案。

 

要求

为了能够从 Windows 获取所需的信息到 Icinga,需要一个名为check_wmi_plus的插件。插件是用 Perl 编写的,并且依赖于其他几个 Perl 模块。还需要一个名为wmic的底层工具,它是 Linux 的 WMI 客户端,通常需要从源代码编译。最后但并非最不重要的一点是,需要在 Windows 机器上启用 WMI(通常默认情况下启用)并创建一个可以访问 WMI 的单独用户,但请记住限制该用户的其他权限。

安装

Linux

WMIC

这可以通过从源代码编译或使用预打包的二进制文件来安装。编译可能会出现问题,因为代码已经有一段时间没有得到维护了,而且可能再也不会了。

资源

转到http://edcint.co.nz/checkwmiplus/download/zenoss-wmi-source-v1-3-14/ 385并下载源代码并将其存储在/usr/local/src/. 解压它,然后进入 Samba/source :cd Samba/source并运行以下命令:

./autogen.sh
./configure
make
make install #might not be needed

如果您看到如下错误:

Can't use 'defined(@array)' (Maybe you should just omit the defined()?) at ./pidl/pidl line 583.

只需在提到的行中注释掉该定义并make再次运行。

您也可以放心地忽略以下内容:

make: *** No rule to make target `wmi/wmiq.o', needed by `bin/wmiq'.  Stop.

如果您遇到另一个错误,请尝试更改编译器指令,例如:

make "CPP=gcc -E -ffreestanding"

如果编译完成且没有错误,则该进行测试了。 从一个简单的命令开始:wmic -U [domain/]adminuser%password //host_or_IP "select TotalPhysicalMemory from Win32_ComputerSystem" 响应应该如下所示:

CLASS: Win32_ComputerSystem
Name|TotalPhysicalMemory
hostname|412180664

要获得更多可能的值,请运行:wmic -U [domain/]adminuser%password //host_or_IP "select * from Win32_ComputerSystem"

您可能可以在一台机器上编译它并将二进制文件传输到另一台机器,但我还没有测试过。

套餐

作为记录,二进制文件不是你最好的选择,但如果你找到与你的发行版本足够接近的东西,也许值得一试。下面推荐了几个来源,但欢迎您在网上搜索更多信息并在评论部分提出建议。

  • RPM
  • https://centos.pkgs.org/7/atomic-x86_64/wmi-1.3.14-4.el7.art.x86_64.rpm.html 107

或搜索rpm.pbone.net

  • 开发银行
  • Debian: http: //www.inverse.ca/downloads/PacketFence/debian/pool/stretch/w/wmi/ 114
  • Ubuntu: http: //www.inverse.ca/downloads/PacketFence/ubuntu/pool/jessie/w/wmi/ 107

Icinga/Nagios 插件

由于 check_wmi_plus 是用 Perl 编写的插件,因此需要同时安装某些模块。这可以通过系统的包管理器(apt 用于 Debian/Ubuntu,yum/dnf 用于 Fedora/RedHat/Centos,pacman 用于 Arch 等)或通过 CPAN 来完成。请注意,该插件在模块的版本中是(某种)敏感的,因此如果您的 Linux 发行版的存储库包含比所需版本新得多的版本,则建议从 CPAN 安装。

这是它目前在我们运行的 CentOS 7 服务器上的外观,所有 Perl 模块都来自官方 CentOS 存储库。

模块名称

安装版本

所需版本

配置::IniFiles

2.79

2.58

Getopt::长

2.4

2.38

约会时间

1.04

0.66

编号::格式

1.73

1.73

数据::自卸车

2.145

2.125

标量::实用程序

1.27

1.22

可储存

2.45

2.22

Perl 版本

5.016003

5.01

从 CPAN 安装很简单,例如:cpan install Number::Format. 但如果您需要特定版本,则需要提供完整的模块分发文件名,包括作者,例如:cpan SHLOMIF/Config-IniFiles-2.58.tar.gz

下一步是下载插件本身。转到发布 12并下载最新版本。将它解压到某个地方,理想情况下,您的 Icinga 变量CustomPuginDir指向的位置但在它自己的目录下。然后您需要在主 Perl 脚本 check_wmi_plus.pl 中进行一些更改。

  • 设置 utils.pm 的正确位置。默认情况下,它指向/usr/lib/nagios/plugins但更有可能在/usr/lib64/nagios/plugins.
  • 将$base_dir变量设置为 check_wmi_plus.pl 的安装目录。
  • $wmic_command在变量中设置 wmic 二进制文件的位置。
  • (可选)将变量设置$wmi_ini_dir为所有ini文件的位置
  • (可选)设置变量$tmp_dir以更改临时文件的默认位置。默认为/tmp/

在插件主页中阅读更多内容 19

视窗

为了让我们的监控解决方案能够登录到 Windows 机器并获取我们需要的所有指标,需要一个帐户。在您的域控制器中添加用户的过程如下。

  1. 打开 WMI 控制台:单击开始,单击运行,键入 wmimgmt.msc,然后单击确定。
  2. 在控制台树中,右键单击 WMI Control ,然后单击 Properties 。
  3. 单击安全选项卡。
  4. 选择您要授予用户或组访问权限的命名空间,然后单击安全性。
  5. 在“安全”对话框中,单击“添加”。
  6. 在“选择用户、计算机或组”对话框中,输入要添加的对象(用户或组)的名称。单击检查名称以验证您的输入,然后单击确定。您可能需要更改位置或单击“高级”按钮来查询对象。有关详细信息,请参阅对话框帮助。
  7. 在 Security 对话框中的 Permissions 下,选择允许或拒绝新用户或组的权限:Execute Methods (enable)、Full Write (disable)、Partial Write (disable)、Provider Write (disable)、Enable Account (enable) )、远程启用(启用)、读取安全性(启用)、编辑安全性(禁用)

注意:要执行这些任务,您需要作为本地管理员组的成员登录(如果它是本地计算机)。要访问远程计算机,请右键单击 WMI 控制 ,单击连接到另一台计算机 ,单击另一台计算机 ,然后键入要连接的计算机的名称。如果您从计算机管理控制台使用 WMI 控制,请右键单击计算机管理以连接到另一台计算机。

还建议在防火墙中启用 WinRM 并启用远程桌面:

netsh advfirewall firewall set rule group="remote desktop" new enable=Yes  
winrm quickconfig

第二个命令在 Windows 节点上设置一个侦听器。回答“是”以应用这些更改。

预期结果:

WinRM has been updated for remote management.
WinRM service type changed to delayed auto start.
WinRM service started.
Created a WinRM listener on HTTP://* to accept WS-Man requests to any IP on this machine.

[WMI for Windows Server]( https://docs.microsoft.com/en-us/previous-versions/windows/it-pro/windows-server-2008-R2-and-2008/cc771551(v =ws.11) 21)

配置

指南的以下部分适用于使用 DSL(即纯文本配置文件)配置 Icinga 的人员。在 Icinga Director模块中执行此操作的方法留给社区的另一位成员贡献

wpf 监控系统 wmi监控windows_perl

认证文件

Icinga 需要知道它可以通过哪个用户连接到 Windows 机器。出于这个原因,我们为 WMI 创建了一个特殊的文件,命名为wmi.auth或您想要的,理想情况下/etc/icinga2/,例如:/etc/icinga2/wmi.auth,具有以下内容:

username=myusername
password=mypassword
domain=mydomain

采取预防措施,将此文件归 root 所有,并使其只能由 root 读取chown root wmi.auth && chmod 0400 wmi.auth

命令.conf

接下来我们需要将 WMI 命令添加到 Icinga。如果您使用的是纯文本配置文件,则可以在您拥有自定义命令的文件中填充该文件,或将其添加到commands.conf或完全添加到单独的文件中。

object CheckCommand "check_wmi" {
    import "plugin-check-command"
    command = [ PluginDir + "/check_wmi_plus.pl" ]
    arguments = {
        "-H" = {
                value = "$host.address$"
                description = "name or IP address of host to monitor"
        }
        "-A" = {
        		value = "$wmi_authfile_path$"
        		description = "Authentication file path"
        }
        "-m" = {
         		value = "$check_mode$"
         		description = "WMI mode to use for specific check"
        }
        "-s" = {
        		value = "$wmi_submode$"
        		description = "WMI submode to be used, optional"
        }
		"-a" = {
				value = "$wmi_arg1$"
				description = "First argument to WMI"
		}
		"-o" = {
				value = "$wmi_arg2$"
				description = "Second argument to WMI"
		}
		"-3" = {
				value = "$wmi_arg3$"
				description = "Third argument to WMI"
		}
		"-4" = {
				value = "$wmi_arg4$"
				description = "Fourth argument to WMI"
		}
		"-y" = {
				value = "$wmi_delay$"
				description = "The delay between 2 consecutive WMI queries in a single call"
		}
		"-w" = {
				value = "$wmi_warn$"
				description = "Warning Thresholds"
		}
		"-c" = {
				value = "$wmi_crit$"
				description = "Critical Thresholds"
		}
		"--nodatamode" = {
			set_if = "$wmi_nodatamode$"
		}
		"--inidir" = {
				value = "$wmi_inidir$"
				description = "The full path of an ini directory to use"
		}
	}

	vars.wmi_authfile_path = "/etc/icinga2/wmi.auth"
	vars.wmi_inidir = "/opt/icinga/plugins/check_wmi_plus.d"
	vars.wmi_nodatamode = false
}

模板.conf

我们还需要为这些类型的服务提供一个新模板,以便我们可以微调某些方面而不会与其他类型混淆。例子:

template Service "wmi-service" {
	import "generic-service"
	check_command = "check_wmi"
	check_interval = 1m
	retry_interval = 1m
}

WMI-services.conf

在单独的文件中,甚至在预先存在的文件中,我们现在可以为我们的新服务集添加应用规则。例子:

apply Service "Free Disk Space" {
   import "generic-service"
   
   vars.check_mode = "checkvolsize"
   vars.wmi_arg1 = "."
   vars.wmi_arg2 = "1"
   vars.wmi_arg3 = "1"
   vars.wmi_warn = "88"
   vars.wmi_crit = "92"
   }
   
   check_command = "check_wmi"
   assign where host.vars.os == "Windows"
   ignore where host.vars.disable_wmi
}

apply Service "CPU Utilization" {
   import "generic-service"
   vars.check_mode = "checkeachcpu"
   vars.wmi_warn = "95"
   vars.wmi_crit = "99"
   vars.wmi_timeout = "160"
   check_command = "check_wmi"
   assign where host.vars.os == "Windows"  && host.vars.cpu_utilz
   ignore where host.vars.disable_wmi
}

apply Service "IIS: Connections" {
   import "generic-service"
   vars.check_mode = "checkiis"
   vars.wmi_submode = "connections"
   vars.wmi_arg1 = "_Total"
   vars.wmi_timeout = "190"
   check_command = "check_wmi"
   assign where host.vars.iis_server
   ignore where host.vars.disable_wmi
}

apply Service "MSSQL: General Statistics" {
   import "generic-service"
   vars.check_mode = "checksql"
   vars.wmi_submode = "general"
   if (host.vars.mssql_edition == "Express") {
      vars.wmi_arg1 = "MSSQLSQLEXPRESS_MSSQLSQLEXPRESS"
   }
   check_command = "check_wmi"
   assign where host.vars.mssql_server
   ignore where host.vars.disable_wmi
}

apply Service "Event Log: Application" {
   import "generic-service"
   vars.check_mode = "checkeventlog"
   vars.wmi_arg1 = "application"
   vars.wmi_arg2 = "2"
   vars.wmi_arg3 = "1"
   vars.wmi_warn = "50"
   vars.wmi_crit = "100"
   check_command = "check_wmi"
   assign where host.vars.os == "Windows"  && host.vars.event_log_application
   ignore where host.vars.disable_wmi
}

# Check for a specific process
/*
apply Service "Jenkins Process" {
   import "generic-service"
   vars.check_mode = "checkproc"
   vars.wmi_submode = "count"
   vars.wmi_arg1 = "jenkins"
   vars.wmi_crit = "1:1"
   check_command = "check_wmi"
   assign where host.name == "jenkins"
}

有关更多示例,您可以搜索,但我建议使用以下链接指南 31

结论

面对 PowerShell 和 SSH 支持,可能不是未来的最佳解决方案,但实际上对于监控遗留系统(即 WinSrv2019 之前的安装)很有用

常问问题

  • 问:我可以通过 WMI 监控哪些类型的服务?A:有一些类型,但您需要查看插件本身的文档。一个小列表包括:正常运行时间、磁盘、CPU、AD、RDP 会话、IIS、MSSQL、EventLog 和进程
  • 问:我可以编写自己的脚本吗?答:我认为是的,欢迎您尝试。但可能不值得你花时间。通过远程或 SSH 的 PowerShell 脚本更加通用且面向未来。看这里 58
  • 问:你能帮我处理我的配置文件吗?答:尝试在社区论坛中提问,我或其他人会在我们有时间时回复。