使用cfengine来实现服务器的自动化配置
目录
一、概述
二、工作环境
三、理论知识
(一)cfengine的程序结构及配置文件
(二)cfengine的工作方式
四、配置过程
(一)下载安装
(二) 准备工作
(三)工作方式二
1.对服务器端进行配置
2.对客户端进行配置
3.设为开机启动
4.排错:
5.新加入一台客户机
(四)工作方式一
1.配置客户机上的cfservd.conf
2.编辑服务器上的cfrun.hosts客户端列表
3.在服务器上运行cfrun
4.注意:
五、小结
之前我写了一篇nagios监控软件的文章,得到大家的关注,能够将自己的知识分享给大家确实十分高兴。这篇文章是我最近使用的一个软件cfengine,如果说nagios主要是监控的监(监视)的话,那么cfengine则着重于控。很遗憾国内相关的文章很少,我就自己尝试写了这篇,希望得到大家的建议。
cfengine是一个功能强大的自动化系统管理工具.引用其官网的说法”cfengine是一种 UNIX 管理工具,其目的是使简单的管理的任务自动化,使困难的任务变得较容易。它的目标是使系统从任何状态收敛到一种理想状态。依照它的作者 Mark Burgess 所说,cfengine 总是使您的系统更接近于您所定义的配置; 它决不会使系统变得更糟。”确实十分的拗口,也难以理解.简单的跟大家说说我的理解,很简单,就是你想你的系统应该是十分样子,你就可以使用cfengine来实现,它可以保证你的系统总是维持你所希望的那个状态.也就是说有黑客进来了修改了某个重要的配置文件的内容或者权限,也会被cfengine自动修复!!还有一种经常遇到的情况,有少则几台多则成千上万台机器,现在需要临时的改变其一个配置,例如删掉某个帐号,停掉某个服务,一般我们只能不厌其烦的登到每一台机器上重复的完成这些动作,但是有了cfengine,一个命令就可以搞定了.是不是很诱人?
cfengine大概的功能有:
检查和配置网络接口
编辑系统和用户的文本文件
维护符号链接
检查和设置文件的权限
删除垃圾文件
检查重要文件和文件系统的存在
控制用户脚本和shell命令的执行
基于类的判定结构
进程管理
为了节省篇幅,我这里就不一一介绍了,大家可以访问它的官方网站,里面的文档十分丰富
而且它还十分的人性化,给出了中文主页
|
主机名 |
操作系统 |
ip地址 |
|
centos1 |
centos 5 |
192.168.0.114 |
|
centos2 |
centos 5 |
192.168.0.115 |
|
centos3 |
centos 5 |
192.168.0.116 |
注:centos5 是redhat enterprise 5的重编译开源版本.功能使用与企业版几乎一样.
Cfengine是一个用于设置和维护计算机系统的工具,包含了以下几个组件:
cfagent 自动配置代理(必须),其配置文件为cfupdate.conf和 cfagent.conf
cfservd 文件服务和远程激活服务(推荐),其配置文件为cfservd.conf
cfexecd 计划和报告服务(建议)
cfenvd 异常检测服务(强烈建议)
cfrun 远程激活cfagent的方法(需要的时候用这个),其配置文件为cfrun.hosts
cfshow 检查有帮助的数据库的内容的方法(辅助)
cfenvgraph 异常检测服务cfenvd的附属工具(辅助)
cfkey 密匙生成工具(每台主机运行一次).
在下一节分析cfengine的工作方式的时候会解释几个关键程序及其配置文件的作用
cfengine有两种工作方式:
服务器激活方式:这是一种集中控制的方式,上图详细给出了整个流程.
1).服务器上运行cfrun,cfrun会根据cfrun.hosts中的主机列表来连接到某个客户机的cfservd程序
2).客户机上cfservd调用本机的cfagent程序
3).客户机上cfagent程序执行update.conf,连接到中央机的cfservd复制下载策略文件cafagent.conf
4).客户机下载成功后执行最新版本的策略文件,不成功就执行旧版本的.
注:update.conf的内容一般为一些非常简单的固定操作:下载策略文件,清理日志,重启服务,基本上这个文件创建好了之后就不会更改了.在下载策略文件的时候如果下载成功,会将原策略文件改名,加上.cfsaved后缀
客户端自主激活方式:相比上一种要简单一些,客户机独立执行cfagent(可以是定期执行,例如加入cron中).在这样的情况下,客户机就不需要有cfservd程序了,整个流程也简化为图中的第3,第4步.
cfengine的文档里面都是采用源码安装的,经本人测试后发现源码安装经常会出现莫名奇妙的错误,而使用rpm包则是省时省力的方式.
安装也很简单,rpm –ivh cfengine-2.2.2-1.el5.rf.i386.rpm即可,接下来我们就要着手配置了
在服务器和客户端将cfengine安装完成后,要做下面一些准备工作:
为了完全使用源码方便控制,将服务都禁用掉.
[root@centos1 inputs]# chkconfig cfservd off
[root@centos1 inputs]# chkconfig cfenvd off
[root@centos1 inputs]# chkconfig cfexecd off
然后查看会看到所有cfengine的相关服务都禁用了
[root@centos1 inputs]# chkconfig --list|grep cf
将cfengine的程序复制到bin目录下
mv /var/cfengine/bin/cfagent /var/cfengine/bin/cfagent.link(将原来的链接文件重命名)
cp /usr/sbin/cfagent /var/cfengine/bin
cp /usr/sbin/cfenvd /var/cfengine/bin
cp /usr/sbin/cfexecd /var/cfengine/bin
cp /usr/sbin/cfservd /var/cfengine/bin
我这里先说工作方式二的原因是它的过程简单,而且很能体现cfengine的本质工作流程.
此时需要的条件是:
服务器运行cfservd (这里当然是需要有cfservd.conf配置文件).然后还有一个正确的策略文件cfagent.conf供客户机下载
客户机使用cfagent运行update.conf的配置,连接到服务器的cfservd进程,下载cfagent.conf来运行.
所以我们接下来要在服务器和客户端上创建所需的配置文件:
服务器上:cfservd.conf cfagent.conf
客户端上:update.conf
我们这里将centos1作为服务器(192.168.0.114,为了简洁,文中会简称为114),centos2作为客户端,文中简称为115
1.对服务器端进行配置
1)创建配置文件cfservd.conf
在/var/cfengine/inputs下创建cfservd.conf
|
# cfservd.conf
# yahoon 2007.11.1
control:
domain = ( yahoon.org )
AllowConnectionsFrom = ( 192.168.0.0/24 )
TrustKeysFrom = ( 192.168.0.0/24 )
AllowUsers = ( root )
MaxConnections = ( 150 )
MultipleConnections = ( true )
#AllowMultipleConnectionsFrom = ( 192.168.0 )
############################################
admit:
#/var/cfengine/rpc_out *.$(domain) 128.39.73
#/file *.$(domain) 128.39.73
/masterfile/inputs 192.168.0.
/var/cfengine 192.168.0. |
然后我们就可以启动cfservd服务,执行
/var/cfengine/bin/cfservd –v
同样带上-v参数来查看详细的输出,利于排错
|
…(部分略)…
Listening for connections ...
cfservd: cfservd starting Fri Nov 2 18:54:49 2007 |
显示是成功的,进一步查看fservd监听的tcp 5308端口
|
[root@centos1 inputs]# netstat -an|grep 5308
tcp 0 0 :::5308 :::* LISTEN |
2)创建策略文件cfagent.conf
这就是我们即将要发布给客户机运行的策略文件,路径同样是在/var/cfengine/inputs下创建,内容如下
|
control:
actionsequence = ( shellcommands )
shellcommands:
"/bin/echo Danger, Will Robison!" |
3)测试
执行cfagent –v (如果不需要真正执行,可以加上-n参数)
|
…(部分略)..
cfengine:centos1:
Executing script /bin/echo Danger, Will Robison!...(timeout=0,uid=-1,gid=-1)
(Setting umask to 77)
cfengine:centos1:/bin/echo Dange: Danger, Will Robison!
cfengine:centos1: Finished script /bin/echo Danger, Will Robison!
Performance(Exec(/bin/echo Danger, Will Robison!)): time=0.0529 secs, av=0.0536 +/- 0.0231
---------------------------------------------------------------------
Alerts
---------------------------------------------------------------------
++++++++++++++++++++++++++++++++++++++++
Summary of objects involved
++++++++++++++++++++++++++++++++++++++++
global
update
main
cfengine:centos1: Outcome of version (not specified): Promises still kept 0%, Promises repaired 100%, Promises not kept 0% |
运行完全正常,那么就可以将其复制到要发布的目录里面/masterfile/inputs
4)DNS解析
cfservd在做文件传输的时候需要对连接上来的客户机做DNS解析,所以必需要有域名,如果是内部网没有dns服务,就利用/etc/hosts,将客户端加入进来.这里我们选用的域名为yahoon.org,
编辑/etc/hosts文件
[root@centos1 inputs]# vi /etc/hosts
|
# Do not remove the following line, or various programs
# that require network functionality will fail.
127.0.0.1 centos1 localhost.localdomain localhost
::1 localhost6.localdomain6 localhost6
192.168.0.115 centos2.yahoon.org |
粗体的部分即为加上的对客户机115的解析,要测试是否成功解析了centos2.yahoon.org十分简单,服务器上ping这个域名就可以了..
|
[root@centos1 inputs]# ping centos2.yahoon.org
PING centos2.yahoon.org (192.168.0.115) 56(84) bytes of data.
64 bytes from centos2.yahoon.org (192.168.0.115): icmp_seq=1 ttl=64 time=3.74 ms
64 bytes from centos2.yahoon.org (192.168.0.115): icmp_seq=2 ttl=64 time=1.61 ms |
2.对客户端进行配置
1)创建配置文件update.conf
在/var/cfengine/inputs下创建 update.conf
|
# update.conf
# yahoon 2007.11.1
control:
actionsequence = ( copy processes tidy )
domain = ( yahoon.org )
#policyhost = ( my_policy_host )
policyhost = ( 192.168.0.114 )
master_cfinput = ( /masterfile/inputs )
workdir = ( /var/cfengine )
copy:
$(master_cfinput) dest=$(workdir)/inputs
r=inf
mode=700
type=binary
server=$(policyhost)
trustkey=true
processes:
# "cfservd" restart /var/cfengine/bin/cfservd
# "cfenvd" restart "/var/cfengine/bin/cfenvd"
"cfservd" signal=term restart /var/cfengine/bin/cfservd
"cfenvd" signal=kill restart "/var/cfengine/bin/cfenvd -H"
tidy:
$(workdir)/outputs pattern=* age=7
# End |
2)测试运行
为了安全我们一般使用cfagent -v –n ,带上了-n参数的意思是只是测试,而不会真的执行.
|
…(部分略)…
Looking for an input file /var/cfengine/inputs/update.conf
Cfengine input file had no explicit version string
Finished with update.conf
---------------------------------------------------------------------
Looking for remote method collaborations
---------------------------------------------------------------------
Finished with RPC
Accepted domain name: yahoon.org
cfagent -n: Running in ``All talk and no action'' mode
LogDirectory = /var/cfengine
Loaded /var/cfengine/ppkeys/localhost.priv
Loaded /var/cfengine/ppkeys/localhost.pub
Checksum database is /var/cfengine/checksum_digests.db
Default binary server seems to be centos2
*********************************************************************
Update Sched: copy pass 1 @ Fri Nov 2 00:58:17 2007
*********************************************************************
Checking copy from 192.168.0.114:/masterfile/inputs to /var/cfengine/inputs
Connect to 192.168.0.114 = 192.168.0.114 on port 5308
Loaded /var/cfengine/ppkeys/root-192.168.0.114.pub
...............................................................
cfengine:centos2: Strong authentication of server=192.168.0.114 connection confirmed
Need this: /var/cfengine/inputs/cfagent.conf wasn't at destination (copying)
Performance(Copy(192.168.0.114:/masterfile/inputs > /var/cfengine/inputs)): time=0.2393 secs, av=0.2927 +/- 0.1537
*********************************************************************
Update Sched: processes pass 1 @ Fri Nov 2 00:58:17 2007
*********************************************************************
cfengine:centos2: Running process command /bin/ps auxw
Defining classes
DoSignals(cfservd)
Existing restart sequence found (/var/cfengine/bin/cfservd)
cfengine:centos2: Executing shell command: /var/cfengine/bin/cfservd
Defining classes
DoSignals(cfenvd)
Existing restart sequence found (/var/cfengine/bin/cfenvd -H)
cfengine:centos2: Executing shell command: /var/cfengine/bin/cfenvd -H
*********************************************************************
Update Sched: tidy pass 1 @ Fri Nov 2 00:58:17 2007
*********************************************************************
…(部分略)… |
说明整个的执行过程是没问题的.粗体部分是连接服务器复制文件的过程.
上面是测试 我们现在不带-n来执行cfagent –v
|
…(部分略)…
Accepted domain name: yahoon.org
LogDirectory = /var/cfengine
Loaded /var/cfengine/ppkeys/localhost.priv
Loaded /var/cfengine/ppkeys/localhost.pub
Checksum database is /var/cfengine/checksum_digests.db
Default binary server seems to be centos2
*********************************************************************
Update Sched: copy pass 1 @ Fri Nov 2 01:03:31 2007
*********************************************************************
Checking copy from 192.168.0.114:/masterfile/inputs to /var/cfengine/inputs
Connect to 192.168.0.114 = 192.168.0.114 on port 5308
Loaded /var/cfengine/ppkeys/root-192.168.0.114.pub
...............................................................
cfengine:centos2: Strong authentication of server=192.168.0.114 connection confirmed
Performance(Copy(192.168.0.114:/masterfile/inputs > /var/cfengine/inputs)): time=0.2774 secs, av=0.2847 +/- 0.1080
Saving the setuid log in /var/cfengine/cfagent.centos2.log
…(部分略)…
*********************************************************************
Main Tree Sched: shellcommands pass 1 @ Fri Nov 2 01:03:33 2007
*********************************************************************
cfengine:centos2:
Executing script /bin/echo Danger,Will Robison!...(timeout=0,uid=-1,gid=-1)
(Setting umask to 77)
cfengine:centos2:/bin/echo Dange: Danger,Will Robison!
cfengine:centos2: Finished script /bin/echo Danger, Will Robison!
Performance(Exec(/bin/echo Danger,Will Robison!)): time=0.0434 secs, av=0.0472 +/- 0.0217
--------------------------------------------------------------------- |