介绍
如果有人不想在 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 机器并获取我们需要的所有指标,需要一个帐户。在您的域控制器中添加用户的过程如下。
- 打开 WMI 控制台:单击开始,单击运行,键入 wmimgmt.msc,然后单击确定。
- 在控制台树中,右键单击 WMI Control ,然后单击 Properties 。
- 单击安全选项卡。
- 选择您要授予用户或组访问权限的命名空间,然后单击安全性。
- 在“安全”对话框中,单击“添加”。
- 在“选择用户、计算机或组”对话框中,输入要添加的对象(用户或组)的名称。单击检查名称以验证您的输入,然后单击确定。您可能需要更改位置或单击“高级”按钮来查询对象。有关详细信息,请参阅对话框帮助。
- 在 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模块中执行此操作的方法留给社区的另一位成员贡献
认证文件
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
- 问:你能帮我处理我的配置文件吗?答:尝试在社区论坛中提问,我或其他人会在我们有时间时回复。