考虑一个运行 SMTP 服务器的简单 FreeBSD 机器 - 我如何自动验证它是否在做正确的事情(例如,接受某些收件人的传入 SMTP 连接,并将邮件放在某个 Maildir 中)?
我们已经使用服务器监控软件(在本例中为 Nagios),当然我们也进行手动测试,但我想知道:是否有一些常用的方法可以对服务器服务运行自动功能测试?
我正在考虑的一个例子:在重新配置我们的服务器时(通常出于测试目的在虚拟机内进行),我正在考虑
- 将一些手动创建的 SMTP 会话导入到 netcat 中,netcat 会连接到我们服务器的 SMTP 端口,然后
- 在服务器上运行某种“验证”脚本,确保预期的断言成立(例如:服务器上出现具有预期内容的新文件、创建了日志条目等)。
我认为能够为其他服务执行一系列这样的测试(例如,测试是否可以创建备份、测试 IMAP 服务器是否接受某些用户的连接以及是否列出正确的邮件)可能对测试配置更改或验证恢复的系统备份是否按预期工作很有用。
答案1
你可以使用预计与服务交互,例如
#!/usr/bin/expect -f
set timeout 1
spawn telnet localhost 25
expect "220 *"
send -- "helo localhost\n"
expect -- "250*Hello\ localhost*"
send -- "mail from: root@localhost\n"
expect -- "250\ OK"
send -- "rcpt to: root@localhost\n"
expect -- "250\ Accepted"
send -- "data\n"
expect -- "354*"
send -- "functional test\n.\n"
expect -- "250\ OK*"
send -- "quit\n"
expect "221*closing\ connection"
像这样调用上面的方法
/path/to/expect.script | grep -q "250 OK"
if [ $? = 0 ]
then
echo "Message queued successfully"
else
echo "Message Failed to queue"
然后,您可以继续查看邮件是否已正确传递到邮件池或 Maildir 或任何其他位置。您可以将 localhost 更改为您选择的远程主机,尽管这会使传递检查变得复杂,但您始终可以使用 expect 登录 - 它是一个非常强大的工具。
答案2
答案3
我使用 NAGIOS。
如果我有兴趣测试单个功能(该功能构成了提供某些业务服务的链中的一步),我会对其进行测试:为了测试 SMTP 服务器,我将使用连接到端口 25 并查找合适横幅的 SMTP 插件;IMAP 服务器也是如此;等等。
如果我有兴趣测试端到端序列,即整个链的成功或失败,我会检查它是否成功完成。为了测试您描述的链,我可能会有一个 cron 作业,每 30 分钟向某个地址发送包含特定测试字符串的邮件,并且我会有一个 NAGIOS 插件,它会在收件人邮箱中查找此字符串,并检查它是否定期更新。
通常,我会同时进行这两项测试,因此如果端到端测试进入 ALERT 状态,我希望看到一个或多个中间步骤也进入了警报状态 - 可能是 SMTP 接收器已关闭,或者两者之间的网络链接已发生故障,或者接收器上的磁盘已满 - 这将为我调查端到端故障提供第一条线索。通常,我会将各个步骤测试和端到端测试分组到一个服务组中,以便快速轻松地查看发生故障的组件。
但我相信单个 NAGIOS 插件应该始终小巧轻便。请注意上面的端到端测试仅有的链的最终成功或失败;它对测试链的步骤没有任何作用。单个插件的复杂性越高,它越有可能以意想不到的方式失败,我就越有可能从我的监控系统获得误报(或更糟的是,漏报)。