如何成为一个优秀的(且懒惰的)系统管理员

作者:Mike Diehl

如果您和大多数系统管理员一样,那么您一定面临着人手不足、资金短缺和工作过多的问题。到现在,您也应该习惯了这种想法,那就是在邮件服务器宕机之前,没有人知道您的存在,然后您突然就成了“美国头号通缉犯”。在本文中,我还假设您负责管理许多服务器。我还假设您并不真的想像现在这样努力工作;如果您真的想这样,您应该成为一名 Windows 服务器管理员,然后开始担心来自微软的频繁补丁、安全漏洞、病毒防护、笨拙的用户界面以及缺乏原生脚本能力。我并不是说 Linux 是完美的,但是 Linux 的很多方面确实让管理变得更容易。

作为一个优秀的系统管理员,您希望把工作做好,但作为一个懒惰的系统管理员,您又不想为了完成工作而过于努力。在本文中,我将分享一些您可以做的简单事情,让您的工作更轻松。

多年来,我形成了这样一个口头禅:“如果我必须做某件事不止一次,我就编写一个脚本来做这件事。” 例如,如果我需要每天早上检查我的服务器的健康状况,我会编写一个 bash 脚本来收集信息,为我格式化信息,并将报告邮件发送给我。如果我需要在 12 台不同的机器上进行配置更改,我会编写一个脚本来完成它。现在乍一看,您可能会认为手动完成工作与编写和调试脚本来完成工作一样容易。但是,我的...嗯...工作方法有一些隐藏的优势。一旦脚本可以工作,任务就是可重复的,并且可以委派给较低级别的技术人员,或者自动化。基本上,您不必完成所有工作;只需要完成所有工作即可。我们将在稍后详细讨论脚本编写。

为了方便脚本化任务和管理多台服务器,我要做的第一件事是在我的每台服务器上配置基于证书的身份验证。为每台服务器执行此操作只需几分钟,但它可以真正让您的生活更轻松。由于您不再需要输入密码,因此文件传输、备份和维护任务都可以脚本化。由于互联网上有大量关于如何配置基于证书的身份验证的简单说明,因此我不会在此浪费时间描述该过程。

一旦我们花时间让身份验证工作起来,让我们开始让我们的生活更轻松。我喜欢做的是创建一个 shell 脚本来导出有用的变量,例如

# servers.sh
export MAILSERVERS="server1 server2 server3"
export WEBSERVERS="www1 www2 www3 www4"

然后我可以编写一个像这样的简单脚本

#!/bin/bash
### Assess disk space on mail servers
source ./servers.sh
for i in ${MAILSERVERS} ; do
       echo =========${i} =============
       ssh root@${i} "df"
       echo ============ =============
done

这个简单的脚本允许我快速评估我的所有邮件服务器上的磁盘利用率。它也可以作为其他此类任务的方便模板。当我想编写另一个任务的脚本时,我复制这个脚本,替换顶部的注释以描述新脚本的目的,并替换 for 循环的主体。

需要注意的是,我所有的脚本都将 source servers.sh 文件,以便我有一个集中的配置点。当我添加或删除服务器时,我只需更改此文件。

另外,请注意文件顶部的注释。一旦您在一个目录中获得大约 50 个不同的脚本,就很难记住哪个脚本是做什么的,除非您开始像 assess_the_disk_space_on_mail_servers.sh 这样命名它们,我拒绝这样做。因此,当我想弄清楚哪个脚本是做什么的时,我输入

grep “###” *

这给了我一个脚本的漂亮列表以及它们所做的事情的简要描述。

关于脚本编写的口头禅的推论是,如果我必须每天、每周或每月执行给定的任务,我会将该作业放在 cron 中并将结果发送到电子邮件。许多系统都带有目录,其中包含 cron 每小时、每天和每周运行的脚本。我认为这是一种非常好的做事方式,但有时您必须能够准确确定给定脚本的运行时间。为此,您必须自己修改 crontab。例如,我不希望我的备份只是在 /etc/cron.daily 决定运行时才运行;我希望它们在正常工作时间之外开始和结束。由于我有比 crontab 的格式更重要的事情要记住,而且我懒得每次都查找它,所以我通常在我的 crontabs 中插入以下行

# min   hour    dom     month   dow     command

然后,每次我修改我的 crontab 时,我可以快速添加我想要的字段并继续前进。我知道这并不是什么惊天动地的事情,但这只是您可以做到的节省时间和精力的简单事情之一。

日志记录(以 syslog 的形式)是 Linux 自带的一项功能,但因为它倾向于产生如此庞大的数据量,所以很少被充分利用。通常,人们只是配置 logrotate 来截断日志,以防止它们填满文件系统。只有当出现问题时,这些人才会回头查看他们的日志想要告诉他们什么。对于 syslog,我还将添加 Web 日志、防火墙日志、邮件日志以及给定服务器上的守护程序产生的任何其他日志。我永远不会提倡逐行阅读所有这些日志。相反,您应该实施某种日志分析程序,即使它只是一系列管道连接的 grep。您需要定期、逐步更改您的规则集,以便尽可能多地过滤掉噪音。无论您怎么做,报告都应该定期通过电子邮件发送给您,并且您需要至少及时浏览它们。

当然,在我看来,在许多服务器上配置日志分析似乎是一项大量的工作。您可以考虑配置您的所有服务器将其日志发送到单个工作站。然后您只需要配置一个分析程序实例,而不是尝试在每台服务器上复制相同的配置。您甚至可以使用上面概述的技术从您的服务器中提取日志文件,以便可以在本地进行分析。

多年来,我从查看我的日志中获得了一些非常令人兴奋的好处。有一次,smartd 通知我,我的一个 IDE 硬盘驱动器即将发生故障,在它实际发生故障之前。我能够计划一次停机并更换驱动器,赶在它发生故障以及我丢失数据之前。有几次,我注意到我的 Web 服务器上出现了身份验证失败,实际上打电话给客户到他的办公桌并解决了问题。我曾经发现一个损坏的数据库索引,因为我碰巧正在查看我的 Apache 日志文件,并注意到服务器花费了过多的时间来提供应用程序。在打电话给客户到他的办公桌告诉他我注意到了这个问题后,我开始着手解决这个问题……在任何人甚至报告它之前。等到其他人报告问题时,我已经诊断出问题并有了预计修复时间,这样当客户打电话来时,我甚至懒得打开服务工单。我只是告诉他们半小时内就会修复。

我也是服务器和服务监控的忠实粉丝。我过去常常每天开始时检查以确保我的所有服务器都健康且运行良好。现在我只需调出监控控制台并寻找非绿色的指示灯,而且我通常在我的客户意识到问题之前就意识到了。让我们面对现实吧,一旦您的经理意识到邮件服务器宕机了,他就会去找您;他最好在服务器机房找到您,正在处理邮件服务器。

服务监控真的没有那么难设置,而且它是比您的客户更早知道问题的好方法。但是您不能只是设置它并假设它有效。我曾经在一个职位上,公司告诉所有部门,我们都必须使用新的公司监控功能。当然,这对我是个好消息,因为我不再需要为我的服务器提供监控功能。作为一个优秀的且懒惰的系统管理员,我很快就转而使用公司监控……并举行了一次消防演习。我走到我的一台服务器旁,将其关闭,然后启动计时器。我的寻呼机在 30 分钟后响了,这在我所处的环境中是不可接受的。在与他们的经理进行了简短的交谈后,监控部门对他们的程序进行了一些更改,每个人都很高兴。您应该始终测试您实施的任何监控系统。

拥有可靠的监控系统的另一个好处是,您可以收集可用性和性能指标。可以将这些报告提交给管理层,以证明购买设备的合理性,或反驳客户对可用性的投诉。在管理层会议上拥有确凿的数字是无与伦比的。

您还应该尝试预测任何可能导致中断的事件,并尝试配置您的监控来检测该事件。根据经验,您应该更频繁地监控快速发生的事件。例如,由于我的服务器可能会很快被拔掉插头,所以我非常频繁地 ping 它们。另一方面,它们的硬盘驱动器不太可能在接下来的 15 分钟内被填满,所以我监控驱动器利用率的频率较低。我通常将警报阈值设置得相当低。例如,如果我的一个磁盘通常已满 30%,我可能会将我的警报阈值设置为 45%。当驱动器使用率超过此点时,我知道有些事情不对劲,但我们还没有到有故障危险的地步。我甚至可以暂时忽略它,同时制定计划来修复它。

我在这里描述的所有内容都不困难,也没有任何内容需要真正的工程工作。您将不得不对您的监控系统进行一些思考,但即使您所做的只是 ping 您的服务器并测试应用程序、Web、邮件等是否正在响应,您也将在短时间内获得显着的优势。而且所有这些都不必一次完成。每次您登录服务器时,只需花几分钟时间,这里做一些简单的事情,那里做一些简单的事情。最终,您每天将有几分钟时间喘口气。

加载 Disqus 评论