SMART (智能监控和重启工具)

作者:Albert Martorell

有很多优秀的监控工具(Big Brother、Nagios 等),其中一些允许从崩溃的服务中恢复,但它们的配置非常复杂,当您想要监控无法远程访问的本地服务(例如 syslog、xinet、mrtg、iptables 或 Nagios 本身)时,配置会变得更加复杂。

SMART 的目的是拥有一个简单、灵活且易于快速实施的应用程序,用于监控最关键的系统守护进程,使其可以在不修改代码的情况下添加新的守护进程,并避免安装和配置的复杂性。它还需要能够做出决策并解决问题(或至少尝试这样做)。

演变

在第一个“被动”监控版本之后,我们尝试更进一步,获得一个“主动”应用程序,也就是说,添加自动恢复的可能性。通过 crond 定期执行该应用程序,它应该检测到已关闭的守护进程并在没有系统管理员干预的情况下启动它们。

后来,我们考虑了非特权用户可以从控制台或远程(通过 Telnet 或 SSH)执行此应用程序的可能性。将检测和错误恢复集中在一个脚本中,使得与 sudo 的集成更加容易。此外,它允许将关键情况下所需的一些更强大的恢复操作(例如重启整个系统)委托给此非 root 特权用户。

使用 ps 命令,我们可以列出系统中所有活动的进程,但是“活动”与“可操作”并不相同,因此这促使我们包含了检查脚本,这些脚本是用于测试服务并确定它们是否真正可操作并响应请求的小程序。我们发现的困难表明,我们不应该浪费精力重新发明轮子,而应该利用 Nagios(我们已经满意地使用了近三年的监控软件)中包含的插件。

文件和目录

SMART 的发行版有两个 shell 脚本(smart 和 check-service)、两个配置文件(host.conf 和 services.conf)和两个目录(scripts 和 plugins),其中包含检查脚本和插件(清单 1)。

清单 1. SMART 安装文件和目录

[root@server /]# ls -la /home/sysman/
drwxr-x---  4 root sysman    4096 May 27 11:49 .
drwxr-xr-x  3 root root      4096 Jul  8  2003 ..
-rwxr-x---  1 root sysman    1448 May 27 11:51 smart
-rwx------  1 root root      7815 May 27 11:51 check-service
-rw-r--r--  1 root root       242 May 27 11:49 host.conf
drwx------  2 root root      4096 Apr 29 13:38 plugins
drwx------  2 root root      4096 Apr 29 13:39 scripts
-rw-r--r--  1 root root       883 May 17 10:40 services.conf

文件和目录的权限允许名为 sysman 的非特权用户执行该应用程序,但拒绝 sysman 修改内容以不当方式使用它的能力。

一般操作

SMART 程序读取配置文件 services.conf 和 host.conf,并为每个定义的服务执行 check-service。如果已为服务分配了检查脚本,例如图 1 中的服务 1 和 2,则 check-service 将执行它,传递所需的参数,然后等待退出状态以确定服务是否存活。如果此检查脚本执行了一些其他外部脚本(插件),例如图 1 中的服务 1,则该插件将负责检查服务状态。

SMART (Smart Monitoring and Rebooting Tool)

图 1. SMART 程序

如果未为服务分配检查脚本(图 1 中的服务 3),则 check-service 文件将通过获取活动进程的数量来确定服务状态。根据此信息、SMART 命令行参数和配置参数,它将决定要执行的操作。

与 sudo 集成

与 sudo(superuser do)工具集成允许系统管理员允许另一个用户(sysman)启动已停止的服务、重启所有服务或重启整个系统。这样做的好处是

  • 配置简单:无需授予该用户停止和启动每个服务的权限,也无需使用管理工具(ps、kill、rm 等)。check-service 脚本集中了整个操作。

  • 安全性:用户 sysman 无法读取、写入或执行 check-service 文件。

  • 易于使用:脚本由 sudo 管理,因此其使用对于用户来说是透明的。

对于需要主机服务器权限的用户 sysman,sudo 的配置文件(/etc/sudoers)应如清单 2 所示。

清单 2. 为 SMART 访问配置的 sudo

# Defaults specification
Defaults:root !syslog

# User privilege specification
root    ALL=(ALL) ALL
sysman  server=(root) NOPASSWD: /home/sysman/check-service
sysman  server=(root) NOPASSWD: /sbin/reboot

这样,当 root 用户执行 sudo 时,我们禁用 syslog 日志记录,并且我们仅在主机服务器上为用户 sysman 分配 root 权限,用于执行命令 /home/sysman/check-service 和 /sbin/reboot,而无需每次都向 sysman 询问密码。

验证

通过配置文件中定义的 PID 文件,我们获取父进程标识符(PID),并确定由此服务生成的活动进程数。接下来,我们检查是否

  • 服务在定义的时限内响应请求。

  • 服务生成的进程数不超过定义的最大值和最小值阈值。

状态确定

考虑到先前验证中获得的结果,我们将服务状态分类为

  • 0:服务在定义的时限内响应请求,服务生成的进程数保持在定义的阈值之间,并且 PID 文件提供的信息正确。

  • 1:服务在定义的时限内响应请求,并且服务生成的进程数保持在定义的阈值之间,但 PID 文件提供的信息不正确或此文件不存在,即使已定义了它。

  • 2:服务在定义的时限内响应请求,但服务生成的进程数超出定义的阈值(这可能是 Web 服务器过载但可操作的情况)。

  • 3:生成的进程数超出阈值,并且我们没有任何工具(脚本)来检查服务是否可操作(这可能是 syslogd、crond 和 xinetd 等进程的情况)。

  • 4:服务在定义的时限内未响应请求。

我们将上述五种情况分为三个更一般的情况

  • 正常 (状态 0 和 1)。

  • 警告 (状态 2)。

  • 宕机 (状态 3 和 4)。

决策

当不带参数执行程序时,它将简单地确定配置文件中定义的服务状态,并显示结果。如果我们希望程序以主动方式工作,我们需要使用以下一些参数

  • -w:重启处于警告状态的服务,并为每个服务发送通知(电子邮件)。

  • -d:重启处于宕机状态的服务,并为每个服务发送通知。

  • -wd:重启处于警告和宕机状态的服务,并为每个服务发送通知。

  • --all:重启所有服务,与其状态无关,并为每个处于警告或宕机状态的服务发送通知。

  • --reboot:重启整个系统,与服务状态无关,并发送一般通知。

一旦确定了服务状态,并根据执行中指定的参数,为每个服务执行的操作将包括表 1 中所示的内容。

表 1. 服务操作

状态参数操作
正常--all重启服务
警告-w, -wd, --all重启服务
  发送与服务相关的通知
 -d发送与服务相关的通知
宕机-d, -wd, --all重启服务
  发送与服务相关的通知

此外,无论服务状态如何,使用参数 --all 和 --reboot,都会通过电子邮件向管理员发送有关执行操作的通知。

清单 3 显示了 SMART 在操作中的示例,从控制台使用参数 -d(恢复处于宕机状态的服务)执行。

清单 3. smart -d 命令的示例输出

[sysman@server ~]# ./smart -d

SERVICE         PID     PROCS   STATUS          PROBLEM
-------         -----   -----   ------          -------
CRON            451     1       [OK]
DISK            ?       0       [OK]            No start command.
DHCP            444     1       [OK]
DNS             442     1       [OK]
HTTP            625    53       [WARN]          Too many processes (>30).
LPD             474     1       [OK]
MRTG            27017   1       [OK]
MYSQL           627     1       [OK]
NAGIOS          640     1       [OK]
NMB             633     1       [OK]
NTP             ?       1       [OK]
POSTFIX         619     0       [DOWN]          No response from service.
                                [Starting...]
->POSTFIX       23945   1       [OK]
POSTGRES        560     3       [OK]
SLAP            643     1       [OK]
SMB             631     6       [OK]
SNMP            635     1       [OK]
SNMPTRAP        637     1       [OK]
SSH             654     3       [OK]
SYSLOG          402     1       [OK]
XINET           462     1       [OK]
检查脚本

有一些可选的可执行文件,即检查脚本,负责检查受监控的服务是否真正可操作并响应请求。这些文件以 Shell(.sh 扩展名)和 Expect(.exp 扩展名)编写。Expect 是一个需要 Tcl 的工具,允许自动化使用文本表示的交互式应用程序。

这些脚本可以用任何编程语言编写,因为只考虑退出状态。如果它不等于 0,我们假设没有响应,或者服务给出的响应不是预期的响应。这意味着检查脚本不仅可以监控服务,还可以实现任何返回布尔值的检查,例如,检查目录的大小是否超过某个值,登录用户数量是否大于期望的数字,是否加载了内核模块等等(清单 4)。

清单 4. nag 和 Shell 脚本的示例

[root@server /]# ls /home/sysman/scripts/
disk.nag       http-forb.nag  nfs.nag     pop3.nag     smtp.nag
disk.sh        http.nag       nfs.sh      printer.nag  snmp.nag
dns.nag        http.sh        nmb.sh      proxy.nag    ssh2.nag
dns.sh         imap.exp       ntp.sh      slap.nag     ssh.nag
ftp.exp        imap.nag       pgsql2.nag  slap.sh      ssh.sh
ftp.nag        mysql.nag      pgsql.nag   smb.nag
http-auth.nag  mysql.sh       pgsql.sh    smb.sh
http.exp       nagios.nag     pop3.exp    smtp.exp

扩展名为 .nag 的文件也是 Shell 脚本,但与前者不同,它们调用外部程序(插件),并将从 check-service 收到的参数传递给它,遵循插件期望的顺序和格式。这会检查服务并将收集的信息返回给检查脚本,检查脚本将解释信息并将其转换为 check-service 正在等待的退出状态(清单 5)。

清单 5. nag 脚本由插件处理。

[root@server /]# ls /home/sysman/plugins/
check_disk  check_http    check_pgsql  check_snmp  check_udp
check_dns   check_imap    check_pop    check_ssh
check_ftp   check_nagios  check_smtp   check_tcp

插件使用 C、Perl 和 Shell 编程,并且属于 Nagios。它们的源代码可以独立于 Nagios 发行版下载,其中一些插件需要额外安装某些程序和库。

安装、配置和使用

软件要求包括以下内容

  • sudo:允许用户以另一个用户的身份执行命令。如果您计划允许非 root 用户执行 SMART,这将是必要的。

  • awk:一种模式扫描和处理语言。SMART 使用它,并期望在 /bin/awk 中找到它。如果情况并非如此,请编辑 SMART 发行版的 check-service 和 smart 文件,并修改指定 AWK=“/bin/awk” 的行。

  • Nagios 插件:源代码可以独立于 Nagios 发行版下载,其中一些插件需要额外安装某些程序和库。您可以使用 SMART 发行版附带的插件,也可以下载最新的插件。

  • scripts 目录(在 SMART 的 scripts 目录中)中的一些 shell 脚本可能需要一些特定的命令来检查某些服务,例如 dig 用于 dns,wget 用于 Web 服务,nmblookup 用于 nmbd (Samba),ntpq 用于 NTP,ldapsearch 用于 OpenLDAP 等。这些命令的路径在每个脚本的开头的一个变量中定义,因此您可以更改它们的位置,使用任何其他可能更适合您系统的命令,甚至可以根据您的方便重写整个脚本。

使用 sudo,您可以允许另一个用户运行 SMART。如果您不打算创建这样的用户,则可以省略以下步骤 1、2 和 3。

  1. 创建用户 sysman 和组 sysman。

  2. 创建 SMART 目录。最好将其安装在 sysman 的主目录中,并设置适当的所有者和权限

    mkdir /home/sysman
    chown root:sysman /home/sysman
    chmod 750 /home/sysman
    
  3. 编辑 sudo 配置文件 /etc/sudoers,并添加以下行

    ...
    sysman  hostname=(root) NOPASSWD: /home/sysman/check-service
    sysman  hostname=(root) NOPASSWD: /sbin/reboot
    
  4. 下载 SMART 软件。

  5. 解压和解压缩发行版

    tar -zxf smart-X.Y.tar.gz
    
  6. 转到发行版目录并将文件复制到目标目录。如果您选择与 /home/sysman 不同的目标,您将必须编辑 smart 文件并修改指定 dir=“/home/sysman” 的行

    cd smart-X.
    cp check-service /home/sysman/
    cp smart /home/sysman/
    cp host.conf.dist /home/sysman/host.conf
    cp services.conf.dist /home/sysman/services.conf
    cp -r scripts /home/sysman/
    cp -r plugins /home/sysman/
    
  7. 转到目标目录,并检查/设置文件权限和所有者

    cd /home/sysman
    chown -R root:root check-service scripts plugins host.conf services.conf
    chown root:sysman smart
    chmod -R 700 check-service scripts plugins
    chmod 750 smart
    chmod 644 host.conf services.conf
    

配置如下。首先,编辑 SMART 主机配置文件 host.conf,并根据您的偏好(主机名、邮件地址、命令路径等)对其进行修改。然后,编辑 SMART 服务配置文件 services.conf,并取消注释/修改/添加您要检查的任何服务/守护进程。每一行描述一个服务,带有以下分号分隔的参数

  • 名称 (非空字符串):描述性服务名称(例如,IMAP)。

  • process_name[:port] (非空字符串[:整数]):父进程名称及其操作端口(例如,couriertcpd:143)。

  • process_param (字符串):运行进程的参数。某些服务以相同的进程名称运行,因此参数对于区分它们很有用。例如,Courier IMAP 和 POP3 的父进程是 couriertcpd,但一个使用参数 pop3d 执行,另一个使用 imapd 执行。

  • max_procs (非空整数):允许运行的最大进程数(例如,10)。如果您正在监控不运行进程的内容(例如,磁盘空间),则将其保留为 0。

  • min_procs (非空整数):允许运行的最小进程数(例如,1)。如果您正在监控不运行进程的内容(例如,磁盘空间),则将其保留为 0。

  • start_command (字符串):启动服务或在服务关闭时要执行的脚本的命令(例如,/courier/libexec/imapd.rc)。

  • pid_file (字符串):pid 文件路径(例如,/var/run/imapd.pid)。

  • sock_file (字符串):socket 文件路径。

  • start_mode (0/1):可以通过在启动命令中添加 start/stop 来启动/停止服务 (1),或者可能不需要 (0)。

  • check_script (字符串):用于检查服务的脚本的名称。此脚本必须位于 scripts 目录中(例如,imap.nag)。

如果参数不适用,则将其留空,除非名称、process_name、max_procs、min_procs 和 start_mode,它们不能为空。

现在,您应该能够以 root 用户或 sysman 用户身份运行 SMART

/home/sysman/smart

尝试使用 -h 获取有关可用参数的更多信息。通过 crond 运行 SMART 可能是个好主意。您可以根据需要经常运行它,但每五分钟运行一次似乎足够合理。

结论

SMART 是一个易于安装的应用程序(只需复制程序),比 Nagios 更容易配置(添加要监控的新元素只需在配置文件中添加一行),并且 SMART 灵活,允许您监控系统的任何服务或方面,并且非常有效。

我们在拥有数千用户的生产环境中的经验告诉我们,不可避免地我们会达到一些高峰期,在这些高峰期,服务收到的请求量超出系统的能力,并且响应时间急剧增加。系统在自己的管理员之前检测到这种情况,并在五分钟内解决它,这是一个伟大的问题解决者,并为用户提供了更好的服务感知。

在约 15 台服务器上运行 SMART 两年后,我们可以说它的主要贡献是我们的安心。拥有一位同事 24/7 检查一切是否正常工作,并在问题解决后(尤其是在周末)通知您,真是太棒了。

致谢

SMART 是在 Universitat Internacional de Catalunya 的 IT 部门创建、开发、测试和享受的。Vicente Sangrador 和 Jordi Xavier Prat 在这个项目中进行了合作,并鼓励我撰写本文。

本文资源: /article/9268

Albert Martorell 是一名电信工程师,自 1998 年以来一直在 Universitat Internacional de Catalunya 的 IT 部门担任网络和“企鹅”管理员。

加载 Disqus 评论