cfengine自动化管理的相关配置| 飘零的代码piao2010 's blog

最近一段时间收集整理了cfengine相关应用和配置,感觉国内关于这方面的资料并不多,经测试可以成功运行,因此分享出来。

一、概述

cfengine是一个功能强大的自动化系统管理工具.引用其官网的说法”cfengine是一种 UNIX 管理工具,其目的是使简单的管理的任务自动化,使困难的任务变得较容易。
它的目标是使系统从任何状态收敛到一种理想状态。依照它的作者 Mark Burgess 所说,cfengine 总是使您的系统更接近于您所定义的配置; 它决不会使系统变得更糟。
比如说有少则几台多则成千上万台机器,现在需要临时的改变其一个配置,例如删掉某个帐号,停掉某个服务,一般我们只能不厌其烦的登到每一台机器上重复的完成这些动作,但是有了cfengine,一个命令就可以搞定了.
cfengine大概的功能有:
检查和配置网络接口
编辑系统和用户的文本文件
维护符号链接
检查和设置文件的权限
删除垃圾文件
检查重要文件和文件系统的存在
控制用户脚本和shell命令的执行
基于类的判定结构
进程管理

二、工作环境
主机名 操作系统 ip地址
centos1 centos 5 192.168.0.1(主服务器)
centos2 centos 5 192.168.0.115(客户机1)
centos3 centos 5 192.168.0.116(客户机2)
我这里测试用只用了两台机子,IP分别为192.168.0.1(服务器)192.168.0.2(客户机)

三、理论知识

(一)cfengine的程序结构及配置文件

Cfengine是一个用于设置和维护计算机系统的工具,包含了以下几个组件:

·cfagent 自动配置代理(必须),其配置文件为cfupdate.conf和 cfagent.conf
·cfservd 文件服务和远程xx服务(推荐),其配置文件为cfservd.conf
·cfexecd 计划和报告服务(建议)
·cfenvd 异常检测服务(强烈建议)
·cfrun 远程xxcfagent的方法(需要的时候用这个),其配置文件为cfrun.hosts
·cfshow 检查有帮助的数据库的内容的方法(辅助)
·cfenvgraph 异常检测服务cfenvd的附属工具(辅助)
·cfkey 密匙生成工具(每台主机运行一次)

(二)cfengine的工作方式
cfengine有两种工作方式:

a.服务器xx方式:这是一种集中控制的方式.(个人推荐此方式,便于集中控制和管理)

1)服务器上运行cfrun,cfrun会根据cfrun.hosts中的主机列表来连接到某个客户机的cfservd程序

2)客户机上cfservd调用本机的cfagent程序

3)客户机上cfagent程序执行update.conf,连接到中央机的cfservd复制下载策略文件cafagent.conf

4)客户机下载成功后执行{zx1}版本的策略文件,不成功就执行旧版本的.

注:update.conf的内容一般为一些非常简单的固定操作:下载策略文件,清理日志,重启服务,基本上这个文件创建好了之后就不会更改了.
在下载策略文件的时候如果下载成功,会将原策略文件改名,加上.cfsaved后缀

b.客户端自主xx方式:相比上一种要简单一些,客户机独立执行cfagent (可以是定期执行,例如加入cron中)。样的情况下,客户机就不需要有cfservd程序了。

四、配置过程

(一)下载安装

cfengine的文档里面都是采用源码安装的,经测试后发现源码安装经常会出现莫名奇妙的错误,而使用rpm包则是省时省力的方式。

装 cfengine 需要 openssl 和 Berkeley DB 这两个依赖性的包,所以在正式安装cfengine前,必须确认你的系统已经安装了db4, db4-devel,一般来说都是系统自带安装好的.然后就可以下载cfengine了。
安装也很简单,rpm –ivh cfengine-2.2.2-1.el5.rf.i386.rpm即可,接下来我们就要着手配置了。
RPM包下载地址如下(我这里是64位的系统)
http://dag.wieers.com/rpm/packages/cfengine/cfengine-2.2.2-1.el5.rf.x86_64.rpm
(二) 准备工作

在服务器和客户端将cfengine安装完成后,要做下面一些准备工作:

为了xx使用源码方便控制,将服务都禁用掉.

[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

//将原来的链接文件重命名
mv /var/cfengine/bin/cfagent /var/cfengine/bin/cfagent.link

//将cfengine的程序复制到bin目录下

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.1,为了简洁,文中会简称为1),centos2作为客户端,文中简称为115)

1.对服务器端(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.#授权访问的目录

根据上面的配置我做了相应的修改进行测试
#piao2010.com
control:
domain = ( piao2010.com )
AllowConnectionsFrom = ( 192.168.0.0/24 )
TrustKeysFrom = ( 192.168.0.0/24 )
AllowUsers = ( root )
MaxConnections = ( 150 )
MultipleConnections = ( true )
############################################
admit:
/home/masterfile 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下创建cfagent.conf
control:
actionsequence = ( shellcommands )
shellcommands:
“/bin/echo hello piao2010.com!”

3)测试

执行cfagent -v -n (如果不需要真正执行,可以加上-n参数)
运行xx正常,那么就可以将其复制到要发布的目录里面/masterfile/inputs
我这里测试的目录是/home/masterfile

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 = ( yahoo )
#policyhost = ( my_policy_host )
policyhost = ( 192.168.0.1 )#策略主机
master_cfinput = ( /home/masterfile/inputs )
workdir = ( /var/cfengine )
copy:
#定义copy的动作,从服务端的master_cfinput目录下把文件拷贝到local的inputs文件夹下
$(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

根据上面的配置我做了相应的修改进行测试
#piao2010.com
control:
actionsequence = ( copy processes tidy )
domain = ( piao2010.com )
policyhost = ( 192.168.0.1 )
master_dir = ( /home/masterfile )
workdir = ( /var/cfengine )
copy:
$(master_dir)/inputs dest=$(workdir)/inputs
r=inf
mode=600
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
2)测试运行

为了安全我们一般使用cfagent -v –n ,带上了-n参数的意思是只是测试,而不会真的执行.

可以看到已经成功的下载了cfagent.conf文件,并成功运行了

查看这个目录ls /var/cfengine/inputs 确实已经有了cfagent.conf

如果我们立刻再执行一次cfagent –v ,会发现输出有这么一句

cfengine:centos2: Nothing promised for [shellcommand./bin/echo hello piao2010.com!] (0/1 minutes elapsed)

这句话的意思是这个配置没超过1分钟就执行过,执行的频率太快,cfengine这次是不会执行的。

如果对服务器上的配置文件cfagent.conf做了修改,例如
shellcommands:
“/bin/echo hi www.piao2010.com”
然后在客户机上执行cfagent –v输出确实是多了www,不过细心的你会发现inputs目录下多了个文件
cfagent.conf.cfsaved

也就是说当cfagent成功下载了{zx1}版本的配置文件后,会将原来的做个备份.

3.设为开机启动

{zh1}我们需要做的就是将cfengine的程序设为自动启动。客户机和服务器上

#vi /etc/rc.d/rc.local //加上下面这两行
/var/cfengine/bin/cfservd
/var/cfengine/bin/cfenvd –H
然后让cfagent定期执行,也就是定期到服务器上去下载{zx1}的配置文件来执行。运行

#crontab -e

加上下面这句话
0,15,30,45 * * * * /var/cfengine/bin/cfexecd -F

4.排错:

1).原来我想的是本地子网没有域名,以为用ip就够了,就没有给出domain,在客户端运行cfagent –v输出如下
*********************************************************************
Update Sched: copy pass 1 @ Thu Nov 1 21:52:20 2007
*********************************************************************
Checking copy from 192.168.0.1:/masterfiles/inputs to /var/cfengine/inputs
Connect to 192.168.0.1 = 192.168.0.1 on port 5308
cfengine:centos2: Undefined domain name
cfengine:centos2: Id-authentication for centos2.undefined.domain failed
cfengine:centos2: Unable to establish connection with 192.168.0.1 (failover)
Saving the setuid log in /var/cfengine/cfagent.centos2.log
可以看到连接是失败的.因为cfservd要求连接上来的机器必须有DNS记录.

2)如果设置了domain,但是在/etc/hosts中没有连接的客户机的记录的话(也就是说只是在配置文件里面定义了域,而实际查不到dns记录)那么会有下面的错误
*********************************************************************
Update Sched: copy pass 1 @ Thu Nov 1 22:49:42 2007
*********************************************************************
Checking copy from 192.168.0.1:/masterfiles/inputs to /var/cfengine/inputs
Connect to 192.168.0.1 = 192.168.0.1 on port 5308
Loaded /var/cfengine/ppkeys/root-192.168.0.1.pub
………………………………………………………
cfengine:centos2: Strong authentication of server=192.168.0.1 connection confirmed
cfengine:centos2: Server returned error: Host authentication failed. Did you forget the domain name or IP/DNS address registration (for ipv4 or ipv6)?
cfengine:centos2: Can’t stat /masterfiles/inputs in copy
Saving the setuid log in /var/cfengine/cfagent.centos2.log
另外在cfservd.conf和update.conf中,服务器上用于拷贝的目录路径必须正确,否则也会报这个错误的我这里是:/masterfiles/inputs
/home/masterfiles/inputs

5.新加入一台客户机(因为测试只有一台客户端,这部分可以跳过了)

现在新加入一台客户端机器名centos3 ip 地址 192.168.0.116;

在它上面安装好cfengine,好准备工作:禁用服务,拷贝程序;

要让它能连上服务器的cfservd,那么必须在服务器上添加它的dns记录,在服务器上

#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
192.168.0.116 centos3.yahoon.org 加上粗体的这行.
然后从centos2上拷贝update.conf到新客户端上,当然是使用sftp是最快的

先切换到inputs目录下

cd /var/cfengine/inputs

运行sftp
sftp 192.168.0.115
Connecting to 192.168.0.115…
The authenticity of host ‘192.168.0.115 (192.168.0.115)’ can’t be established.
RSA key fingerprint is 62:ef:31:0b:ee:89:74:f8:94:4d:ec:11:ee:fa:18:79.
Are you sure you want to continue connecting (yes/no)? yes
Warning: Permanently added ‘192.168.0.115′ (RSA) to the list of known hosts.
root@192.168.0.115’s password: 输入115的密码
sftp> cd /var/cfengine/inputs
sftp> dir
cfagent.conf cfagent.conf.cfsaved cfservd.conf update.conf
sftp> get update.conf
Fetching /var/cfengine/inputs/update.conf to update.conf
/var/cfengine/inputs/update.conf {bfb} 774 0.8KB/s 00:00
sftp> bye
现在就可以测试运行了

[root@centos3 inputs]# cfagent -v -n

输出报错
Checking copy from 192.168.0.1:/masterfile/inputs to /var/cfengine/inputs
Connect to 192.168.0.1 = 192.168.0.1 on port 5308
cfengine:centos3: BAD: keys did not match
cfengine:centos3: Authentication dialogue with 192.168.0.1 failed
cfengine:centos3: Unable to establish connection with 192.168.0.1 (failover)
看来是key的问题, 从服务器和客户端上删掉相关的公钥文件(/var/cfengine/ppkeys目录下)

服务器上删掉root-192.168.0.116.pub
客户端上删掉root-192.168.0.1.pub

重新执行cfagent –v –n
Checking copy from 192.168.0.1:/masterfile/inputs to /var/cfengine/inputs
Connect to 192.168.0.1 = 192.168.0.1 on port 5308
cfengine:centos3: Trusting server identity and willing to accept key from 192.168.0.1=192.168.0.1
Saving public key /var/cfengine/ppkeys/root-192.168.0.1.pub
cfengine:centos3: /var/cfengine/inputs/cfagent.conf wasn’t at destination (copying)
cfengine:centos3: Copying from 192.168.0.1:/masterfile/inputs/cfagent.conf
cfengine:centos3: Object /var/cfengine/inputs/cfagent.conf had permission 600, changed it to 700
cfengine:centos3: Object /var/cfengine/inputs had permission 755, changed it to 700
Performance(Copy(192.168.0.1:/masterfile/inputs > /var/cfengine/inputs)): time=0.4462 secs, av=0.4462 +/- 0.0316
Saving the setuid log in /var/cfengine/cfagent.centos3.log
运行成功!

接下来的工作就又很简单了,加入启动项,加入crontab等.

从加入第二台机器的排错过程,我们可以看到,在cfservd建立连接的时候,有一个交换key的过程

一般在安装好了后在/var/ppkey的目录下已经有了localhost.priv和localhost.pub

上面所说的客户端115连到服务器1的过程就是:

115将自己的localhost.pub给1,
1将其改名为root-192.168.0.115.pub;
同样:1将自己的localhost.pub给115,
115将其改名为root-192.168.0.1.pub

不信的话可以查看115上的localhost.pub与1上的root-192.168.0.115.pub,内容是一样的。

小结:

要跟cfservd建立连接需要两个过程:首先是交换和验证公钥(如果是{dy}次连接没有对方的公钥就要交换,以后的连接就只需要验证就可以了),然后是服务器对客户机做DNS反向查询(文档里面说的是两次)

(四)工作方式一(强烈推荐)

在完成了对工作方式二的配置之后,它的基础上我们来配置工作方式一,这种工作方式是由服务器运行cfrun连接远程客户端的cfservd,xx远程主机的cfagent程序。相比第二种方式而言,这种做法实现了集中控制.
例如现在有个配置需要立刻更改,而现在还没到客户端定时运行的时间,如果我们一台台的登录到客户机来执行cfagent,显然是十分麻烦的,而且很费时间。有了cfrun就可以在中央机上对所有的客户发出指令让他们立即运行cfagent。

1.配置客户机上的cfservd.conf

在之前的update.conf里面,我们可以看到我们已经在远程客户端上开启了cfservd进程.只是并没有为它们写配置文件,要做也其实很简单,将服务器的cfservd.conf复制过来,然后做适当修改就可以了
# cfservd.conf
# yahoon 2007.11.1
control:
cfrunCommand = ( “/var/cfengine/bin/cfagent” ) #只需要加入这一句就可以了
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.

根据上面的配置我做了相应的修改进行测试

#piao2010.com
control:
cfrunCommand = ( “/var/cfengine/bin/cfagent” )
domain = (piao2010.com )
AllowConnectionsFrom = ( 192.168.0.0/24 )
TrustKeysFrom = ( 192.168.0.0/24 )
AllowUsers = ( root )
MaxConnections = ( 150 )
MultipleConnections = ( true )
############################################
admit:
/home/masterfile/inputs 192.168.0.
/var/cfengine 192.168.0.

然后重启客户机的cfservd进程

2.编辑服务器上的cfrun.hosts客户端列表

在服务器上写配置文件cfrun.host,只需要把客户机的ip加进去,这里我们先只把115加进去
domain=piao2010.com #设置域
access=root #设置需要访问的用户
# This is the host list for cfrun
192.168.0.2
#经测试用主机名也是可行的

3.在服务器上运行cfrun

现在就可以在服务器上运行cfrun –v

按照115的方法将另外一台客户机116也配置好,并加入到cfrun.hosts文件里面,同样执行cfrun –v就可以看到两台主机都运行了.

4.注意:

1)cfrun是读取cfrun.hosts里面的主机列表,一个主机完成之后再连接下一台主机

2)如果现在有多台主机,我现在有紧急情况要运行其中一台的cfagent,例如115这台机,当然你可以ssh到这台主机上直接执行cfagent –v,但是有了cfrun,你只需要在服务器上执行cfrun 192.168.0.115 –v,注意输出的{dy}行显示Skipping host 192.168.0.116,很明显,它会跳过116来执行。

3)如果客户机的cfservd.conf从服务器拷贝过来后未增加cfrunCommand = ( “/var/cfengine/bin/cfagent” ),那么在服务器执行cfrun –v的时候会报错,同样以115为例,那么cfrun –v的输出会有:
Loaded /var/cfengine/ppkeys/root-192.168.0.115.pub
………………………………………………………
cfrun:yahoon.org: Strong authentication of server=192.168.0.115 connection confirmed
192.168.0.115 replies..
Host authentication failed. Did you forget the domain name or IP/DNS address registration (for ipv4 or ipv6)?cfrun:yahoon.org: Couldn’t recv
cfrun:yahoon.org: recv
Connection with 192.168.0.115 completed

五、小结

1、通过客户机本身的cfexecd 和 服务器的cfrun如果是同时执行cfagent会不会出现冲突?答案是不会,cfengine有很好的锁的机制来避免这种情况的发生.通常来说,客户机定时执行cfexecd来单独xx自己的cfagent和服务器执行cfrun集中xx客户机这两种方式在实际中都会使用,只是场合不同:

定时执行:作为客户机的一种例行的工作安排进行设置,属于日常任务。

集中执行:一般用于特殊情况,要临时xx某些或者所有的客户机执行cfagent,例如临时更改某个主机的配置等。

2、cfengine本身并没有客户机服务器的严格区分,每一台主机同时可以是服务器,也可以当作客户机.这与windows域的概念有些相似,只要客户端上安装了域管理工具,就可以进行域管理的工作.cfengine也是这种概念.当然,一般来讲方便于集中控制,我们会选定一台机作为服务器,例如本文的centos1,其余的机都用作客户机。

3、cfengine的日志系统:cfengine 的日志是相当丰富的,例如在centos1上,在/var/cfengine目录里面cfengine.centos1.runlog,这是cfagent进程的运行日志
cfengine.localhost.runlog这是cfenvd进程的日志.
特别注意的是outputs这个目录下面,有很多文件,每次cfexecd运行一次,就会写入一个文件,文件的内容就是cfagent执行的结果.
outputs这个目录包括下面的文件都是由cfexecd程序所产生的。

4、 inputs outputs 目录,这两个目录十分容易搞混,上面已经说了 outputs 目录的作用,inputs相对而言就重要得多,它是 cfengine 默认的当前有效配置文件所在的目录.我们之前创建的 *.conf 之类的文件都是在这个目录下。

5、cfengine 的所有程序都带有-v参数,用于详细的输出,这对我们排错调试带来了很大方便.而且对于cfagent程序,-n参数是十分有用的.对于一个刚刚建立的策略文件直接执行是十分危险的,-n参数是模拟执行,所以带上它来运行cfagent就给我们带来很大的安全性,特别是调试的时候.所以首先应该使用

cfagent –n –v

六、应用

个人总结如下
针对不同应用的服务器编写一份update.conf文件,控制COPY的源目录和目标目录即可。另外cfagent.conf可以引入一个脚本文件(必须以{jd1}路径的方式引入),针对不同应用进行不同的操作。
优点:在一台服务器上实现对各种应用的同步更新,既可以定时更新也可以即时更新。
缺点:需要每台服务器安装配置cfengine服务。

参考资料
http://www.wenzizone.cn/?cat=24
http://os.51cto.com/art/200711/60043.htm

相关日志

Leave a Reply


郑重声明:资讯 【cfengine自动化管理的相关配置| 飘零的代码piao2010 's blog】由 发布,版权归原作者及其所在单位,其原创性以及文中陈述文字和内容未经(企业库qiyeku.com)证实,请读者仅作参考,并请自行核实相关内容。若本文有侵犯到您的版权, 请你提供相关证明及申请并与我们联系(qiyeku # qq.com)或【在线投诉】,我们审核后将会尽快处理。
—— 相关资讯 ——