考虑一台运行 SMTP 服务器的简单 FreeBSD 机器——我如何自动验证它是否在做正确的事情(例如,接受某些收件人的传入 SMTP 连接,并将邮件放入某个 Maildir)?
我们已经使用了服务器监控软件(在这个 cas 中,Nagios),当然我们会进行手动测试,但我想知道:是否有一些通用的方法可以对服务器服务运行自动功能测试?
我在想什么的一个例子:当重新配置我们的服务器时(通常发生在 VM 内部用于测试目的),我正在考虑
- 将一些手动制作的 SMTP 会话通过管道传输到 netcat,它连接到我们服务器的 SMTP 端口,然后
- 在服务器上运行某种“验证”脚本,确保预期的断言成立(例如:具有预期内容的新文件出现在服务器上,创建日志条目等)。
我想象能够为其他服务执行一系列此类测试(例如,测试是否可以创建备份、测试 IMAP 服务器是否接受某些用户的连接并列出正确的邮件)可能对测试配置更改很有用,或者用于验证还原的系统备份是否按预期工作。
这种测试或多或少可以很容易地编写为 Nagios 测试(容易程度取决于所讨论的服务)。请记住,Nagios 测试是一件简单的事情,至少是 Nagios 的接口,它只是一个返回定义明确的答案(返回代码和一些信息文本)的程序或 shell 脚本。
此外,已经有许多模块可用于各种服务,请查看Nagios exchange。您的邮件示例的解决方案是this。
您可以使用expect与服务进行交互,例如
像这样调用上面的
然后您可以继续查看邮件是否已正确传送到 mailspool 或 Maildir 或其他任何地方。您可以为您选择的远程主机更改 localhost,虽然这会使交付检查复杂化,但您始终可以使用 expect 登录 - 这是一个非常强大的工具。
我使用 NAGIOS。
如果我有兴趣测试一个单独的功能,它形成了提供某些业务服务的链中的一个步骤,我会测试:要测试 SMTP 服务器,我将使用连接到端口 25 的 SMTP 插件并寻找一个合适的横幅;同上 IMAP 服务器;等等。
如果我对测试端到端序列、整个链的成功或失败感兴趣,我将检查它是否成功完成。要像您描述的那样测试链,我很可能有一个 cron 作业,每 30 分钟将包含特定测试字符串的邮件发送到特定地址,并且我将有一个 NAGIOS 插件在收件人邮箱中查找该字符串,并且检查它是否定期更新。
通常,我会两者都做,所以如果端到端测试进入警报状态,我希望看到一个或多个中间步骤也进入警报状态——可能是 SMTP 接收器已关闭,或者网络两者之间的链接失败,或者接收器上的光盘已满 - 这将为我提供调查端到端故障的第一条线索。通常,我会将单独的步骤测试和端到端测试组合到一个服务组中,以便快速轻松地查看失败的组件。
但我相信单个 NAGIOS 插件应该总是小而轻的。所以请注意上面的端到端测试如何只测试链的最终成功或失败;它对测试链的步骤没有任何作用。单个插件越复杂,就越有可能以意想不到的方式失败,然后我就越有可能从我的监控系统中得到误报(或更糟的是,漏报)。