cfengine是一个自动化、集中化管理系统工具,它的宗旨是“让你的系统始终运行在你想要的模式下”。它实现的思想就是制定一些策略,让系统定时运行一个进程,去检查系统当前的状态与策略的要求是否一致,不一致的话,就按策略要求去执行一遍。而这种策略可以在本地定制,也可以在中心策略服务器配置,然后通知客户端去更新策略并执行策略。当你所管理的服务器成一定规模时,使用这个工具,将大大提高工作效率,我也是最近才了解这个工具,在花了几天时间的研究后,才大概有些了解,因此记录下来,避免日久遗忘。如果想了解更多的cfengine具体介绍,请自行搜索。
1、cfengine的安装
cfengine可以单机独立运行,也可以建一台中心策略服务器,通过它去分发或让客户机定时去更新自己本地的承诺(策略),从而实现集中化管理。
cfengine的官方网站http://cfengine.com/(国内好像打不开),目前的最新版本是3.5,所以本文是基于3.5写的。本人的服务器是64位的centos6.4
我们可以直接安装rpm包,也可以基于源代码去编译再安装,结果好像没什么什么差别,但在安装前,为避免过程中出错,我们需要先安装相关的依赖库
1.1安装库以下:
#yum install openssl openssl-devel db4 db4-devel flex pcre pcre-devel openldap gcc -y
#rpm -ivh cfengine-community-3.5.1-3.x86_64.rpm
1.2可以使用# git clone git://github.com/cfengine/core.git 安装最新版
1.3 如果是下载源文件的,可以这样
tar zxvf cfengine-3.5.1.tar.gz
$ cd cfengine-3.3.0
$ ./configure
$ make
$ make install
对于旧版本,要运行以下命令生成cf-key,用来与服务器端通信认证用,
# /var/cfengine/bin/cf-key
Making a key pair for cfengine, please wait, this could take a minute...
但3.5版安装rpm版的,会自动生成cf-key,因此不需要执行此步
# /var/cfengine/bin/cf-key
A key file already exists at /var/cfengine/ppkeys/localhost.pub
2、cfengine的组件及目录结构
cfengine默认会安装到/var/cfengine目录下,同时,在/usr/local/sbin下,也会生成一份可执行的文件,但我们平时只需要在/var/cfengine目录下工作即可,可以忽略/usr/local/sbin下的内容。因为在/var/cfengine/bin目录已经包含了这些组件。现在根据我的理解简单说一下这些组件的作用
*注意,在cfengine的概念了,“承诺”是很重要的概念,我这里把它当作是“策略”
cf-agent : 它负责去执行承诺(策略)文件里的具体内容,这些策略文件是位于/var/cfengine/inputs/目录下的,但这个目录其实只是个缓存目录,真正的目录是在/var/cfengine/masterfiles/这个目录里,我们修改策略只需要这个目录修复即可,cf-agent在不带参数运行时,默认是使用这个目录下的/var/cfengine/masterfiles/promises.cf这个策略文件,我们也可以使用“cf-agent -f policesfilename"来指定运行特定策略。
cf-execd:它是个Daemon后台常驻进程,它会周期性启动cf-agent这个程序,默认是5分钟,我们可以在/var/cfengine/masterfiles/controls/cf_execd.cf修改时间间隔。
cf-serverd:它也是个Daemon, 中心服务器就是通过它来分发策略及数据文件,当需要集中发管理时,服务器端及客户机都需要运行这个进程,它默认是使用到TCP5308端口,所以确保的iptables里开了这个端口。它的两个功能:一、充当文件服务器角色,让远程客户机从这里下载文件;二、允许远程已经授权的cf-runagent去启动本机的cf-agent进程和基于角色访问控制设置一些额外的类
cf-monitord - 负责系统信息的统计。
cf-promises :在cf-agent启动前,会自己激活cf-promises这个进程,它负责检查策略文件的语法,也可以直接用它来检查策略文件。
cf-runagent :在中心服务器上,我们运行cf-runagent去通知远程的客户机运行cf-agent,这样,就不用去等待那默认5分钟的间隔,但要注意,一分钟内只允许运行一次。
cf-report :它用来生成一些报告内容Agent: Extracts and presents report data in HTML,XML or graph formats
cf-know :这个我还没有搞清楚。等以后再补充。
3、启动cfengine
在安装完后,会自己加入系统自动启动里,我们查看一下:
[root@test ~]# chkconfig | grep cf
cfengine3 0:off 1:off 2:on 3:on 4:on 5:on 6:off
如果直接运行”service cfengine3 start“ 会提示找到到策略文件
[root@bbsweb ~]# service cfengine3 start
Policy is not found in /var/cfengine/inputs, not starting CFEngine.
在这里,我们还需要对cfengine进行一次bootstrap引导。bootstrap需要一个策略中心服务器,可以用自己本机的IP(但不可以用127.0.0.1),也可以指向一台已经配置好的策略服务器IP,命令以下(192.168.11.189是本机的地址)
[root@test ~]# /var/cfengine/bin/cf-agent --bootstrap --policy-server 192.168.11.189
2013-07-31T12:15:31+0800 warning: Deprecated bootstrap options detected. The --policy-server (-s) option is deprecated from CFEngine community version 3.5.0.Please provide the address argument to --bootstrap (-B) instead. Rewriting your arguments now, but you need to adjust them as this support will be removed soon.
2013-07-31T12:15:39+0800 notice: Q: "...f-serverd"": 2013-07-31T12:15:39+0800 notice: Server is starting...
2013-07-31T12:15:39+0800 notice: R: This host assumes the role of policy server
2013-07-31T12:15:39+0800 notice: R: Updated local policy from policy server
2013-07-31T12:15:39+0800 notice: R: Started the server
2013-07-31T12:15:39+0800 notice: R: Started the scheduler
2013-07-31T12:15:39+0800 notice: Bootstrap to '192.168.11.189' completed successfully!
[root@test ~]# ps auxf|grep cf-
root 26060 0.0 0.0 103236 856 pts/0 S+ 12:17 0:00 \_ grep cf-
root 25969 0.1 0.0 33836 2664 ? Ss 12:15 0:00 /var/cfengine/bin/cf-execd
root 25976 0.1 0.0 33896 2384 ? Ss 12:15 0:00 /var/cfengine/bin/cf-serverd
[root@test ~]# ls /var/cfengine/inputs/ #这里,cfengine会将/var/cfengine/masterfiles里的策略复制到inputs目录里
cf-sketch-runfile.cf controls def.cf failsafe.cf lib libraries promises.cf services update.cf
这里,服务进程已经启动了,因为我之前已经配置好一中心服务器(192.168.11.1),我可以重新将--policy-server指向这台服务器
[root@test ~]# service cfengine stop
cfengine: unrecognized service
[root@test ~]# service cfengine3 stop
Shutting down cf-execd: [ OK ]
Shutting down cf-serverd: [ OK ]
Shutting down cf-monitord: [FAILED] #因为这个还没有启动
[root@test ~]# ps auxf|grep cf-
root 26269 0.0 0.0 103236 856 pts/0 S+ 12:21 0:00 \_ grep cf-
[root@test ~]# /var/cfengine/bin/cf-agent --bootstrap --policy-server 192.168.11.1
2013-07-31T12:21:13+0800 warning: Deprecated bootstrap options detected. The --policy-server (-s) option is deprecated from CFEngine community version 3.5.0.Please provide the address argument to --bootstrap (-B) instead. Rewriting your arguments now, but you need to adjust them as this support will be removed soon.
2013-07-31T12:21:14+0800 notice: R: This autonomous node assumes the role of voluntary client
2013-07-31T12:21:14+0800 notice: R: Updated local policy from policy server
2013-07-31T12:21:14+0800 notice: R: Started the scheduler
2013-07-31T12:21:14+0800 notice: Bootstrap to '192.168.11.1' completed successfully!
[root@test ~]# ps auxf|grep cf-
root 1158 0.0 0.0 103236 856 pts/0 S+ 15:02 0:00 \_ grep cf-
root 26280 0.0 0.0 101424 3300 ? Ss 12:21 0:09 /var/cfengine/bin/cf-execd
root 26490 0.2 0.0 34000 3276 ? Ss 12:26 0:19 /var/cfengine/bin/cf-serverd
root 26493 0.0 0.0 34272 3592 ? Ss 12:26 0:05 /var/cfengine/bin/cf-monitord
这样,这台机就可以定时向服务器端下载策略了并执行了。其实,在客户端与服务器之间还有些访问控制的,在服务器端需设置允许的IP。这些以后再说明。下面说一下,在单机本地制定一个简单的策略。
新建 一个/var/cfengine/inputs/test.cf ,输入蓝色字体的内容,保存后,执行cf-agent,
[root@test~]# more /var/cfengine/inputs/test.cf
body common control
{
bundlesequence => {"test"};
}
bundle agent test
{
files:
"/home/testfile"
comment => "This is for keeps...",
create => "true",
perms => p("612");
}
body perms p(x)
{
mode => "$(x)";
}
[root@test ~]# /var/cfengine/bin/cf-agent /var/cfengine/inputs/test.cf
[root@test ~]# ls /home/testfile -l
-rw---x-w- 1 root root 0 Jul 31 15:15 /home/testfile
我们可以见到,在/home目录下,生成了一个名为testfile的文件,并对文件进行了属性设置。直接指定特定策略文件只运行一次,而不会定时去再次执行。尽管上面策略没什么具体的意义,但它包括了策略的基本结构及功能,"body common control"是每个策略里有且仅有的,就像c语言的main()函数一样,bundlesequence列出了将要执行的agent及顺序。而bundle agent就像是子函数或子程序,可以有多个,它里面的内容为具体要做的内容。在bundlesequence=>{}里列出的才执行。 cfengine本身遵循自己语法及有着丰富的类,目前我还没有研究透,后续会补上。