巧用cfengine管理linux服务器(转)

cfengine(配置引擎)是一种 UNIX 管理工具,其目的是使简单的管理的任务自动化,使困难的任务变得较容易。Cfengine
适用于管理各种环境,从一台主机到上万台主机的机群均可使用。到2.2 版本为止,我们现在所知的用于一般性管理的最大安装机群约为20,000 台。
  图-1 是Cfengine 的组成部分的关系图 。
   

 图-1 Cfengine 的组成部分的关系图
   
  基本安装
 在任何一种情况下,你都需要两个库:BerkeleyDB,用于内部数据库的使用;和OpenSSL,用于加密方法。这些库都是开放资源,并且如
同cfengine一样可以免费使用。没有这些库,你将无法使用cfengine,你也不能用其他的库来替代这两个库。本文使用的RHEL
5.0已经包括这些库。
 #wget
linux
/dag/redhat/el5/en/i386/dag/RPMS/cfengine-2.2.2-1.el5.rf.i386.rpm">ftp://fr.rpmfind.net/
linux
/dag/redhat/el5/en/i386/dag/RPMS/cfengine-2.2.2-1.el5.rf.i386.rpm
 #rpm -ivh cfengine-2.2.2-1.el5.rf.i386.rpm
 接下来的一步是建立cfengine工作目录树的基本结构:
 手动建立Cfengine的工作目录
 # mkdir /var/cfengine
 # mkdir /var/cfengine/bin
 # mkdir /var/cfengine/inputs
 接下来,在工作目录bin的子目录下(例如:/var/cfengine/bin)建立cfengine可执行程序的本地副本。实际运行过程中,是这些副本被执行,因此当网络在执行任务期间断掉,也不会对系统产生风险。
 步骤3 复制Cfengine二进制代码到工作目录
 # cp /usr/local/sbin/cfagent /var/cfengine/bin
 # cp /usr/local/sbin/cfexecd /var/cfengine/bin
 # cp /usr/local/sbin/cfservd /var/cfengine/bin
 # chown -R root:0 /var/cfengine
 # chmod -R 755 /var/cfengine
  3运行所需的进程
 在最简单的安装中,可以通过在每台主机上手动运行cfagent来使用cfengine。但是,如果运行一个或多个守护进程,则会获益良多。
 (1)cfexecd守护进程
 尽管在理论上可以按需随时运行cfagent,但最好定期自动运行cfagent。这是使用cfexecd
 的时间;cfexecd以守护进程的方式运行并按定义、预定义的计划执行cfagent。通过将时间类添加到cfagent.conf的
control块的schedule设置中对此计划进行修改。默认设置是Min00_05,这意味着cfagent将在每个小时的前5分钟运行。要每小时
运行两次,例如,可以将下面的代码放入cfagent.conf的control段中:
 schedule=(Min00_05Min30_35)
 cfexecd守护进程没有自己的配置文件,但它不在cfagent.conf之外使用此设置。
 还可以使用系统的cron守护进程定期运行cfexecd。下列条目可以添加到系统crontab(通常
 为/etc/crontab)中以便每小时执行(和报告)cfagent:
 0 * * * * root /usr/local/sbin/cfexecd -F
 -F选项告诉cfexecd不要进入守护进程模式,因为它正由cron运行。
 为获得可靠性,请以守护进程的方式运行cfexecd,还可以从cron运行(可能是每天一次)。
 然后,可以在cfagent.conf中检查crontab条目并检查cfexecd守护进程是否正在运行。如果将下面的代码放入cfagent.conf中,请执行这些检查并更正任何问题:
 editfiles:
 { /etc/crontab
 AppendIfNoSuchLine "0 * ** * root /var/cfengine/bin/cfexecd -F"
 }
 processes:
 "cfexecd" restart "/var/cfengine/bin/cfexecd"
 通过此技术,如果一种方法工作不正常,那么另一方法最后会修复它的问题。
 (2)cfservd守护进程
 cfservd守护进程在所有系统中并非是必需的。它需要运行cfengine文件
服务器
,对我们而言,它只是中心配置
服务器
。它还允许从其他系统远程执行cfagent。如果需要此功能,则需要在每个系统中运行cfservd。在任一情况下,都应始终进行检查,以确保它与cfagent.conf中的下列命令一起运行:
 processes:
 "cfservd" restart "/var/cfengine/bin/cfservd"
 3 查看类标识系统
 类是cfengine的核心。每个系统都属于一个或多个类。或者,如果换一种视角思考,许多类都是在每次cfagent运行时基于各种不同种类信
息进行创建。配置文件中的每个操作都仅限于特定的类。因此,任何给定的操作都可以只在一个主机上或运行特定操作系统的多个主机上执行,也可以在每个主机上
执行。要在任意给定的系统中确定定义哪些标准类,请运行下面的命令:
 #cfagent -p -v 如图-2 。


  
  图 2查看类标识系统
 如您所见,我的系统存在相当数量的预定义类。它们可以划分为如下类别:
 操作系统:linux_i686_2_6_18_8_el5xen
 体系结构:linux_i686_2_6_18_8_el5xen__1_SMP
 主机名:kaybee_orgkaybeeorg
 IP地址:10_1_110_1_1_1ipv4_10ipv4_10_1ipv4_10_1_1ipv4_10_1_1_1
 日期/时间:May Min15_20 Min19 Q2 Tuesday Yr2008
 可以以此使用ps -ef|grep cf 命令和netstat -anlp|grep cfservd  查看进程运行情况的服务占用的端口情况如图 3、4


  
  图 3使用ps -ef|grep cf 命令查看服务进程


  
  使用netstat -anlp|grep cfservd命令查看服务占用的端口
  在前面,向大家介绍了在linux服务器如何安装cfengine(配置引擎),下面笔者开始配置cfengine管理Linux服务器。
 一、创建基本的配置文件
 这些配置文件需要放置在配置服务器上的主配置目录中。这些文件都是公共文件并以最初形式在网络中的每台服务器上使用。
 (1) cfservd.conf示例
 下面是cfservd守护进程的配置文件。它允许客户机传送主配置文件集合,还允许通过cfrun
 远程执行cfagent。显然,只有一个系统允许访问中心配置文件(服务器),但是,允许cfservd访问这些文件不会损害其他系统上的任何文
件(因为它们不复制这些文件)。但是,所有系统都可以从远程执行cfagent中获益,因为它允许从远程系统中按需执行cfagent。因此,可以在所有
系统中使用下列cfservd.conf,这正是我们所需要的功能:
 control:
 domain = ( mydomain.com )
 AllowUsers = ( root )
 cfrunCommand = ( "/var/cfagent/bin/cfagent" )
 admit:
 /usr/local/var/cfengine/inputs *.mydomain.com
 /var/cfagent/bin/cfagent *.mydomain.com
 Cfrun Command设置指定在接收到来自cfrun的连接时,要执行的cfagent二进制文件的位
 置。admit段非常重要,因为它指定哪个主机访问哪个文件。您必须授予对中心配置目录和cfagent二进制文件的访问权。您还需要对客户机需要从此服务器传送的任何其他文件授予访问权。
 (2)基本update.conf
 update.conf文件必须尽可能地简单并应进行较少的更改。此文件在cfagent.conf之前由
 cfagent分析和执行。如果cfagent.conf文件已受损,则在下次客户机执行cfagent时,它们会获得新版本,因为其
update.conf文件仍然有效。损坏的update.conf文件会带来麻烦,因此建议在将文件放入中心配置目录时,对任何更改都要进行彻底的测
试。另外,此文件在每台主机(包括服务器)上运行。cfagent命令很巧妙,在配置服务器上运行时在本地复制文件(而非通过网络)。control段定
义一些变量,然后在copy段使用。可以通过$(var)或${var}序列来完成变量替代。
 1  control:
 2   actionsequence = ( copy tidy )
 3   domain         = ( mydomain.com )
 4   workdir        = ( /var/cfengine )
 5   policyhost     = ( server.mydomain.com )
 6   master_cfinput = ( /usr/local/var/cfengine/inputs )
 7   cf_install_dir = ( /usr/local/sbin )
 8
 9  copy:
 10       $(cf_install_dir)/cfagent    dest=$(workdir)/bin/cfagent
 11                                                mode=755
 12                                                       type=checksum
 13
 14       $(cf_install_dir)/cfservd    dest=$(workdir)/bin/cfservd
 15                                    mode=755
 16                                    type=checksum
 17
 18       $(cf_install_dir)/cfexecd    dest=$(workdir)/bin/cfexecd
 19                                    mode=755
 20                                    type=checksum
 21
 22       $(master_cfinput)            dest=$(workdir)/inputs
 23                                    r=inf
 24                                    mode=644
 25                                    type=binary
 26                                    exclude=*.lst
 27                                    exclude=*~
 28                                    exclude=#*
 29                                    server=$(policyhost)
 30  tidy:
 31       $(workdir)/outputs pattern=* age=7
 注意行号是笔者添加的便于解释参数:
 第5行:字符串server.mydomain.com应替换为配置你自己服务器的主机名。
 第6行:包含主配置文件的主配置服务器目录。
 第7行:每个服务器保存cfengine二进制文件的位置。
 第11行:指定了源目录应递归复制到目标目录,递归深度无限制。
 第13行:此选项最初会令人误解。它指定任何本地文件应与主副本进行字节比较,以确定
 是否需要更新。
 第17行:此选项指出从指定的服务器中检索文件。
 第31行:位于tidy段的此命令删除outputs/目录中在最后7天尚未访问的所有文件。
 每个文件的权限(模式)在每次运行时都要进行检查,即使文件已经存在也是如此。
 (3)cfagent.conf的框架
 这是cfengine配置的实质。对系统执行的任何更改都有希望通过此文件来完成。这里的示例cfagent.conf非常简单,只用于测试。如
果从cfengine调用脚本并且这些脚本生成任何输出,则输出结果将显示出来(交互式执行时),被记录或通过电子邮件发送(从cfexecd执行时)。
因为通常情况下每个小时执行cfagent,所以如果出现问题或有些内容被更改且需要向管理员发送通知,则任何脚本都应产生输出。
 1. control:
 2. actionsequence = ( files directories tidy disable processes )
 3. domain = ( mydomain.com )
 4. timezone = ( CST )
 5. access = ( root )
 6. #Wherecfexecdsendsreports
 7. smtpserve r= ( mail.mydomain.com )
 8. sysadm = (
root@mydomain.com
)
 9. files:
 10. /etc/passwd mode=644 owner=root action=fixall
 11. /etc/shadow mode=600 owner=root action=fixall
 12. /etc/group mode=644 owner=root action=fixall
 13. directories:
 14. /tmpmode=1777 owner= root group=root
 15. tidy:
 16. /tmp recurse=inf age=7 rmdirs=sub
 17. disable:
 18. /root/.rhosts
 19. /etc/hosts.equiv
 20. processes:
 21. "cfservd" restart "/var/cfengine/bin/cfservd"
 22. "cfexecd" restart "/var/cfengine/bin/cfexecd"
 第2行:actionsequence命令非常重要,但容易忽略。必须在此变量中列出要处理的每个代码段。如果编写了一个新的代码段,但忘记将其添加到此列表中,则命令不会执行。
 第4行:cfengine将确保系统使用此列表中的一个时区进行配置。
 第10行:此代码段检查一些重要文件的所有权和权限并更正它发现的任何问题。
 第14行:此代码段检查/tmp/目录中的权限并在需要时更正这些权限。如果需要,它还创
 建目录。
 第16行:此代码段从/tmp/目录中删除过去7天中尚未访问的所有文件。还删除/tmp/的子
 目录而非此目录本身。
 第17行:出于
安全
原因,禁用这些文件。如果发现这些文件,则这些文件被重命名。如果
 这些文件是可执行文件,则可执行的位被取消设置。
 第20行:本段验证cfservd和cfexecd守护进程是否正在运行,如果没有运行,则启动它们。
  二、创建配置服务器
 配置服务器包含cfengine配置文件的主副本。它还像所有客户机系统一样,定期处理此配置文件。服务器必须运行经过正确配置的
cfservd,以便客户机系统可以从系统中检索主配置文件。配置服务器需要特殊位置来保存cfengine主配置文件。在本例中,此位置是/usr
/local/var/cfengine/inputs/。此位置可以是除/var/cfengine/inputs/之外的任何目录,因为重要主机在执
行时与其他主机一样,将文件复制到此目录中。
 与所有系统相似,此服务器也应作为守护进程或从cron(最好是两者)运行cfexecd。
 下面生成服务器密钥,需要在服务器系统上运行cfkey来创建公钥和私钥文件。这些文件位于/var/cfengine/ppkeys/目录中并
将被命名为localhost.priv和localhost.pub。然后需要将localhost.pub复制到同一目录中的新文件中。此文件应称为
root-10.1.1.1.pub,假定您的IP地址为10.1.1.1。只需让cfrun命令连接到本身即可,但无论如何执行此操作会很有用。
 根据下节描述的客户机的IP地址,服务器还需要在适当文件中保存的每个客户机的公钥。
 三、准备客户机系统
 客户机系统的配置相对简单。一旦安装了实际的cfengine二进制文件,则需要生成和复制适当的公钥(如本节所述)。还需要从主服务器手动复制
update.conf文件,并放在/var/cfengine/inputs/中。在正确的位置保存此文件后,则应手动运行cfagent以
下载

余的配置文件并完成系统配置。每个客户机都应以守护进程的方式或从cron运行cfexecd。可能要在每个客户机上运行cfservd并允许使用
cfrun远程执行cfagent。假定已经在服务器上的cfagent.conf文件中完成了配置,则这些守护进程将在第一次手动执行cfagent时
启动。
 下面生成客户机密钥,需要在每个客户机系统上运行cfkey。此操作将在/var/cfengine/ppkeys/中创建
localhost.priv和localhost.pub。然后,需要将中心服务器的公钥复制到客户机。如果服务器的IP地址是10.1.1.1,则应
将其公钥复制到客户机上/var/cfengine/ppkeys/目录中的root-10.1.1.1.pub。最后,需要将客户机的公钥
(localhost.pub)复制到服务器的/var/cfengine/ppkeys/目录中。此外,此文件应按照客户机的IP地址进行命名(如果其
IP地址是10.2.2.2,则此文件应在服务器上被命名为root-10.2.2.2.pub)。这可以手动完成,也可以在初始系统配置脚本中自动完
成。
   四、使用cfrun
 cfrun命令允许在网络上任何数量的系统中执行cfagent。它需要在当前目录中包含名为
 cfrun.hosts的配置文件(或通过-f选项指定的文件)。文件的内容应如下所示:
 domain=mydomain.com
 server.mydomain.com
 client1.mydomain.com
 client2.mydomain.com
 除域设置外,此文件仅是包含每台主机(包括服务器)的一个列表。通过将下列选项添加到
 文件顶部,还可以将输出记录到一系列文件中(而非显示在屏幕上):
 outputdir=/tmp/cfrun_output
 maxchild=10106
 上述代码告诉cfrun生成10个进程,并将每台主机的输出保存在指定目录的不同文件中。
 通常运行cfrun可以不带参数。如果确实要指定参数,格式如下所示:
 cfrunCFRUN_OPTIONSHOSTS--CFAGENT_OPTIONS-CLASSES
 CFRUN_OPTIONS是可选的。可为cfrun命令包含任何数量的选项。接着,可以指定主机
 名的可选列表。如果已指定了某些主机,则只联系这些主机。如果未指定任何主机,则联系
 cfrun.hosts文件中的每个主机。
 第一个--之后是在每个远程系统上运行的要传送给实际cfagent命令的任何选项。第二个--
 之后是类的可选列表。如果指定了某些类,那么只有与其中某个类匹配的主机将实际执行
 cfagent(尽管已联系了每个主机,因为每个主机必须决定它是否匹配其中一个类)。
 五、 应用实例:使用cfengine备份数据
 如果您已经阅读本文之前的大部分内容,就会知道cfengine非常棒。一旦安装并运行了cfengine,它就可以为您做任何事,包括备份数据。
 1、使用cfengine执行本地备份
 首先,可以使用cfengine完成文件和目录的复制。cfengine可以执行完美的复制--包括
 特殊文件、符号链接以及目录的复制。它还可以保留文件的宿主和权限。下面是一个基本的配置,可以将其放入cfagent.conf文件中(如果已经有了一个copy段,可以在现有的copy段后面直接添加内容):
 copy:
 /etc dest=/usr/local/backup/etc purge=true r=inf
 这样可以让网络中的每台主机都递归地将/etc/目录精确地复制到/usr/local/backup/目录中。purge=true选项可以让复制操作删除那些源目录中没有而目标目录中存在的文件。
 每次执行cfagent时都会执行这个复制过程,通常来说这过于频繁了。可以限制每天只执行一次这种操作:
 copy:
 Hr06.OnTheHour::
 /etc dest=/usr/local/backup/etc purge=true r=inf
 现在只有在每天06:00运行cfagent时才会执行复制操作。此处假设您在整点时运行cfagent,而且每小时运行一次。如果不这样做,就
应该适当调节示例中的时间设置。此例的问题是每天的备份都会覆盖前一天的备份。因此,您用来判断系统/etc/目录中可能出现的问题的时间只有不到24个
小时。不必担心,我可以增强备份系统的功能,让它保留一周中有价值的备份。
 control:
 day_of_week = ( ExecResult(/bin/date+%a) )
 copy:
 Hr06.OnTheHour::
 /etc dest=/usr/local/backup/${day_of_week}/etc
 purge=truer=inf
 现在您可以把有价值的备份数据保留7天,这些备份位于/usr/local/backup/Mon/etc、
 /usr/local/backup/Tue/etc等目录中。
 2、 在备份时排除文件
 如果想在备份时包括或者排除一些文件,可以在copy段中使用3个可选参数。第一个是
 ignore参数。可以指定任意多个这种参数,每个参数都提供了一种模式,任何匹配的文件和目录都将被忽略。这是防止对特定目录执行递归操作的惟一方法。
 第二个参数是include。可以使用这个参数来指定在复制时应该包括的所有文件列表。可以
 指定任意多个include参数,但是即使只有一个include参数,也会导致不匹配的文件在默认情况下被排除在复制操作之外。
 最后一个参数是exclude选项。任何匹配这种模式的文件都会被排除在复制操作之外。下
 面是一个例子:
 copy:
 Hr06.OnTheHour::
 /home dest=/usr/local/backup/home purge=true r=inf
 ignore=cache #Netscapecachedirectory
 ignore=Cache #Mozillacachedirectory
 exclude=*.tmp
 上面的例子表示tmp文件会被排除在备份文件之外。
 总结:cfengine 是一种独特的系统管理工具。即使您没有决定使用它,但其概念和执行将对您的工作产生帮助。如果您决定使用它,您将发现 cfengine 无限的灵活性和惊人的用处。
               
               
               
               
               

本文来自ChinaUnix博客,如果查看原文请点: http://blog.chinaunix.net/u/12479/showart_1151050.html

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值