UNIX 系统管理总是个棘手的问题,运用正确的工具会使这个问题变得容易。在这一部分中,Teodor 提出了关于使用 Perl 来简化和牢固系统管理的想法。在这种环境中,系统配置引擎 cfengine 是个极其重要的工具。
要完成本文中的练习,系统中必须安装了 Perl 5.6.0。操作系统最好是主流 UNIX 安装(Linux、Solaris、BSD)的最近版本(2000 或更新)。在较早版本的 Perl 和 UNIX 连同其他操作系统上也能够使用本文中的示例,但应当将可能的功能故障作为练习来解决。
UNIX 管理具备挑战性的一大原因是每个 UNIX 供给商认为标准是针对低能傻瓜。所以,即使是同一供给商的操作系统(SunOS 4.x 和 Solaris 5.x)也能够是根本不同。在某些情况下,甚至根本没有供给商。例如,Linux 没有单独的供给商(虽然 Red Hat 现在是最大的 Linux 分发版),每一个版本的 Linux 都有其独到之处。假如 POSIX 标准化做得正确,那么他是解决这一问题的正确方向上的一个步骤。遗憾的是,他只能确保系统管理所需功能的一个小的子集。
正如我经常所说:了解您的工具。假如试图仅用一种工具、语言、或方法做每件事情,可能是一场噩梦。要具备灵活性。
假如存在一个系统管理公理,那就是:两次过后,没有系统管理任务是有趣的。假如您发现正在重复做单调而枯燥的事,那么自动化他。当然,有时很难自动化,但应该至少考虑这个问题,并且权衡其优势及自动化所花费的时间。
cfengine 工具
假如您对自动化系统管理是认真的,那么应该了解 cfengine 工具。仅当您宁愿把时间都花在 vi 编辑器时,能够不去了解 cfengine 。
cfengine 是一种系统配置引擎。他获取配置脚本作为输入,然后根据这些脚本来行动。现在版本是 1.6.3(很稳定的发行版),而且版本 2.0 也呼之欲出。有关 cfengine 研发的更多信息,请访问 cfengine 网站(请参阅本文后面的 参考资料)。
不一定要用 cfengine 提供您的任何东西,而且您不可能立即需要任何东西。一开始时,您的 cfengine 配置文档应该很简单,并且随着发现更多东西希望自动化而增长。
来自 cfengine 命令参考大全,这里有其最值得注意的特性:
- 能够监控和修改文档许可权和 ACL。例如,/etc/shadow 能够和 0400/root/sys 许可权保持一致,而且假如那些许可权发生变化,能够警告系统管理员或即刻纠正他们。
- 根据相应 fstab 变化,可自动安装和卸载 NFS 文档。
- 能够通过单一文档来管理子网掩码、DNS 配置、缺省路由和主网络接口;
- 文档和目录能够递归复制至另一位置,要么本地复制,要么从远程服务器复制。
- 能够编辑(这是个 很强大的特性,提供了正则表达式和全局查找/替换)、轮转(譬如,日志文档)或删除文档。
- 能够链接文档(单一的和/或目录下的任何文档或和正则表达式匹配的文档)和整个目录。
- 能够根据进程表中正则表达式的匹配来启动、杀死、重启进程或发送任意信号。
- 能够运行任意命令。
- 上述任何这些根据操作系统类型和修订版本、一天中的时间、任意用户定义的类、文档中文档、目录或数据的有无等等能够是有条件的。
即使用 Perl 能够做 cfengine 所做的任何事情,为什么要从头开始呢?例如,假如想用另一个词替换某个词,编辑文档能够是简单的一行程式。当开始允许系统的子类型、逻辑系统部分连同任何其他杂项因素时,这一行程式会变成 300 行。为什么不在 cfengine 中做呢?他产生 100 行可读的配置代码。
根据我自己的经验,因为能够从最小配置文档开始,然后随着时间流逝逐步地向 cfengine 添加一些东西,所以将 cfengine 介绍给站点是很容易的。没有人喜欢突然的变化,任何系统管理员更是如此(因为假如任何事出错,他们理所当然地会受到责难)。
配置文档管理
管理配置文档是艰苦的。能够通过考虑 cfengine 是否胜任该任务开始。遗憾的是, cfengine 的编辑是面向行的,所以他可能不太适合复杂的配置文档。但对于如 TCP 包装器配置文档 /etc/hosts.allow 那样的简单文档 cfengine 是最适合的。
通常,希望保留配置文档的多个版本。譬如,可能需要在 /etc/resolv.conf 中有两组 DNS 配置配置,一组是用于外部机器,另一组是用于内部机器。很自然,外部 DNS resolv.conf 能够进入称为 "external" 的目录,而内部 resolv.conf 能够进入相应的 "internal" 目录。让我们假定这两个目录都在一个全局 "spec" 目录下,该目录是配置文档的一种根目录。
下列代码会遍历 spec 目录,搜索适合于给定机器的文档名。他将从 /usr/local/spec 开始,然后往下,寻找和请求相匹配的文档。而且,他将检查每个目录的名称是否和属于某些机器的类相同。因此,假如我们请求
文章整理:西部数码--专业提供域名注册、虚拟主机服务locate_global('resolv.conf', 'wonka') ,该函数将在 /usr/local/spec 目录下查找 resolv.conf 文档,该文档要么在根目录下,要么在该根目录的子目录下,他的名称应和 "wonka" 机器所属的类相匹配。所以,假如 "wonka" 属于 "chocolate" 类,并且假如有 /usr/local/spec/chocolate/resolv.conf 文档,那么 locate_global()
http://www.west263.com
以上信息与文章正文是不可分割的一部分,如果您要转载本文章,请保留以上信息,谢谢!




